#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" SOURCE_DIR="$REPO_ROOT/out/linux/bin" OUTPUT_DIR="$REPO_ROOT/dist/UpdateClientSDK-linux" ARCHIVE_FILE="$REPO_ROOT/dist/UpdateClientSDK-linux.tar.gz" SDK_VERSION="0.1.0" EXAMPLE_CONFIG="$REPO_ROOT/config/app_config.linux.example.json" INCLUDE_DEMO_MAIN_APP=0 usage() { cat <<'EOF' Usage: package-sdk.sh [options] Options: --source-dir DIR Linux Release output directory. Default: ./out/linux/bin --output-dir DIR SDK directory to generate. Default: ./dist/UpdateClientSDK-linux --archive FILE SDK tar.gz path. Default: ./dist/UpdateClientSDK-linux.tar.gz --sdk-version VERSION SDK version. Default: 0.1.0 --example-config FILE app_config template. Default: ./config/app_config.linux.example.json --include-demo-mainapp Include MainApp demo executable in SDK bin. -h, --help Show this help. EOF } while [[ $# -gt 0 ]]; do case "$1" in --source-dir) SOURCE_DIR="$2"; shift 2 ;; --output-dir) OUTPUT_DIR="$2"; shift 2 ;; --archive|--tar-file|--zip-file) ARCHIVE_FILE="$2"; shift 2 ;; --sdk-version) SDK_VERSION="$2"; shift 2 ;; --example-config) EXAMPLE_CONFIG="$2"; shift 2 ;; --include-demo-mainapp) INCLUDE_DEMO_MAIN_APP=1; shift ;; -h|--help) usage; exit 0 ;; *) echo "Unknown option: $1" >&2; usage >&2; exit 2 ;; esac done SOURCE_DIR="$(realpath "$SOURCE_DIR")" EXAMPLE_CONFIG="$(realpath "$EXAMPLE_CONFIG")" OUTPUT_DIR="$(realpath -m "$OUTPUT_DIR")" ARCHIVE_FILE="$(realpath -m "$ARCHIVE_FILE")" for name in Launcher Updater Bootstrap; do if [[ ! -f "$SOURCE_DIR/$name" ]]; then echo "SDK source directory is missing required file: $SOURCE_DIR/$name" >&2 exit 1 fi done PUBLIC_KEY="" for candidate in \ "$SOURCE_DIR/config/manifest_public_key.pem" \ "$SOURCE_DIR/manifest_public_key.pem" \ "$REPO_ROOT/config/manifest_public_key.pem"; do if [[ -f "$candidate" ]]; then PUBLIC_KEY="$candidate" break fi done if [[ -z "$PUBLIC_KEY" ]]; then echo "manifest_public_key.pem is missing. Prepare the public key that matches the server signing private key." >&2 exit 1 fi DEBUG_ARTIFACT="$(find "$SOURCE_DIR" -type f \( -name '*.pdb' -o -name '*.ilk' -o -name '*d.dll' \) -print -quit)" if [[ -n "$DEBUG_ARTIFACT" ]]; then echo "SDK source directory contains Debug artifacts. Use a clean Release output directory." >&2 echo "Example: $DEBUG_ARTIFACT" >&2 exit 1 fi rm -rf "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR/bin" "$OUTPUT_DIR/config" "$OUTPUT_DIR/scripts" "$OUTPUT_DIR/Common" shopt -s dotglob nullglob for item in "$SOURCE_DIR"/*; do base="$(basename "$item")" case "$base" in config|update|update_temp|manifest_public_key.pem|MainApp) if [[ "$base" == "MainApp" && "$INCLUDE_DEMO_MAIN_APP" -eq 1 ]]; then cp -a "$item" "$OUTPUT_DIR/bin/" fi ;; *) cp -a "$item" "$OUTPUT_DIR/bin/" ;; esac done shopt -u dotglob nullglob cp "$EXAMPLE_CONFIG" "$OUTPUT_DIR/config/app_config.json" cp "$PUBLIC_KEY" "$OUTPUT_DIR/config/manifest_public_key.pem" cp "$REPO_ROOT/config/server_config.json" "$OUTPUT_DIR/config/server_config.json" cp "$REPO_ROOT/config/server_config.qrc" "$OUTPUT_DIR/config/server_config.qrc" for common_file in ConfigHelper.h ConfigHelper.cpp TicketHelper.h TicketHelper.cpp; do common_path="$REPO_ROOT/Common/$common_file" if [[ ! -f "$common_path" ]]; then echo "SDK Common integration source is missing: $common_path" >&2 exit 1 fi cp "$common_path" "$OUTPUT_DIR/Common/$common_file" done WORD_GUIDE="$(find "$REPO_ROOT" "$REPO_ROOT/Docs" -maxdepth 1 -type f -name '*SDK*.docx' ! -name '~$*' 2>/dev/null | sort | sed -n '1p')" if [[ -z "$WORD_GUIDE" ]]; then echo "SDK integration Word guide is missing. Expected a *SDK*.docx file in the repository root or Docs directory." >&2 exit 1 fi cp "$WORD_GUIDE" "$OUTPUT_DIR/$(basename "$WORD_GUIDE")" cp "$SCRIPT_DIR/package-sdk.sh" "$OUTPUT_DIR/scripts/package-sdk.sh" cp "$SCRIPT_DIR/package-client.sh" "$OUTPUT_DIR/scripts/package-client.sh" if [[ -f "$SCRIPT_DIR/install-sdk.ps1" ]]; then cp "$SCRIPT_DIR/install-sdk.ps1" "$OUTPUT_DIR/scripts/install-sdk.ps1"; fi if [[ -f "$SCRIPT_DIR/package-sdk.ps1" ]]; then cp "$SCRIPT_DIR/package-sdk.ps1" "$OUTPUT_DIR/scripts/package-sdk.ps1"; fi if [[ -f "$SCRIPT_DIR/package-client.ps1" ]]; then cp "$SCRIPT_DIR/package-client.ps1" "$OUTPUT_DIR/scripts/package-client.ps1"; fi chmod +x "$OUTPUT_DIR/bin/Launcher" "$OUTPUT_DIR/bin/Updater" "$OUTPUT_DIR/bin/Bootstrap" 2>/dev/null || true chmod +x "$OUTPUT_DIR/scripts/package-sdk.sh" "$OUTPUT_DIR/scripts/package-client.sh" cat > "$OUTPUT_DIR/sdk_manifest.json" <