ci: build Windows release package
Some checks failed
Build Windows Release / build-windows (push) Has been cancelled
Some checks failed
Build Windows Release / build-windows (push) Has been cancelled
This commit is contained in:
@@ -1,96 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
ENV_DIR="$ROOT_DIR/tools/linux-build-env"
|
||||
BUILD_DIR="$ROOT_DIR/build-linux"
|
||||
DIST_DIR="$ROOT_DIR/dist-linux"
|
||||
PACKAGE_ROOT="$DIST_DIR/chengnan-linux-x86_64"
|
||||
APP_BIN="$PACKAGE_ROOT/bin/chengnan"
|
||||
LIB_DIR="$PACKAGE_ROOT/lib"
|
||||
PLUGIN_DIR="$PACKAGE_ROOT/plugins"
|
||||
QT_CONF="$PACKAGE_ROOT/bin/qt.conf"
|
||||
ARCHIVE="$DIST_DIR/chengnan-linux-x86_64.tar.gz"
|
||||
|
||||
"$ROOT_DIR/scripts/build-linux-binary.sh"
|
||||
|
||||
rm -rf "$PACKAGE_ROOT" "$ARCHIVE"
|
||||
mkdir -p "$PACKAGE_ROOT/bin" "$LIB_DIR" "$PLUGIN_DIR"
|
||||
|
||||
"$ENV_DIR/bin/cmake" --install "$BUILD_DIR" --prefix "$PACKAGE_ROOT"
|
||||
|
||||
if [[ ! -x "$APP_BIN" ]]; then
|
||||
echo "[package] 未找到可执行文件:$APP_BIN" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
copy_lib() {
|
||||
local lib="$1"
|
||||
if [[ -f "$lib" ]]; then
|
||||
cp -L -n "$lib" "$LIB_DIR/"
|
||||
fi
|
||||
}
|
||||
|
||||
# 只打包项目内二进制环境中的依赖,避免把系统 /lib、/usr/lib 复制进制品。
|
||||
while IFS= read -r lib; do
|
||||
case "$lib" in
|
||||
"$ENV_DIR"/*) copy_lib "$lib" ;;
|
||||
esac
|
||||
done < <(LD_LIBRARY_PATH="$ENV_DIR/lib:${LD_LIBRARY_PATH:-}" ldd "$APP_BIN" | awk '/=>/ {print $3}' | sort -u)
|
||||
|
||||
# Qt GUI 程序运行需要平台插件;同时带上常用图片格式插件,保证 jpg/png 等格式可打开。
|
||||
for subdir in platforms imageformats xcbglintegrations platformthemes styles iconengines; do
|
||||
if [[ -d "$ENV_DIR/plugins/$subdir" ]]; then
|
||||
mkdir -p "$PLUGIN_DIR/$subdir"
|
||||
cp -L "$ENV_DIR/plugins/$subdir"/*.so "$PLUGIN_DIR/$subdir/" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
|
||||
# 平台插件自身还有二级依赖,继续收集项目内环境中的 .so。
|
||||
if [[ -d "$PLUGIN_DIR" ]]; then
|
||||
while IFS= read -r plugin; do
|
||||
while IFS= read -r lib; do
|
||||
case "$lib" in
|
||||
"$ENV_DIR"/*) copy_lib "$lib" ;;
|
||||
esac
|
||||
done < <(LD_LIBRARY_PATH="$ENV_DIR/lib:$LIB_DIR:${LD_LIBRARY_PATH:-}" ldd "$plugin" | awk '/=>/ {print $3}' | sort -u || true)
|
||||
done < <(find "$PLUGIN_DIR" -type f -name '*.so' | sort)
|
||||
fi
|
||||
|
||||
cat > "$QT_CONF" <<'QTCFG'
|
||||
[Paths]
|
||||
Plugins = ../plugins
|
||||
QTCFG
|
||||
|
||||
cat > "$PACKAGE_ROOT/run-chengnan.sh" <<'RUNNER'
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
export LD_LIBRARY_PATH="$APP_DIR/lib:${LD_LIBRARY_PATH:-}"
|
||||
export QT_PLUGIN_PATH="$APP_DIR/plugins"
|
||||
exec "$APP_DIR/bin/chengnan" "$@"
|
||||
RUNNER
|
||||
chmod +x "$PACKAGE_ROOT/run-chengnan.sh"
|
||||
|
||||
if command -v patchelf >/dev/null 2>&1; then
|
||||
patchelf --set-rpath '$ORIGIN/../lib' "$APP_BIN" || true
|
||||
elif [[ -x "$ENV_DIR/bin/patchelf" ]]; then
|
||||
"$ENV_DIR/bin/patchelf" --set-rpath '$ORIGIN/../lib' "$APP_BIN" || true
|
||||
else
|
||||
echo "[package] 未找到 patchelf,制品可通过 run-chengnan.sh 设置 LD_LIBRARY_PATH 运行。"
|
||||
fi
|
||||
|
||||
find "$PACKAGE_ROOT" -type f -name '*.so*' -exec chmod 0644 {} +
|
||||
chmod +x "$APP_BIN"
|
||||
|
||||
tar -C "$DIST_DIR" -czf "$ARCHIVE" "$(basename "$PACKAGE_ROOT")"
|
||||
|
||||
if [[ ! -s "$ARCHIVE" ]]; then
|
||||
echo "[package] 打包失败:$ARCHIVE 为空或不存在" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sha256sum "$ARCHIVE" > "$ARCHIVE.sha256"
|
||||
|
||||
echo "[package] 发布包:$ARCHIVE"
|
||||
echo "[package] 校验文件:$ARCHIVE.sha256"
|
||||
59
scripts/package-windows-release.ps1
Normal file
59
scripts/package-windows-release.ps1
Normal file
@@ -0,0 +1,59 @@
|
||||
param(
|
||||
[ValidateSet("msvc")]
|
||||
[string]$Toolchain = "msvc",
|
||||
[string]$BuildDir = "$PSScriptRoot\..\build-windows",
|
||||
[string]$DistDir = "$PSScriptRoot\..\dist-windows"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$ProjectRoot = Resolve-Path "$PSScriptRoot\.."
|
||||
$BuildDir = [System.IO.Path]::GetFullPath($BuildDir)
|
||||
$DistDir = [System.IO.Path]::GetFullPath($DistDir)
|
||||
$PackageName = "chengnan-windows-x86_64"
|
||||
$PackageDir = Join-Path $DistDir $PackageName
|
||||
$ZipPath = Join-Path $DistDir "$PackageName.zip"
|
||||
$HashPath = "$ZipPath.sha256"
|
||||
|
||||
Write-Host "[package] ProjectRoot: $ProjectRoot"
|
||||
Write-Host "[package] BuildDir: $BuildDir"
|
||||
Write-Host "[package] DistDir: $DistDir"
|
||||
|
||||
& "$ProjectRoot\docs\windows\build-windows.ps1" -Toolchain $Toolchain -BuildDir $BuildDir -Deploy
|
||||
|
||||
$DeployDir = Join-Path $BuildDir "deploy"
|
||||
$Exe = Join-Path $DeployDir "chengnan.exe"
|
||||
if (!(Test-Path $Exe)) {
|
||||
throw "未找到部署后的 Windows 可执行文件:$Exe"
|
||||
}
|
||||
|
||||
if (Test-Path $PackageDir) { Remove-Item -Recurse -Force $PackageDir }
|
||||
if (Test-Path $ZipPath) { Remove-Item -Force $ZipPath }
|
||||
if (Test-Path $HashPath) { Remove-Item -Force $HashPath }
|
||||
New-Item -ItemType Directory -Force -Path $DistDir | Out-Null
|
||||
Copy-Item -Recurse -Force $DeployDir $PackageDir
|
||||
|
||||
$ReadmePath = Join-Path $PackageDir "README.txt"
|
||||
@"
|
||||
chengnan Windows x86_64 发布包
|
||||
|
||||
运行方式:
|
||||
1. 解压整个目录。
|
||||
2. 双击 chengnan.exe 运行。
|
||||
|
||||
说明:
|
||||
- 本目录已包含 Qt 运行时和 OpenCV DLL。
|
||||
- 请不要只复制 chengnan.exe,需保留同目录 DLL 和 Qt plugins 子目录。
|
||||
"@ | Set-Content -Encoding UTF8 $ReadmePath
|
||||
|
||||
Compress-Archive -Path (Join-Path $PackageDir "*") -DestinationPath $ZipPath -Force
|
||||
|
||||
$Hash = Get-FileHash -Algorithm SHA256 $ZipPath
|
||||
"$($Hash.Hash.ToLower()) $(Split-Path -Leaf $ZipPath)" | Set-Content -Encoding ASCII $HashPath
|
||||
|
||||
if (!(Test-Path $ZipPath) -or ((Get-Item $ZipPath).Length -le 0)) {
|
||||
throw "发布包生成失败:$ZipPath"
|
||||
}
|
||||
|
||||
Write-Host "[package] 发布包:$ZipPath"
|
||||
Write-Host "[package] 校验文件:$HashPath"
|
||||
Reference in New Issue
Block a user