Some checks failed
Cross Build Windows Release on Linux / cross-build-windows (push) Failing after 1m43s
109 lines
3.6 KiB
YAML
109 lines
3.6 KiB
YAML
name: Build Windows Release
|
||
|
||
on:
|
||
workflow_dispatch:
|
||
|
||
jobs:
|
||
build-windows:
|
||
# Gitea Actions 使用自建 act_runner,不提供 GitHub 托管的 windows-latest。
|
||
# 这里匹配常见的 Windows Runner 标签;Runner 需注册为 windows 或 windows-latest 才会接单。
|
||
runs-on:
|
||
- windows
|
||
defaults:
|
||
run:
|
||
shell: msys2 {0}
|
||
|
||
steps:
|
||
- name: Checkout
|
||
uses: actions/checkout@v4
|
||
|
||
- name: Setup MSYS2 build environment
|
||
uses: msys2/setup-msys2@v2
|
||
with:
|
||
msystem: UCRT64
|
||
update: true
|
||
install: >-
|
||
git
|
||
zip
|
||
p7zip
|
||
mingw-w64-ucrt-x86_64-toolchain
|
||
mingw-w64-ucrt-x86_64-cmake
|
||
mingw-w64-ucrt-x86_64-ninja
|
||
mingw-w64-ucrt-x86_64-qt6-base
|
||
mingw-w64-ucrt-x86_64-opencv
|
||
|
||
- name: Configure
|
||
run: |
|
||
cmake -S . -B build-windows -G Ninja \
|
||
-DCMAKE_BUILD_TYPE=Release \
|
||
-DCMAKE_PREFIX_PATH=/ucrt64
|
||
|
||
- name: Build
|
||
run: |
|
||
cmake --build build-windows --parallel "$(nproc)"
|
||
|
||
- name: Package
|
||
run: |
|
||
set -euo pipefail
|
||
APP_NAME="chengnan"
|
||
PACKAGE_NAME="chengnan-windows-x86_64"
|
||
PACKAGE_DIR="dist-windows/${PACKAGE_NAME}"
|
||
EXE="build-windows/${APP_NAME}.exe"
|
||
|
||
test -f "$EXE"
|
||
rm -rf dist-windows
|
||
mkdir -p "$PACKAGE_DIR"
|
||
cp "$EXE" "$PACKAGE_DIR/"
|
||
|
||
# 部署 Qt 运行时和插件。
|
||
if command -v windeployqt >/dev/null 2>&1; then
|
||
windeployqt --release --no-translations "$PACKAGE_DIR/${APP_NAME}.exe"
|
||
elif command -v windeployqt6 >/dev/null 2>&1; then
|
||
windeployqt6 --release --no-translations "$PACKAGE_DIR/${APP_NAME}.exe"
|
||
else
|
||
echo "windeployqt not found" >&2
|
||
exit 1
|
||
fi
|
||
|
||
# 收集 MinGW/MSYS2/OpenCV 运行时 DLL。ldd 会列出 exe/dll 依赖;循环几轮收集二级依赖。
|
||
for round in 1 2 3; do
|
||
while IFS= read -r binary; do
|
||
while IFS= read -r dll; do
|
||
[ -f "$dll" ] || continue
|
||
cp -n "$dll" "$PACKAGE_DIR/" || true
|
||
done < <(ldd "$binary" \
|
||
| awk '/=> \/ucrt64\/bin\// {print $3} /^\/ucrt64\/bin\// {print $1}' \
|
||
| sort -u)
|
||
done < <(find "$PACKAGE_DIR" -maxdepth 2 -type f \( -name '*.exe' -o -name '*.dll' \) | sort)
|
||
done
|
||
|
||
cat > "$PACKAGE_DIR/README.txt" <<'EOF'
|
||
chengnan Windows x86_64 发布包
|
||
|
||
运行方式:
|
||
1. 解压整个目录。
|
||
2. 双击 chengnan.exe 运行。
|
||
|
||
说明:
|
||
- 本目录已包含 Qt、OpenCV 和 MinGW 运行时 DLL。
|
||
- 请不要只复制 chengnan.exe,需保留同目录 DLL 和 Qt plugins 子目录。
|
||
EOF
|
||
|
||
(cd dist-windows && 7z a -tzip "${PACKAGE_NAME}.zip" "${PACKAGE_NAME}" >/dev/null)
|
||
(cd dist-windows && sha256sum "${PACKAGE_NAME}.zip" > "${PACKAGE_NAME}.zip.sha256")
|
||
|
||
- name: Verify package
|
||
run: |
|
||
test -s dist-windows/chengnan-windows-x86_64.zip
|
||
sha256sum -c dist-windows/chengnan-windows-x86_64.zip.sha256
|
||
7z l dist-windows/chengnan-windows-x86_64.zip | grep 'chengnan.exe'
|
||
|
||
- name: Upload artifact
|
||
uses: actions/upload-artifact@v3
|
||
with:
|
||
name: chengnan-windows-x86_64
|
||
path: |
|
||
dist-windows/chengnan-windows-x86_64.zip
|
||
dist-windows/chengnan-windows-x86_64.zip.sha256
|
||
if-no-files-found: error
|