2424 node_arch : x64
2525 cmake_arch : x86_64
2626
27+ # Linux ARM64 builds (cross-compilation)
28+ - os : ubuntu-latest
29+ arch : arm64
30+ node_arch : arm64
31+ cmake_arch : arm64
32+
2733 # macOS builds
2834 - os : macos-latest
2935 arch : arm64
@@ -69,20 +75,44 @@ jobs:
6975 - name : Setup Linux ARM64 cross-compilation
7076 if : runner.os == 'Linux' && matrix.arch == 'arm64'
7177 run : |
78+ echo "🔧 Setting up Linux ARM64 cross-compilation environment"
79+
80+ # 安装交叉编译工具链
7281 sudo apt-get install -y \
7382 gcc-aarch64-linux-gnu \
7483 g++-aarch64-linux-gnu \
7584 gfortran-aarch64-linux-gnu
85+
7686 # 添加 ARM64 架构支持
87+ echo "📦 Adding ARM64 architecture support"
7788 sudo dpkg --add-architecture arm64
89+
90+ # 更新包管理器缓存
7891 sudo apt-get update
92+
93+ # 安装 ARM64 架构的依赖库
94+ echo "📦 Installing ARM64 libraries"
7995 sudo apt-get install -y \
8096 libfftw3-dev:arm64 \
81- libboost-all-dev:arm64
97+ libboost-all-dev:arm64 \
98+ pkg-config
99+
82100 # 设置交叉编译环境变量
101+ echo "🔧 Setting cross-compilation environment variables"
83102 echo "CC=aarch64-linux-gnu-gcc" >> $GITHUB_ENV
84103 echo "CXX=aarch64-linux-gnu-g++" >> $GITHUB_ENV
85104 echo "FC=aarch64-linux-gnu-gfortran" >> $GITHUB_ENV
105+ echo "AR=aarch64-linux-gnu-ar" >> $GITHUB_ENV
106+ echo "STRIP=aarch64-linux-gnu-strip" >> $GITHUB_ENV
107+ echo "PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig" >> $GITHUB_ENV
108+
109+ # 验证交叉编译工具链
110+ echo "✅ Verifying cross-compilation toolchain"
111+ aarch64-linux-gnu-gcc --version
112+ aarch64-linux-gnu-g++ --version
113+ aarch64-linux-gnu-gfortran --version
114+
115+ echo "✅ Linux ARM64 cross-compilation setup completed"
86116
87117 # 3. 安装系统依赖 - macOS
88118 - name : Install macOS dependencies
@@ -206,21 +236,52 @@ jobs:
206236 - name : Build native module (Linux/macOS)
207237 if : runner.os != 'Windows'
208238 run : |
239+ echo "🔧 Building native module for ${{ runner.os }} ${{ matrix.arch }}"
240+
209241 # 清理可能存在的CMake缓存
210242 rm -rf build/
211243
212244 if [ "${{ matrix.arch }}" = "arm64" ] && [ "${{ runner.os }}" = "Linux" ]; then
213- # Linux ARM64 交叉编译
214- npx cmake-js compile --arch=${{ matrix.cmake_arch }} \
215- --CDCMAKE_SYSTEM_NAME=Linux \
216- --CDCMAKE_SYSTEM_PROCESSOR=aarch64 \
217- --CDCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
218- --CDCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
219- --CDCMAKE_Fortran_COMPILER=aarch64-linux-gnu-gfortran
245+ echo "🏗️ Linux ARM64 cross-compilation build"
246+
247+ # 设置交叉编译相关的CMake参数
248+ CMAKE_ARGS="--arch=${{ matrix.cmake_arch }}"
249+ CMAKE_ARGS="$CMAKE_ARGS --CDCMAKE_SYSTEM_NAME=Linux"
250+ CMAKE_ARGS="$CMAKE_ARGS --CDCMAKE_SYSTEM_PROCESSOR=aarch64"
251+ CMAKE_ARGS="$CMAKE_ARGS --CDCMAKE_C_COMPILER=aarch64-linux-gnu-gcc"
252+ CMAKE_ARGS="$CMAKE_ARGS --CDCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++"
253+ CMAKE_ARGS="$CMAKE_ARGS --CDCMAKE_Fortran_COMPILER=aarch64-linux-gnu-gfortran"
254+ CMAKE_ARGS="$CMAKE_ARGS --CDCMAKE_AR=aarch64-linux-gnu-ar"
255+ CMAKE_ARGS="$CMAKE_ARGS --CDCMAKE_STRIP=aarch64-linux-gnu-strip"
256+ CMAKE_ARGS="$CMAKE_ARGS --CDCMAKE_FIND_ROOT_PATH=/usr/aarch64-linux-gnu"
257+ CMAKE_ARGS="$CMAKE_ARGS --CDCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER"
258+ CMAKE_ARGS="$CMAKE_ARGS --CDCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY"
259+ CMAKE_ARGS="$CMAKE_ARGS --CDCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY"
260+
261+ echo "📋 CMake arguments: $CMAKE_ARGS"
262+
263+ # 执行交叉编译
264+ npx cmake-js compile $CMAKE_ARGS
265+
220266 else
267+ echo "🏗️ Native build for ${{ runner.os }} ${{ matrix.arch }}"
221268 # 本地编译
222269 npx cmake-js compile --arch=${{ matrix.cmake_arch }}
223270 fi
271+
272+ # 验证构建结果
273+ echo "✅ Build completed, checking output..."
274+ if [ -f "build/Release/wsjtx_lib_nodejs.node" ]; then
275+ echo "✅ Found: build/Release/wsjtx_lib_nodejs.node"
276+ ls -la build/Release/wsjtx_lib_nodejs.node
277+ elif [ -f "build/wsjtx_lib_nodejs.node" ]; then
278+ echo "✅ Found: build/wsjtx_lib_nodejs.node"
279+ ls -la build/wsjtx_lib_nodejs.node
280+ else
281+ echo "❌ Build output not found!"
282+ find build -name "*.node" || echo "No .node files found"
283+ exit 1
284+ fi
224285
225286 # 8. 构建原生模块 - Windows MSYS2/MinGW-w64 (基于 build_mingw.sh)
226287 - name : Build native module (Windows MSYS2)
@@ -473,13 +534,37 @@ jobs:
473534
474535 if [ "${{ runner.os }}" = "Linux" ]; then
475536 echo "Checking Linux shared libraries..."
476- ldd "$NODE_FILE" | grep -v "linux-vdso\|ld-linux\|libc\|libm\|libpthread\|libdl" | awk '{print $3}' | grep -v "not found" | while read lib; do
477- if [ -f "$lib" ] && [[ "$lib" == *"libfftw"* || "$lib" == *"libgfortran"* || "$lib" == *"libgcc"* ]]; then
478- lib_name=$(basename "$lib")
479- echo "📦 Bundling: $lib_name"
480- cp "$lib" "$TARGET_DIR/"
481- fi
482- done
537+
538+ if [ "${{ matrix.arch }}" = "arm64" ]; then
539+ echo "🔍 ARM64 cross-compiled binary - using readelf for analysis"
540+ # 对于交叉编译的ARM64二进制文件,使用readelf而不是ldd
541+ NEEDED_LIBS=$(readelf -d "$NODE_FILE" | grep NEEDED | awk -F'[][]' '{print $2}')
542+ echo "📋 Required libraries:"
543+ for lib in $NEEDED_LIBS; do
544+ echo " - $lib"
545+
546+ # 在ARM64库路径中查找
547+ for search_path in "/usr/aarch64-linux-gnu/lib" "/usr/lib/aarch64-linux-gnu"; do
548+ if [ -f "$search_path/$lib" ]; then
549+ if [[ "$lib" == *"libfftw"* || "$lib" == *"libgfortran"* || "$lib" == *"libgcc"* || "$lib" == *"libquadmath"* ]]; then
550+ echo "📦 Bundling ARM64 library: $lib from $search_path"
551+ cp "$search_path/$lib" "$TARGET_DIR/"
552+ fi
553+ break
554+ fi
555+ done
556+ done
557+ else
558+ echo "🔍 x64 native binary - using ldd for analysis"
559+ ldd "$NODE_FILE" | grep -v "linux-vdso\|ld-linux\|libc\|libm\|libpthread\|libdl" | awk '{print $3}' | grep -v "not found" | while read lib; do
560+ if [ -f "$lib" ] && [[ "$lib" == *"libfftw"* || "$lib" == *"libgfortran"* || "$lib" == *"libgcc"* ]]; then
561+ lib_name=$(basename "$lib")
562+ echo "📦 Bundling x64 library: $lib_name"
563+ cp "$lib" "$TARGET_DIR/"
564+ fi
565+ done
566+ fi
567+
483568 elif [ "${{ runner.os }}" = "macOS" ]; then
484569 echo "Checking macOS dynamic libraries..."
485570 otool -L "$NODE_FILE" | grep -E "(libfftw|libgfortran|libgcc)" | awk '{print $1}' | while read lib; do
@@ -496,11 +581,17 @@ jobs:
496581 ls -la "$TARGET_DIR"
497582
498583 # 创建构建信息文件
584+ build_type="native"
585+ if [ "${{ matrix.arch }}" = "arm64" ] && [ "${{ runner.os }}" = "Linux" ]; then
586+ build_type="cross-compiled"
587+ fi
588+
499589 cat > "$TARGET_DIR/build-info.json" << EOF
500590 {
501591 "platform": "$PLATFORM_NAME",
502592 "github_runner": "${{ matrix.os }}",
503593 "arch": "${{ matrix.arch }}",
594+ "build_type": "$build_type",
504595 "node_version": "${{ env.NODE_VERSION }}",
505596 "build_time": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
506597 "cmake_arch": "${{ matrix.cmake_arch }}",
0 commit comments