Skip to content

更新构建文档和 GitHub Actions 工作流,添加 Node.js 和 npm 依赖,优化 Windows 环境设置,确保构建过程… #84

更新构建文档和 GitHub Actions 工作流,添加 Node.js 和 npm 依赖,优化 Windows 环境设置,确保构建过程…

更新构建文档和 GitHub Actions 工作流,添加 Node.js 和 npm 依赖,优化 Windows 环境设置,确保构建过程… #84

Workflow file for this run

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