#!/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" INCLUDE_DEMO_MAIN_APP=0 INCLUDE_QT_RUNTIME=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 --include-demo-mainapp Include MainApp demo executable in SDK bin. --include-qt-runtime Include Qt runtime files from the Release output directory. -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 ;; --include-demo-mainapp) INCLUDE_DEMO_MAIN_APP=1; shift ;; --include-qt-runtime) INCLUDE_QT_RUNTIME=1; shift ;; -h|--help) usage; exit 0 ;; *) echo "Unknown option: $1" >&2; usage >&2; exit 2 ;; esac done SOURCE_DIR="$(realpath "$SOURCE_DIR")" 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 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" is_qt_runtime_item() { local base="$1" case "$base" in bearer|iconengines|imageformats|platforms|styles|translations) return 0 ;; libQt5*.so*|libEGL.so*|libGLESv2.so*|libqxcb.so*|libxcb*.so*|libstdc++.so*|libgcc_s.so*|libssl.so*|libcrypto.so*|opengl32sw.dll|d3dcompiler_47.dll) return 0 ;; *) return 1 ;; esac } 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 ;; *) if [[ "$INCLUDE_QT_RUNTIME" -eq 0 ]] && is_qt_runtime_item "$base"; then continue fi cp -a "$item" "$OUTPUT_DIR/bin/" ;; esac done shopt -u dotglob nullglob for common_file in ConfigHelper.h ConfigHelper.cpp IntegrityHelper.h IntegrityHelper.cpp TicketHelper.h TicketHelper.cpp UpdatePathPolicy.h UpdatePathPolicy.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 SDK_GUIDE_NAME="SIMCAE打包上传.md" SDK_GUIDE_SOURCE="$REPO_ROOT/$SDK_GUIDE_NAME" if [[ -f "$SDK_GUIDE_SOURCE" ]]; then cp "$SDK_GUIDE_SOURCE" "$OUTPUT_DIR/$SDK_GUIDE_NAME" else echo "SIMCAE packaging guide is missing: $SDK_GUIDE_SOURCE" >&2 exit 1 fi 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" <