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:
parent
8425fb4a04
commit
0b9ea40d20
48
build-linux.sh
Executable file
48
build-linux.sh
Executable 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
163
build-win.sh
Executable 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/"
|
||||
Loading…
Reference in New Issue
Block a user