Skip to content

Commit 5da9b98

Browse files
authored
Fix linux arm compiling and add CI for cross-compiled builds (#857)
* Remove duplicate slash * Run CI on cross-arch builds * Install cross-arch compiler * Install cross-arch compiler for azure pipeline
1 parent 732ebf7 commit 5da9b98

3 files changed

Lines changed: 37 additions & 9 deletions

File tree

.github/workflows/ci.yml

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ on:
55

66
jobs:
77
build-test:
8-
name: Build & Test (${{ matrix.os }})
8+
name: Build & Test (${{ matrix.os }}${{ matrix.cross && ' xarch' || '' }})
99
runs-on: ${{ matrix.os }}
1010
strategy:
1111
fail-fast: false
1212
matrix:
1313
os: [ubuntu-22.04, macos-14, windows-2022]
14+
cross: [false, true]
1415
steps:
1516
- name: Checkout
1617
uses: actions/checkout@v4
@@ -22,19 +23,38 @@ jobs:
2223
with:
2324
node-version: '22.x'
2425

26+
- name: Set architecture
27+
id: arch
28+
shell: bash
29+
run: |
30+
if [ "${{ runner.os }}" = "macOS" ]; then
31+
echo "arch=${{ matrix.cross && 'x64' || 'arm64' }}" >> $GITHUB_OUTPUT
32+
else
33+
echo "arch=${{ matrix.cross && 'arm64' || 'x64' }}" >> $GITHUB_OUTPUT
34+
fi
35+
2536
- name: Install sysroot
2637
if: runner.os == 'Linux'
2738
run: |
2839
sudo apt-get update -qq
29-
sudo apt-get install -y gcc-10 g++-10
30-
SYSROOT_PATH=$(node scripts/linux/install-sysroot.js x64 | grep "SYSROOT_PATH=" | cut -d= -f2)
40+
if [ "${{ steps.arch.outputs.arch }}" = "arm64" ]; then
41+
sudo apt-get install -y gcc-10-aarch64-linux-gnu g++-10-aarch64-linux-gnu
42+
echo "CC=aarch64-linux-gnu-gcc-10" >> $GITHUB_ENV
43+
echo "CXX=aarch64-linux-gnu-g++-10" >> $GITHUB_ENV
44+
else
45+
sudo apt-get install -y gcc-10 g++-10
46+
echo "CC=gcc-10" >> $GITHUB_ENV
47+
echo "CXX=g++-10" >> $GITHUB_ENV
48+
fi
49+
SYSROOT_PATH=$(node scripts/linux/install-sysroot.js ${{ steps.arch.outputs.arch }} | grep "SYSROOT_PATH=" | cut -d= -f2)
3150
echo "SYSROOT_PATH=$SYSROOT_PATH" >> $GITHUB_ENV
3251
echo "Sysroot path set to: $SYSROOT_PATH"
33-
echo "CC=gcc-10" >> $GITHUB_ENV
34-
echo "CXX=g++-10" >> $GITHUB_ENV
3552
3653
- name: Install dependencies and build
3754
run: npm ci
55+
env:
56+
ARCH: ${{ steps.arch.outputs.arch }}
57+
npm_config_arch: ${{ steps.arch.outputs.arch }}
3858

3959
- name: Verify GLIBC requirements
4060
if: runner.os == 'Linux'
@@ -45,7 +65,9 @@ jobs:
4565
./scripts/linux/verify-glibc-requirements.sh
4666
4767
- name: Test
68+
if: ${{ !matrix.cross }}
4869
run: npm test
4970

5071
- name: Lint
72+
if: ${{ !matrix.cross }}
5173
run: npm run lint

pipelines/build.yml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,17 @@ steps:
1616
- bash: |
1717
if [ "$(uname)" = "Linux" ]; then
1818
sudo apt-get update -qq
19-
sudo apt-get install -y gcc-10 g++-10
19+
if [ "${{ parameters.arch }}" = "arm64" ]; then
20+
sudo apt-get install -y gcc-10-aarch64-linux-gnu g++-10-aarch64-linux-gnu
21+
echo "##vso[task.setvariable variable=CC]aarch64-linux-gnu-gcc-10"
22+
echo "##vso[task.setvariable variable=CXX]aarch64-linux-gnu-g++-10"
23+
else
24+
sudo apt-get install -y gcc-10 g++-10
25+
echo "##vso[task.setvariable variable=CC]gcc-10"
26+
echo "##vso[task.setvariable variable=CXX]g++-10"
27+
fi
2028
SYSROOT_PATH=$(node scripts/linux/install-sysroot.js ${{ parameters.arch }} | grep "SYSROOT_PATH=" | cut -d= -f2)
2129
echo "##vso[task.setvariable variable=SYSROOT_PATH]$SYSROOT_PATH"
22-
echo "##vso[task.setvariable variable=CC]gcc-10"
23-
echo "##vso[task.setvariable variable=CXX]g++-10"
2430
echo "Sysroot path set to: $SYSROOT_PATH"
2531
elif [ "$(uname)" = "Darwin" ]; then
2632
echo "##vso[task.setvariable variable=CC]clang"

src/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export function loadNativeModule(name: string): {dir: string, module: any} {
1717
let lastError: unknown;
1818
for (const d of dirs) {
1919
for (const r of relative) {
20-
const dir = `${r}/${d}/`;
20+
const dir = `${r}/${d}`;
2121
try {
2222
return { dir, module: require(`${dir}/${name}.node`) };
2323
} catch (e) {

0 commit comments

Comments
 (0)