2026-07-14 08:39:41 +00:00
|
|
|
#!/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"
|
2026-09-10 11:07:04 +08:00
|
|
|
OUTPUT_DIR="$REPO_ROOT/dist/UpdateClientSDK-linux"
|
|
|
|
|
ARCHIVE_FILE="$REPO_ROOT/dist/UpdateClientSDK-linux.tar.gz"
|
2026-07-14 08:39:41 +00:00
|
|
|
SDK_VERSION="0.1.0"
|
|
|
|
|
INCLUDE_DEMO_MAIN_APP=0
|
2026-09-08 17:08:58 +08:00
|
|
|
INCLUDE_QT_RUNTIME=0
|
2026-07-14 08:39:41 +00:00
|
|
|
|
|
|
|
|
usage() {
|
|
|
|
|
cat <<'EOF'
|
|
|
|
|
Usage: package-sdk.sh [options]
|
|
|
|
|
|
|
|
|
|
Options:
|
|
|
|
|
--source-dir DIR Linux Release output directory. Default: ./out/linux/bin
|
2026-09-10 11:07:04 +08:00
|
|
|
--output-dir DIR SDK directory to generate. Default: ./dist/UpdateClientSDK-linux
|
|
|
|
|
--archive FILE SDK tar.gz path. Default: ./dist/UpdateClientSDK-linux.tar.gz
|
2026-07-14 08:39:41 +00:00
|
|
|
--sdk-version VERSION SDK version. Default: 0.1.0
|
|
|
|
|
--include-demo-mainapp Include MainApp demo executable in SDK bin.
|
2026-09-08 17:08:58 +08:00
|
|
|
--include-qt-runtime Include Qt runtime files from the Release output directory.
|
2026-07-14 08:39:41 +00:00
|
|
|
-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 ;;
|
2026-09-08 17:08:58 +08:00
|
|
|
--include-qt-runtime) INCLUDE_QT_RUNTIME=1; shift ;;
|
2026-07-14 08:39:41 +00:00
|
|
|
-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"
|
2026-09-10 11:07:04 +08:00
|
|
|
mkdir -p "$OUTPUT_DIR/bin" "$OUTPUT_DIR/config" "$OUTPUT_DIR/scripts" "$OUTPUT_DIR/Common"
|
2026-07-14 08:39:41 +00:00
|
|
|
|
2026-09-08 17:08:58 +08:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2026-07-14 08:39:41 +00:00
|
|
|
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
|
|
|
|
|
;;
|
|
|
|
|
*)
|
2026-09-08 17:08:58 +08:00
|
|
|
if [[ "$INCLUDE_QT_RUNTIME" -eq 0 ]] && is_qt_runtime_item "$base"; then
|
|
|
|
|
continue
|
|
|
|
|
fi
|
2026-07-14 08:39:41 +00:00
|
|
|
cp -a "$item" "$OUTPUT_DIR/bin/"
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
shopt -u dotglob nullglob
|
|
|
|
|
|
2026-09-08 17:08:58 +08:00
|
|
|
for common_file in ConfigHelper.h ConfigHelper.cpp IntegrityHelper.h IntegrityHelper.cpp TicketHelper.h TicketHelper.cpp UpdatePathPolicy.h UpdatePathPolicy.cpp; do
|
2026-07-14 08:39:41 +00:00
|
|
|
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
|
|
|
|
|
|
2026-09-10 11:07:04 +08:00
|
|
|
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"
|
2026-07-16 08:14:51 +00:00
|
|
|
else
|
2026-09-10 11:07:04 +08:00
|
|
|
echo "SIMCAE packaging guide is missing: $SDK_GUIDE_SOURCE" >&2
|
|
|
|
|
exit 1
|
2026-07-14 08:39:41 +00:00
|
|
|
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" <<EOF
|
|
|
|
|
{
|
|
|
|
|
"sdk_version": "$SDK_VERSION",
|
|
|
|
|
"generated_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
|
|
|
"sdk_type": "external-updater-runtime",
|
|
|
|
|
"platform": "linux",
|
|
|
|
|
"required_entry": "Launcher",
|
|
|
|
|
"contains_demo_main_app": $([[ "$INCLUDE_DEMO_MAIN_APP" -eq 1 ]] && echo true || echo false),
|
2026-09-08 17:08:58 +08:00
|
|
|
"contains_qt_runtime": $([[ "$INCLUDE_QT_RUNTIME" -eq 1 ]] && echo true || echo false),
|
|
|
|
|
"contains_final_config": false,
|
2026-09-10 11:07:04 +08:00
|
|
|
"docs_entry": "$SDK_GUIDE_NAME",
|
|
|
|
|
"word_guide_included": false,
|
2026-07-14 08:39:41 +00:00
|
|
|
"integration_sources": [
|
|
|
|
|
"ConfigHelper.h",
|
|
|
|
|
"ConfigHelper.cpp",
|
2026-09-08 17:08:58 +08:00
|
|
|
"IntegrityHelper.h",
|
|
|
|
|
"IntegrityHelper.cpp",
|
2026-07-14 08:39:41 +00:00
|
|
|
"TicketHelper.h",
|
2026-09-08 17:08:58 +08:00
|
|
|
"TicketHelper.cpp",
|
|
|
|
|
"UpdatePathPolicy.h",
|
|
|
|
|
"UpdatePathPolicy.cpp"
|
2026-07-14 08:39:41 +00:00
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
EOF
|
|
|
|
|
|
|
|
|
|
mkdir -p "$(dirname "$ARCHIVE_FILE")"
|
|
|
|
|
rm -f "$ARCHIVE_FILE"
|
|
|
|
|
tar -C "$OUTPUT_DIR" -czf "$ARCHIVE_FILE" .
|
|
|
|
|
|
|
|
|
|
echo "SDK directory: $OUTPUT_DIR"
|
|
|
|
|
echo "SDK archive: $ARCHIVE_FILE"
|
|
|
|
|
echo "SDK version: $SDK_VERSION"
|