Skip to content

Commit 391d7fc

Browse files
committed
linux arm64
1 parent 029fac8 commit 391d7fc

File tree

1 file changed

+106
-15
lines changed

1 file changed

+106
-15
lines changed

.github/workflows/build.yml

Lines changed: 106 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ jobs:
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

Comments
 (0)