1+ name : gem-build
2+
3+ on :
4+ workflow_call :
5+ inputs :
6+ platforms :
7+ description : ' JSON array of platforms to build (e.g., ["x86_64-linux", "arm64-darwin"])'
8+ required : false
9+ type : string
10+ default : ' ["x64-mingw32", "x64-mingw-ucrt", "x86_64-darwin", "arm64-darwin", "x86_64-linux", "x86_64-linux-gnu", "x86_64-linux-musl", "aarch64-linux", "aarch64-linux-gnu", "aarch64-linux-musl", "any"]'
11+ workflow_dispatch :
12+ inputs :
13+ platforms :
14+ description : ' JSON array of platforms to build'
15+ required : false
16+ type : string
17+ default : ' ["x64-mingw32", "x64-mingw-ucrt", "x86_64-darwin", "arm64-darwin", "x86_64-linux", "x86_64-linux-gnu", "x86_64-linux-musl", "aarch64-linux", "aarch64-linux-gnu", "aarch64-linux-musl", "any"]'
18+
19+ env :
20+ BUNDLER_VER : latest
21+
22+ jobs :
23+ build :
24+ name : build (${{ matrix.os }}, ${{ matrix.platform }})
25+ runs-on : ${{ matrix.os }}
26+ strategy :
27+ fail-fast : false
28+ matrix :
29+ include :
30+ # Windows platforms
31+ - os : windows-latest
32+ platform : x64-mingw32
33+ ruby : ' 3.4'
34+ - os : windows-latest
35+ platform : x64-mingw-ucrt
36+ ruby : ' 3.4'
37+ # macOS platforms
38+ - os : macos-latest
39+ platform : x86_64-darwin
40+ ruby : ' 3.4'
41+ - os : macos-latest
42+ platform : arm64-darwin
43+ ruby : ' 3.4'
44+ # Linux x86_64 platforms (gnu and musl)
45+ - os : ubuntu-latest
46+ platform : x86_64-linux
47+ ruby : ' 3.4'
48+ - os : ubuntu-latest
49+ platform : x86_64-linux-gnu
50+ ruby : ' 3.4'
51+ - os : ubuntu-latest
52+ platform : x86_64-linux-musl
53+ ruby : ' 3.4'
54+ # Linux aarch64 platforms (gnu and musl)
55+ - os : ubuntu-latest
56+ platform : aarch64-linux
57+ ruby : ' 3.4'
58+ - os : ubuntu-latest
59+ platform : aarch64-linux-gnu
60+ ruby : ' 3.4'
61+ - os : ubuntu-latest
62+ platform : aarch64-linux-musl
63+ ruby : ' 3.4'
64+ # Any platform (source gem)
65+ - os : ubuntu-latest
66+ platform : any
67+ ruby : ' 3.4'
68+ steps :
69+ - uses : actions/checkout@v6
70+
71+ - uses : ruby/setup-ruby@v1
72+ with :
73+ ruby-version : ${{ matrix.ruby }}
74+ bundler : ${{ env.BUNDLER_VER }}
75+ bundler-cache : true
76+
77+ - if : matrix.platform == 'aarch64-linux' || matrix.platform == 'aarch64-linux-gnu' || matrix.platform == 'aarch64-linux-musl'
78+ name : Install aarch64 compilers
79+ run : |
80+ sudo apt-get update
81+ sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu gperf
82+ echo "CMAKE_TOOLCHAIN_FILE=$(pwd)/toolchain/aarch64-linux-gnu.cmake" >> $GITHUB_ENV
83+
84+ - if : matrix.platform == 'aarch64-linux-musl'
85+ name : Install musl cross-compiler for aarch64
86+ run : |
87+ # Install musl-tools for musl builds
88+ sudo apt-get install musl-tools
89+ # For aarch64-musl, we'll use musl-gcc wrapper with aarch64-linux-gnu-gcc
90+ # This creates a musl-targeted build
91+
92+ - run : bundle exec rake gem:native:${{ matrix.platform }}
93+
94+ - uses : actions/upload-artifact@v6
95+ if : failure()
96+ with :
97+ name : build-logs-${{ matrix.platform }}
98+ path : tmp/*/ports/*/*/*.log
99+
100+ - if : matrix.platform != 'any' && !startsWith(matrix.platform, 'aarch64-')
101+ uses : metanorma/metanorma-build-scripts/native-deps-action@main
102+ with :
103+ libname : archive
104+ directory : lib/ffi-libarchive-binary
105+
106+ - run : |
107+ cd pkg/
108+ gem unpack ffi-libarchive-binary-*.gem
109+ ls */lib/ffi-libarchive-binary
110+
111+ - uses : actions/upload-artifact@v6
112+ with :
113+ name : ${{ matrix.platform }}-pkg
114+ path : pkg/*.gem
115+
116+ - if : matrix.platform != 'any'
117+ uses : actions/upload-artifact@v6
118+ with :
119+ name : lib-${{ matrix.platform }}
120+ path : lib/ffi-libarchive-binary/libarchive.*
0 commit comments