更新构建文档和 GitHub Actions 工作流,添加 Node.js 和 npm 依赖,优化 Windows 环境设置,确保构建过程… #84
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build and Package | |
| on: | |
| push: | |
| branches: [ main, develop ] | |
| tags: [ 'v*' ] | |
| pull_request: | |
| branches: [ main ] | |
| env: | |
| NODE_VERSION: '18' | |
| jobs: | |
| build: | |
| name: Build on ${{ matrix.os }} (${{ matrix.arch }}) | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| # Linux builds | |
| - os: ubuntu-latest | |
| arch: x64 | |
| node_arch: x64 | |
| cmake_arch: x86_64 | |
| # macOS builds | |
| - os: macos-latest | |
| arch: arm64 | |
| node_arch: arm64 | |
| cmake_arch: arm64 | |
| # Windows builds with MSYS2/MinGW-w64 | |
| - os: windows-latest | |
| arch: x64 | |
| node_arch: x64 | |
| cmake_arch: x64 | |
| steps: | |
| # 1. 检出代码 | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| fetch-depth: 0 | |
| # 2. 设置 Node.js 环境 | |
| - name: Setup Node.js | |
| id: setup_node | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ env.NODE_VERSION }} | |
| architecture: ${{ matrix.node_arch }} | |
| # 3. 安装系统依赖 - Linux | |
| - name: Install Linux dependencies | |
| if: runner.os == 'Linux' | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y \ | |
| cmake \ | |
| build-essential \ | |
| gfortran \ | |
| libfftw3-dev \ | |
| libboost-all-dev \ | |
| pkg-config | |
| # 3a. Linux ARM64 交叉编译设置 | |
| - name: Setup Linux ARM64 cross-compilation | |
| if: runner.os == 'Linux' && matrix.arch == 'arm64' | |
| run: | | |
| sudo apt-get install -y \ | |
| gcc-aarch64-linux-gnu \ | |
| g++-aarch64-linux-gnu \ | |
| gfortran-aarch64-linux-gnu | |
| # 添加 ARM64 架构支持 | |
| sudo dpkg --add-architecture arm64 | |
| sudo apt-get update | |
| sudo apt-get install -y \ | |
| libfftw3-dev:arm64 \ | |
| libboost-all-dev:arm64 | |
| # 设置交叉编译环境变量 | |
| echo "CC=aarch64-linux-gnu-gcc" >> $GITHUB_ENV | |
| echo "CXX=aarch64-linux-gnu-g++" >> $GITHUB_ENV | |
| echo "FC=aarch64-linux-gnu-gfortran" >> $GITHUB_ENV | |
| # 3. 安装系统依赖 - macOS | |
| - name: Install macOS dependencies | |
| if: runner.os == 'macOS' | |
| run: | | |
| brew install cmake fftw boost gcc pkg-config | |
| # 根据架构设置不同的路径 | |
| if [ "${{ matrix.arch }}" = "arm64" ]; then | |
| # Apple Silicon (ARM64) | |
| BREW_PREFIX="/opt/homebrew" | |
| else | |
| # Intel (x64) | |
| BREW_PREFIX="/usr/local" | |
| fi | |
| # 确保brew路径在PATH中 | |
| echo "${BREW_PREFIX}/bin" >> $GITHUB_PATH | |
| # 验证gfortran安装并设置环境变量 | |
| echo "Checking gfortran installation..." | |
| ls -la ${BREW_PREFIX}/bin/gfortran* || echo "gfortran not found" | |
| # 找到正确的gfortran路径并设置为环境变量 | |
| GFORTRAN_PATH=$(find ${BREW_PREFIX}/bin -name "gfortran*" | head -1) | |
| if [ -n "$GFORTRAN_PATH" ] && [ -x "$GFORTRAN_PATH" ]; then | |
| echo "Found gfortran at: $GFORTRAN_PATH" | |
| echo "FC=$GFORTRAN_PATH" >> $GITHUB_ENV | |
| echo "CMAKE_Fortran_COMPILER=$GFORTRAN_PATH" >> $GITHUB_ENV | |
| # 测试gfortran | |
| $GFORTRAN_PATH --version || echo "gfortran test failed" | |
| else | |
| echo "ERROR: gfortran not found or not executable" | |
| exit 1 | |
| fi | |
| # 设置库路径 | |
| echo "LIBRARY_PATH=${BREW_PREFIX}/lib:$LIBRARY_PATH" >> $GITHUB_ENV | |
| echo "LD_LIBRARY_PATH=${BREW_PREFIX}/lib:$LD_LIBRARY_PATH" >> $GITHUB_ENV | |
| # 3. 设置 MSYS2 环境 - Windows | |
| - name: Setup MSYS2 (Windows) | |
| if: runner.os == 'Windows' | |
| uses: msys2/setup-msys2@v2 | |
| with: | |
| msystem: MINGW64 | |
| update: true | |
| install: >- | |
| base-devel | |
| mingw-w64-x86_64-toolchain | |
| mingw-w64-x86_64-cmake | |
| mingw-w64-x86_64-pkg-config | |
| mingw-w64-x86_64-fftw | |
| mingw-w64-x86_64-boost | |
| mingw-w64-x86_64-gcc-fortran | |
| mingw-w64-x86_64-nodejs | |
| # 3a. 验证 MSYS2 工具链 - Windows | |
| - name: Verify MSYS2 toolchain (Windows) | |
| if: runner.os == 'Windows' | |
| shell: msys2 {0} | |
| run: | | |
| echo "=== Verifying MSYS2 toolchain installation ===" | |
| echo "Checking essential tools..." | |
| which gcc && gcc --version || echo "❌ GCC not found" | |
| which g++ && g++ --version || echo "❌ G++ not found" | |
| which gfortran && gfortran --version || echo "❌ gfortran not found" | |
| which cmake && cmake --version || echo "❌ CMake not found" | |
| which pkg-config && pkg-config --version || echo "❌ pkg-config not found" | |
| which node && node --version || echo "❌ Node.js not found" | |
| which npm && npm --version || echo "❌ npm not found" | |
| which npx && npx --version || echo "❌ npx not found" | |
| echo "Checking libraries..." | |
| pkg-config --exists fftw3f && echo "✅ FFTW3f available" || echo "❌ FFTW3f not found" | |
| # Boost 在 MSYS2 中可能没有 pkg-config 文件,检查实际安装 | |
| if [ -d "/mingw64/include/boost" ]; then | |
| echo "✅ Boost headers found" | |
| else | |
| echo "❌ Boost headers not found" | |
| fi | |
| if ls /mingw64/lib/libboost* >/dev/null 2>&1; then | |
| echo "✅ Boost libraries found" | |
| else | |
| echo "❌ Boost libraries not found" | |
| fi | |
| echo "=== Toolchain verification complete ===" | |
| # 4. 安装 npm 依赖 | |
| - name: Install npm dependencies | |
| run: npm ci --ignore-scripts | |
| # 5. 构建 TypeScript | |
| - name: Build TypeScript | |
| run: npm run build:ts | |
| # 6. 构建原生模块 - Linux/macOS | |
| - name: Build native module (Linux/macOS) | |
| if: runner.os != 'Windows' | |
| run: | | |
| # 清理可能存在的CMake缓存 | |
| rm -rf build/ | |
| if [ "${{ matrix.arch }}" = "arm64" ] && [ "${{ runner.os }}" = "Linux" ]; then | |
| # Linux ARM64 交叉编译 | |
| npx cmake-js compile --arch=${{ matrix.cmake_arch }} \ | |
| --CDCMAKE_SYSTEM_NAME=Linux \ | |
| --CDCMAKE_SYSTEM_PROCESSOR=aarch64 \ | |
| --CDCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \ | |
| --CDCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \ | |
| --CDCMAKE_Fortran_COMPILER=aarch64-linux-gnu-gfortran | |
| else | |
| # 本地编译 | |
| npx cmake-js compile --arch=${{ matrix.cmake_arch }} | |
| fi | |
| # 7. 构建原生模块 - Windows MSYS2/MinGW-w64 | |
| - name: Build native module (Windows MSYS2) | |
| if: runner.os == 'Windows' | |
| shell: msys2 {0} | |
| run: | | |
| echo "=== Building with MSYS2/MinGW-w64 toolchain ===" | |
| echo "Using improved CMakeLists.txt with MinGW-specific MSVC flag clearing" | |
| # 验证工具是否可用 | |
| echo "Verifying tools availability..." | |
| which cmake && cmake --version || echo "CMake not found" | |
| which gcc && gcc --version || echo "GCC not found" | |
| which gfortran && gfortran --version || echo "gfortran not found" | |
| which pkg-config && pkg-config --version || echo "pkg-config not found" | |
| which node && node --version || echo "Node.js not found" | |
| which npm && npm --version || echo "npm not found" | |
| which npx && npx --version || echo "npx not found" | |
| # 设置环境变量强制使用 MinGW 工具链 | |
| export PKG_CONFIG_PATH="/mingw64/lib/pkgconfig" | |
| export CMAKE_PREFIX_PATH="/mingw64" | |
| export CC="gcc" | |
| export CXX="g++" | |
| export FC="gfortran" | |
| # 强制 cmake-js 使用 MinGW 而不是 Visual Studio | |
| export CMAKE_GENERATOR="MinGW Makefiles" | |
| export CMAKE_MAKE_PROGRAM="mingw32-make" | |
| # 禁用 Visual Studio 检测 | |
| unset VSINSTALLDIR | |
| unset VCINSTALLDIR | |
| unset WindowsSDKDir | |
| # 验证 Boost 安装 | |
| echo "Checking Boost installation..." | |
| find /mingw64 -name "*boost*" -type f | head -5 | |
| ls -la /mingw64/include/boost/ || echo "Boost headers not found" | |
| ls -la /mingw64/lib/libboost* | head -3 || echo "Boost libraries not found" | |
| # 清理构建目录 | |
| rm -rf build/ | |
| echo "Starting cmake-js compilation with MinGW Makefiles..." | |
| echo "CMakeLists.txt now handles MSVC flag clearing automatically" | |
| # 使用 cmake-js,依赖 CMakeLists.txt 中的修复 | |
| npx cmake-js compile --arch=${{ matrix.cmake_arch }} \ | |
| --generator="MinGW Makefiles" \ | |
| --verbose | |
| # 8. 运行测试 | |
| - name: Run tests | |
| run: | | |
| # 显示编译后的文件结构 | |
| echo "📁 Checking compiled files structure:" | |
| ls -la dist/ || echo "dist directory not found" | |
| find dist -name "*.js" -type f || echo "No JS files found in dist" | |
| # 检查测试文件是否存在 | |
| if [ -f "dist/test/wsjtx.basic.test.js" ]; then | |
| echo "✅ Basic test file found: dist/test/wsjtx.basic.test.js" | |
| # 检查原生模块是否存在 | |
| if [ -f "build/Release/wsjtx_lib_nodejs.node" ]; then | |
| echo "✅ Native module found: build/Release/wsjtx_lib_nodejs.node" | |
| # 运行基础测试 | |
| npm test | |
| else | |
| echo "❌ Native module not found! Cannot run tests." | |
| exit 1 | |
| fi | |
| else | |
| echo "❌ Basic test file not found!" | |
| exit 1 | |
| fi | |
| shell: bash | |
| # 9. 创建预构建二进制文件 | |
| - name: Create prebuilt binaries | |
| run: | | |
| # 创建目标目录 | |
| mkdir -p prebuilds/${{ matrix.os }}-${{ matrix.arch }} | |
| # 复制构建的 .node 文件 | |
| cp build/Release/*.node prebuilds/${{ matrix.os }}-${{ matrix.arch }}/ | |
| # 显示构建结果 | |
| echo "构建完成的文件:" | |
| ls -la prebuilds/${{ matrix.os }}-${{ matrix.arch }}/ | |
| shell: bash | |
| # 10. 上传构建产物到 artifacts | |
| - name: Upload build artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: prebuilt-${{ matrix.os }}-${{ matrix.arch }} | |
| path: prebuilds/ | |
| retention-days: 30 | |
| if-no-files-found: error | |
| # 11. 上传完整构建目录(用于调试) | |
| - name: Upload build directory for debugging | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: build-debug-${{ matrix.os }}-${{ matrix.arch }} | |
| path: build/ | |
| retention-days: 7 | |
| # 汇总所有构建产物 | |
| collect-artifacts: | |
| name: Collect All Artifacts | |
| needs: build | |
| runs-on: ubuntu-latest | |
| if: always() && needs.build.result == 'success' | |
| steps: | |
| - name: Download all build artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: all-artifacts | |
| - name: Organize artifacts | |
| run: | | |
| mkdir -p final-prebuilds | |
| # 合并所有预构建文件 | |
| for artifact_dir in all-artifacts/prebuilt-*; do | |
| if [ -d "$artifact_dir" ]; then | |
| echo "处理 $artifact_dir" | |
| cp -r "$artifact_dir"/* final-prebuilds/ | |
| fi | |
| done | |
| # 显示最终结果 | |
| echo "所有平台的构建产物:" | |
| find final-prebuilds -name "*.node" -exec ls -la {} \; | |
| # 创建构建摘要 | |
| echo "# 构建摘要" > build-summary.md | |
| echo "构建时间: $(date)" >> build-summary.md | |
| echo "## 支持的平台:" >> build-summary.md | |
| find final-prebuilds -name "*.node" | while read file; do | |
| platform=$(echo "$file" | cut -d'/' -f2) | |
| echo "- $platform" >> build-summary.md | |
| done | |
| - name: Upload combined artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: all-prebuilds | |
| path: | | |
| final-prebuilds/ | |
| build-summary.md | |
| retention-days: 90 |