Skip to content

Commit 992a179

Browse files
committed
Try and build arm musl
1 parent b559d3e commit 992a179

File tree

4 files changed

+72
-35
lines changed

4 files changed

+72
-35
lines changed

.github/workflows/build.yml

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -150,15 +150,10 @@ jobs:
150150
platform:
151151
- amd64
152152
- arm64
153-
# arm
154-
# ppc64le
155-
# s390x
156153
libc:
157154
- gnu
158-
include:
159-
- platform: amd64
160-
libc: musl
161-
name: Build (linux)
155+
- musl
156+
name: Build (linux) (${{ matrix.platform }}, ${{ matrix.libc }})
162157
outputs:
163158
GEM_VERSION: ${{ steps.set-metadata.outputs.GEM_VERSION }}
164159
runs-on: ubuntu-24.04
@@ -178,7 +173,14 @@ jobs:
178173
esac
179174
;;
180175
arm64)
181-
echo 'aarch64-linux-gnu'
176+
case ${{ matrix.libc }} in
177+
gnu)
178+
echo 'aarch64-linux-gnu'
179+
;;
180+
musl)
181+
echo 'aarch64-alpine-linux-musl'
182+
;;
183+
esac
182184
;;
183185
esac | tee target_platform
184186
case ${{ matrix.platform }} in
@@ -193,11 +195,22 @@ jobs:
193195
esac
194196
;;
195197
arm64)
196-
echo 'aarch64-linux'
198+
case ${{ matrix.libc }} in
199+
gnu)
200+
echo 'aarch64-linux'
201+
;;
202+
musl)
203+
echo 'aarch64-linux-musl'
204+
;;
205+
esac
197206
;;
198207
esac | tee ruby_target_platform
199208
echo "target_platform=$(cat target_platform)" >> $GITHUB_OUTPUT
200209
echo "ruby_target_platform=$(cat ruby_target_platform)" >> $GITHUB_OUTPUT
210+
- name: Enable ${{ matrix.platform }} platform
211+
if: ${{ matrix.platform != 'amd64' && matrix.libc == 'musl' }}
212+
run: |
213+
docker run --privileged --rm tonistiigi/binfmt:latest --install ${{ matrix.platform }}
201214
- name: Start container
202215
id: container
203216
run: |
@@ -210,7 +223,16 @@ jobs:
210223
;;
211224
esac | tee container_image
212225
echo "image=$(cat container_image)" >> $GITHUB_OUTPUT
213-
docker run --rm -d -v "${PWD}":"${PWD}" -w "${PWD}" --platform linux/amd64 -e RUBY_TARGET_PLATFORM=${{ steps.platform.outputs.ruby_target_platform }} -e TARGET_PLATFORM=${{ steps.platform.outputs.target_platform }} $(cat container_image) /bin/sleep 64d | tee container_id
226+
227+
# use native platform for musl builds (via QEMU if needed)
228+
# use amd64 for gnu builds (cross-compilation is faster)
229+
if [ "${{ matrix.libc }}" = "musl" ]; then
230+
platform="linux/${{ matrix.platform }}"
231+
else
232+
platform="linux/amd64"
233+
fi
234+
235+
docker run --rm -d -v "${PWD}":"${PWD}" -w "${PWD}" --platform "${platform}" -e RUBY_TARGET_PLATFORM=${{ steps.platform.outputs.ruby_target_platform }} -e TARGET_PLATFORM=${{ steps.platform.outputs.target_platform }} $(cat container_image) /bin/sleep 64d | tee container_id
214236
docker exec -w "${PWD}" $(cat container_id) uname -a
215237
echo "id=$(cat container_id)" >> $GITHUB_OUTPUT
216238
- name: Install Alpine system dependencies
@@ -224,7 +246,11 @@ jobs:
224246
- name: Install Debian cross-compiler
225247
if: ${{ matrix.libc == 'gnu' && matrix.platform != 'amd64' }}
226248
run: |
227-
docker exec -w "${PWD}" ${{ steps.container.outputs.id }} apt-get install -y binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
249+
case ${{ matrix.platform }} in
250+
arm64)
251+
docker exec -w "${PWD}" ${{ steps.container.outputs.id }} apt-get install -y binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
252+
;;
253+
esac
228254
- name: Update Rubygems and Bundler
229255
run: |
230256
docker exec -w "${PWD}" ${{ steps.container.outputs.id }} gem update --system
@@ -266,7 +292,7 @@ jobs:
266292
run: |
267293
docker exec -w "${PWD}" ${{ steps.container.outputs.id }} ./libexec/inject-libv8 ${{ steps.set-metadata.outputs.NODE_VERSION }}
268294
- name: Test V8 in C++
269-
if: matrix.platform != 'arm64'
295+
if: ${{ matrix.platform == 'amd64' || matrix.libc == 'musl' }}
270296
run: |
271297
docker exec -w "${PWD}" ${{ steps.container.outputs.id }} bash -c "cd test/gtest && cmake -S . -B build && cd build && cmake --build . && ctest"
272298
- name: Build binary gem
@@ -387,10 +413,7 @@ jobs:
387413
- '3.4'
388414
platform:
389415
- amd64
390-
# arm64
391-
# arm
392-
# ppc64le
393-
# s390x
416+
- arm64
394417
libc:
395418
- gnu
396419
- musl
@@ -404,7 +427,10 @@ jobs:
404427
- version: '3.4'
405428
platform: 'arm64'
406429
libc: 'gnu'
407-
name: Test (linux)
430+
- version: '3.4'
431+
platform: 'arm64'
432+
libc: 'musl'
433+
name: Test (linux) (${{ matrix.platform }}, ${{ matrix.libc }}, ruby ${{ matrix.version }})
408434
needs: build-linux
409435
runs-on: ubuntu-24.04
410436
steps:
@@ -429,7 +455,7 @@ jobs:
429455
echo "id=$(cat container_id)" >> $GITHUB_OUTPUT
430456
- name: Install Alpine system dependencies
431457
if: ${{ matrix.libc == 'musl' }}
432-
run: docker exec -w "${PWD}" ${{ steps.container.outputs.id }} apk add --no-cache build-base git libstdc++
458+
run: docker exec -w "${PWD}" ${{ steps.container.outputs.id }} apk add --no-cache build-base git libstdc++ bash
433459
- name: Update Rubygems and Bundler
434460
run: |
435461
docker exec -w "${PWD}" ${{ steps.container.outputs.id }} gem update --system

Makefile.docker

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,45 +21,45 @@ test/linux: test/$(subst arm64,aarch64,$(CPU))-linux
2121
test/linux-musl: test/$(subst arm64,aarch64,$(CPU))-linux-musl
2222

2323
pkg/libv8-node-$(VERSION)-x86_64-linux.gem:
24-
docker buildx build --platform linux/amd64 --build-arg RUBY_VERSION=3.4 --build-arg NODE_VERSION=$(NODE_VERSION) --progress plain -t libv8-node:$(VERSION)-gnu .
25-
docker run --platform linux/amd64 --rm -it -v "$(PWD)/pkg":/pkg libv8-node:$(VERSION)-gnu cp $@ /pkg/
24+
docker buildx build --platform linux/amd64 --build-arg RUBY_VERSION=3.4 --build-arg NODE_VERSION=$(NODE_VERSION) --progress plain -t libv8-node:$(VERSION)-gnu-amd64 .
25+
docker run --platform linux/amd64 --rm -it -v "$(PWD)/pkg":/pkg libv8-node:$(VERSION)-gnu-amd64 cp $@ /pkg/
2626

2727
pkg/libv8-node-$(VERSION)-x86_64-linux-musl.gem:
28-
docker buildx build --platform linux/amd64 --build-arg RUBY_VERSION=3.4-alpine --build-arg NODE_VERSION=$(NODE_VERSION) --progress plain -t libv8-node:$(VERSION)-musl .
29-
docker run --platform linux/amd64 --rm -it -v "$(PWD)/pkg":/pkg libv8-node:$(VERSION)-musl cp $@ /pkg/
28+
docker buildx build --platform linux/amd64 --build-arg RUBY_VERSION=3.4-alpine --build-arg NODE_VERSION=$(NODE_VERSION) --progress plain -t libv8-node:$(VERSION)-musl-amd64 .
29+
docker run --platform linux/amd64 --rm -it -v "$(PWD)/pkg":/pkg libv8-node:$(VERSION)-musl-amd64 cp $@ /pkg/
3030

3131
pkg/libv8-node-$(VERSION)-aarch64-linux.gem:
32-
docker buildx build --platform linux/arm64 --build-arg RUBY_VERSION=3.4 --build-arg NODE_VERSION=$(NODE_VERSION) --progress plain -t libv8-node:$(VERSION)-gnu .
33-
docker run --platform linux/arm64 --rm -it -v "$(PWD)/pkg":/pkg libv8-node:$(VERSION)-gnu cp $@ /pkg/
32+
docker buildx build --platform linux/arm64 --build-arg RUBY_VERSION=3.4 --build-arg NODE_VERSION=$(NODE_VERSION) --progress plain -t libv8-node:$(VERSION)-gnu-arm64 .
33+
docker run --platform linux/arm64 --rm -it -v "$(PWD)/pkg":/pkg libv8-node:$(VERSION)-gnu-arm64 cp $@ /pkg/
3434

3535
pkg/libv8-node-$(VERSION)-aarch64-linux-musl.gem:
36-
docker buildx build --platform linux/arm64 --build-arg RUBY_VERSION=3.4-alpine --build-arg NODE_VERSION=$(NODE_VERSION) --progress plain -t libv8-node:$(VERSION)-musl .
37-
docker run --platform linux/arm64 --rm -it -v "$(PWD)/pkg":/pkg libv8-node:$(VERSION)-musl cp $@ /pkg/
36+
docker buildx build --platform linux/arm64 --build-arg RUBY_VERSION=3.4-alpine --build-arg NODE_VERSION=$(NODE_VERSION) --progress plain -t libv8-node:$(VERSION)-musl-arm64 .
37+
docker run --platform linux/arm64 --rm -it -v "$(PWD)/pkg":/pkg libv8-node:$(VERSION)-musl-arm64 cp $@ /pkg/
3838

3939
test/x86_64-linux: pkg/libv8-node-$(VERSION)-x86_64-linux.gem
4040
test -d test/mini_racer || git clone https://github.com/rubyjs/mini_racer.git test/mini_racer --depth 1
4141
cd test/mini_racer
4242
ruby -i -ne '$$_ =~ /^\s+LIBV8_NODE_VERSION/ ? print(" LIBV8_NODE_VERSION = \"$(VERSION)\"\n") : print' test/mini_racer/lib/mini_racer/version.rb
4343
ruby -i -ne '$$_ =~ /spec.required_ruby_version/ ? "" : print' test/mini_racer/mini_racer.gemspec
44-
docker run --platform linux/amd64 --rm -it -v "$(PWD)/test:/code/test" -w "/code/test/mini_racer" libv8-node:$(VERSION)-gnu sh -c 'gem install ../../$< && bundle install && bundle exec rake compile && bundle exec rake test'
44+
docker run --platform linux/amd64 --rm -it -v "$(PWD)/test:/code/test" -w "/code/test/mini_racer" libv8-node:$(VERSION)-gnu-amd64 sh -c 'gem install ../../$< && bundle install && bundle exec rake compile && bundle exec rake test'
4545

4646
test/x86_64-linux-musl: pkg/libv8-node-$(VERSION)-x86_64-linux-musl.gem
4747
test -d test/mini_racer || git clone https://github.com/rubyjs/mini_racer.git test/mini_racer --depth 1
4848
cd test/mini_racer
4949
ruby -i -ne '$$_ =~ /^\s+LIBV8_NODE_VERSION/ ? print(" LIBV8_NODE_VERSION = \"$(VERSION)\"\n") : print' test/mini_racer/lib/mini_racer/version.rb
5050
ruby -i -ne '$$_ =~ /spec.required_ruby_version/ ? "" : print' test/mini_racer/mini_racer.gemspec
51-
docker run --platform linux/amd64 --rm -it -v "$(PWD)/test:/code/test" -w "/code/test/mini_racer" libv8-node:$(VERSION)-musl sh -c 'gem install ../../$< && bundle install && bundle exec rake compile && bundle exec rake test'
51+
docker run --platform linux/amd64 --rm -it -v "$(PWD)/test:/code/test" -w "/code/test/mini_racer" libv8-node:$(VERSION)-musl-amd64 sh -c 'gem install ../../$< && bundle install && bundle exec rake compile && bundle exec rake test'
5252

5353
test/aarch64-linux: pkg/libv8-node-$(VERSION)-aarch64-linux.gem
5454
test -d test/mini_racer || git clone https://github.com/rubyjs/mini_racer.git test/mini_racer --depth 1
5555
cd test/mini_racer
5656
ruby -i -ne '$$_ =~ /^\s+LIBV8_NODE_VERSION/ ? print(" LIBV8_NODE_VERSION = \"$(VERSION)\"\n") : print' test/mini_racer/lib/mini_racer/version.rb
5757
ruby -i -ne '$$_ =~ /spec.required_ruby_version/ ? "" : print' test/mini_racer/mini_racer.gemspec
58-
docker run --platform linux/arm64 --rm -it -v "$(PWD)/test:/code/test" -w "/code/test/mini_racer" libv8-node:$(VERSION)-gnu sh -c 'gem install ../../$< && bundle install && bundle exec rake compile && bundle exec rake test'
58+
docker run --platform linux/arm64 --rm -it -v "$(PWD)/test:/code/test" -w "/code/test/mini_racer" libv8-node:$(VERSION)-gnu-arm64 sh -c 'gem install ../../$< && bundle install && bundle exec rake compile && bundle exec rake test'
5959

6060
test/aarch64-linux-musl: pkg/libv8-node-$(VERSION)-aarch64-linux-musl.gem
6161
test -d test/mini_racer || git clone https://github.com/rubyjs/mini_racer.git test/mini_racer --depth 1
6262
cd test/mini_racer
6363
ruby -i -ne '$$_ =~ /^\s+LIBV8_NODE_VERSION/ ? print(" LIBV8_NODE_VERSION = \"$(VERSION)\"\n") : print' test/mini_racer/lib/mini_racer/version.rb
6464
ruby -i -ne '$$_ =~ /spec.required_ruby_version/ ? "" : print' test/mini_racer/mini_racer.gemspec
65-
docker run --platform linux/arm64 --rm -it -v "$(PWD)/test:/code/test" -w "/code/test/mini_racer" libv8-node:$(VERSION)-musl sh -c 'gem install ../../$< && bundle install && bundle exec rake compile && bundle exec rake test'
65+
docker run --platform linux/arm64 --rm -it -v "$(PWD)/test:/code/test" -w "/code/test/mini_racer" libv8-node:$(VERSION)-musl-arm64 sh -c 'gem install ../../$< && bundle install && bundle exec rake compile && bundle exec rake test'

libexec/platform

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ host_platform="${triple}"
2929
target_platform="${TARGET_PLATFORM:-${1:-}}"
3030
target_platform="${target_platform:-${host_platform}}"
3131

32+
normalize_platform() {
33+
echo "$1" | sed -E 's/(x86_64|aarch64|armv[0-9]+|arm).*-linux-musl.*/\1-linux-musl/' | sed -E 's/(x86_64|aarch64|armv[0-9]+|arm).*-linux-gnu.*/\1-linux/' | sed -E 's/armv[0-9]+l?/arm/'
34+
}
35+
36+
norm_host=$(normalize_platform "${host_platform}")
37+
norm_target=$(normalize_platform "${target_platform}")
38+
3239
case "${target_platform}" in
3340
x86_64*-linux-musl)
3441
RUBY_TARGET_PLATFORM='x86_64-linux-musl'
@@ -57,7 +64,7 @@ case "${target_platform}" in
5764
RUBY_TARGET_PLATFORM='arm64-darwin'
5865
;;
5966
*)
60-
if [ "${host_platform}" != "${target_platform}" ]; then
67+
if [ "${norm_host}" != "${norm_target}" ]; then
6168
echo 'cross compilation not supported'
6269
exit 1
6370
fi
@@ -78,8 +85,8 @@ case "${host_platform}" in
7885
;;
7986
esac
8087

81-
if [ "${host_platform}" != "${target_platform}" ]; then
82-
echo "# cross compiling host: ${host_platform} target: ${target_platform}"
88+
if [ "${norm_host}" != "${norm_target}" ]; then
89+
echo "# cross compiling host: ${host_platform} (norm: ${norm_host}) target: ${target_platform} (norm: ${norm_target})"
8390
case "${target_platform}" in
8491
aarch64-*linux*)
8592
CC='aarch64-linux-gnu-gcc'

test/gtest/CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,12 @@ else()
3333
string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} system_arch)
3434
endif()
3535

36-
if(system_arch STREQUAL "aarch64")
37-
set(system_arch "arm64")
36+
if(system_arch MATCHES "^armv")
37+
set(system_arch "arm")
38+
endif()
39+
40+
if(NOT APPLE AND system_arch STREQUAL "arm64")
41+
set(system_arch "aarch64")
3842
endif()
3943

4044
set(vendor_arch "${system_arch}-${system_name}")

0 commit comments

Comments
 (0)