feat: 添加 Linux/Windows 构建和打包脚本

build-linux.sh:
  - 支持 --clean --release --debug 参数
  - 输出到 build_linux/ 目录

build-win.sh:
  - 自动化 Windows 交叉编译 + 依赖收集 + 打包
  - 自动收集 Qt6/MinGW/MSVC/ICU 等 30+ DLL
  - 输出 dist_win/ 目录(可直接运行)+ dist/ 发布 zip
  - 支持 --clean --release --debug 参数

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
impressionyang 2026-06-11 16:06:25 +08:00
parent 8425fb4a04
commit 0b9ea40d20
2 changed files with 211 additions and 0 deletions

48
build-linux.sh Executable file
View File

@ -0,0 +1,48 @@
#!/bin/bash
# ============================================================================
# Impress Voice Input — Linux 构建脚本
# 用法: ./build-linux.sh [--clean] [--release|--debug]
# ============================================================================
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
BUILD_DIR="${SCRIPT_DIR}/build_linux"
BUILD_TYPE="RelWithDebInfo"
# 解析参数
for arg in "$@"; do
case "$arg" in
--clean)
echo "清理构建目录..."
rm -rf "${BUILD_DIR}"
;;
--debug)
BUILD_TYPE="Debug"
;;
--release)
BUILD_TYPE="Release"
;;
esac
done
echo "============================================"
echo " Impress Voice Input — Linux 构建"
echo " 构建类型: ${BUILD_TYPE}"
echo "============================================"
mkdir -p "${BUILD_DIR}"
cd "${BUILD_DIR}"
echo "[1/3] 配置 CMake..."
cmake .. -DCMAKE_BUILD_TYPE="${BUILD_TYPE}"
echo "[2/3] 编译..."
cmake --build . -j$(nproc)
echo "[3/3] 构建完成"
echo ""
echo "可执行文件: ${BUILD_DIR}/impress_voice_input"
echo ""
echo "运行方式:"
echo " cd ${SCRIPT_DIR} && ./run.sh"
echo " 或 LD_LIBRARY_PATH=third_party/onnxruntime/lib:third_party/portaudio/lib ${BUILD_DIR}/impress_voice_input"

163
build-win.sh Executable file
View File

@ -0,0 +1,163 @@
#!/bin/bash
# ============================================================================
# Impress Voice Input — Windows 交叉编译 + 打包脚本
# 用法: ./build-win.sh [--clean] [--release|--debug]
#
# 输出:
# build_win/dist_win/ — 解压后可直接运行的目录
# dist/impress_voice_input_windows.zip — 发布压缩包
# ============================================================================
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
BUILD_DIR="${SCRIPT_DIR}/build_win"
DIST_DIR="${BUILD_DIR}/dist_win"
OUTPUT_DIR="${SCRIPT_DIR}/dist"
BUILD_TYPE="RelWithDebInfo"
# Windows 交叉编译工具链和依赖路径
MINGW_PREFIX="/usr/x86_64-w64-mingw32/sys-root/mingw"
QT6_BIN="${MINGW_PREFIX}/bin"
QT6_PLUGINS="${MINGW_PREFIX}/lib/qt6/plugins"
WINE_WINDOWS="/usr/lib64/wine-wow64/wine/x86_64-windows"
# 解析参数
for arg in "$@"; do
case "$arg" in
--clean)
echo "清理构建目录..."
rm -rf "${BUILD_DIR}"
;;
--debug)
BUILD_TYPE="Debug"
;;
--release)
BUILD_TYPE="Release"
;;
esac
done
echo "============================================"
echo " Impress Voice Input — Windows 构建"
echo " 构建类型: ${BUILD_TYPE}"
echo "============================================"
# ============================================================================
# 1. 编译
# ============================================================================
mkdir -p "${BUILD_DIR}"
cd "${BUILD_DIR}"
echo "[1/4] 配置 CMake (Windows 交叉编译)..."
cmake .. \
-DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \
-DCMAKE_SYSTEM_NAME=Windows \
-DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc \
-DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ \
-DCMAKE_RC_COMPILER=x86_64-w64-mingw32-windres \
-DQt6_DIR="${MINGW_PREFIX}/lib/cmake/Qt6"
echo "[2/4] 编译..."
cmake --build . -j$(nproc)
# ============================================================================
# 2. 收集依赖
# ============================================================================
echo "[3/4] 收集 Windows 依赖 DLL..."
# 清理旧的 dist_win 目录(保留 platforms 子目录结构)
rm -rf "${DIST_DIR}"
mkdir -p "${DIST_DIR}/platforms"
# 可执行文件CMake 输出到 build_win/
cp -f "${BUILD_DIR}/impress_voice_input.exe" "${DIST_DIR}/"
# ONNX Runtime
cp -f "${SCRIPT_DIR}/third_party/onnxruntime-win-x64/lib/onnxruntime.dll" "${DIST_DIR}/"
if [ -f "${SCRIPT_DIR}/third_party/onnxruntime-win-x64/lib/onnxruntime_providers_shared.dll" ]; then
cp -f "${SCRIPT_DIR}/third_party/onnxruntime-win-x64/lib/onnxruntime_providers_shared.dll" "${DIST_DIR}/"
fi
# PortAudio
cp -f "${SCRIPT_DIR}/third_party/portaudio/bin/libportaudio.dll" "${DIST_DIR}/"
# Qt6 核心 DLL
for dll in Qt6Core Qt6Widgets Qt6Gui Qt6Concurrent Qt6Network; do
src="${QT6_BIN}/${dll}.dll"
if [ -f "$src" ]; then
cp -f "$src" "${DIST_DIR}/"
else
echo "警告: 未找到 $src"
fi
done
# Qt6 平台插件
cp -f "${QT6_PLUGINS}/platforms/qwindows.dll" "${DIST_DIR}/platforms/"
# ICU 国际化库Qt6 依赖)
for dll in icuuc77 icui18n77 icudata77; do
src="${QT6_BIN}/${dll}.dll"
if [ -f "$src" ]; then
cp -f "$src" "${DIST_DIR}/"
fi
done
# MinGW 运行时
for dll in libgcc_s_seh-1 libstdc++-6 libwinpthread-1; do
src="${QT6_BIN}/${dll}.dll"
if [ -f "$src" ]; then
cp -f "$src" "${DIST_DIR}/"
fi
done
# Qt6 字体和图像依赖
for dll in zlib1 libpng16-16 libfreetype-6 libharfbuzz-0 \
libfontconfig-1 libpcre2-16-0 libpcre2-8-0 \
libcrypto-3-x64 libexpat-1 libbz2-1 \
libglib-2.0-0 libintl-8 iconv; do
src="${QT6_BIN}/${dll}.dll"
if [ -f "$src" ]; then
cp -f "$src" "${DIST_DIR}/"
fi
done
# MSVC 运行时MinGW 交叉编译的 Qt6 需要这些)
for dll in vcruntime140 vcruntime140_1 msvcp140 msvcp140_1 msvcp140_2 concrt140; do
src="${WINE_WINDOWS}/${dll}.dll"
if [ -f "$src" ]; then
cp -f "$src" "${DIST_DIR}/"
fi
done
echo " 已收集 $(ls "${DIST_DIR}" | wc -l) 个文件到 dist_win/"
# ============================================================================
# 3. 打包
# ============================================================================
echo "[4/4] 打包..."
mkdir -p "${OUTPUT_DIR}"
cd "${BUILD_DIR}"
rm -f "${OUTPUT_DIR}/impress_voice_input_windows.zip"
# 打包 dist_win/ 目录(包含目录前缀)
zip -r "${OUTPUT_DIR}/impress_voice_input_windows.zip" dist_win/ > /dev/null 2>&1
echo ""
echo "============================================"
echo " 构建完成!"
echo "============================================"
echo ""
echo "解压后可直接运行目录: ${DIST_DIR}/"
echo " 运行: ${DIST_DIR}/impress_voice_input.exe"
echo ""
echo "发布压缩包: ${OUTPUT_DIR}/impress_voice_input_windows.zip"
echo " 解压后进入 dist_win/ 目录运行 impress_voice_input.exe"
echo ""
# 列出 dist_win 内容
echo "dist_win/ 内容:"
ls -lh "${DIST_DIR}/" | tail -n +2
echo ""
echo "dist_win/platforms/ 内容:"
ls -lh "${DIST_DIR}/platforms/"