Skip to content

Commit 6854cb3

Browse files
authored
Merge pull request #111 from rake-compiler/flavorjones-202312-musl-support
first-class support for musl platforms
2 parents 2645c87 + 93fce12 commit 6854cb3

17 files changed

+359
-103
lines changed

.github/workflows/ci.yml

Lines changed: 144 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,26 @@ jobs:
4545
fail-fast: false
4646
matrix:
4747
include:
48-
- platform: aarch64-linux
49-
- platform: arm-linux
48+
- platform: aarch64-linux-gnu
49+
alias: aarch64-linux
50+
- platform: aarch64-linux-musl
51+
- platform: arm-linux-gnu
52+
alias: arm-linux
53+
- platform: arm-linux-musl
5054
- platform: arm64-darwin
5155
- platform: jruby
5256
- platform: x64-mingw-ucrt
5357
static: true
5458
- platform: x64-mingw32
5559
static: true
56-
- platform: x86-linux
60+
- platform: x86-linux-gnu
61+
alias: x86-linux
62+
- platform: x86-linux-musl
5763
- platform: x86-mingw32
5864
- platform: x86_64-darwin
59-
- platform: x86_64-linux
65+
- platform: x86_64-linux-gnu
66+
alias: x86_64-linux
67+
- platform: x86_64-linux-musl
6068
runs-on: ubuntu-latest
6169
steps:
6270
- uses: actions/checkout@v3
@@ -114,23 +122,29 @@ jobs:
114122
name: gem-${{ matrix.platform }}-static
115123
path: test/rcd_test/pkg/*-*-*.gem
116124

125+
- if: matrix.alias
126+
name: Build native gem ${{ matrix.alias }}
127+
run: |
128+
cd test/rcd_test/
129+
bundle install
130+
bundle exec rake clean clobber
131+
bundle exec rake gem:${{ matrix.alias }}
132+
133+
- if: matrix.alias
134+
name: Upload native gem ${{ matrix.alias }}
135+
uses: actions/upload-artifact@v3
136+
with:
137+
name: gem-${{ matrix.alias }}
138+
path: test/rcd_test/pkg/*-*-*.gem
139+
117140
test_source_gem:
118-
name: test source
141+
name: source gem
119142
needs: build_source_gem
120143
strategy:
121144
fail-fast: false
122145
matrix:
123-
os:
124-
- ubuntu
125-
ruby:
126-
- "3.3"
127-
- "3.2"
128-
- "3.1"
129-
- "3.0"
130-
- "2.7"
131-
- "2.6"
132-
- "2.5"
133-
- "2.4"
146+
os: [ubuntu]
147+
ruby: ["3.3", "3.2", "3.1", "3.0", "2.7", "2.6", "2.5", "2.4"]
134148
runs-on: ${{ matrix.os }}-latest
135149
steps:
136150
- uses: actions/checkout@v3
@@ -141,37 +155,117 @@ jobs:
141155
uses: actions/download-artifact@v3
142156
with:
143157
name: gem-ruby
144-
- name: Install source gem
145-
run: gem install --local *.gem --verbose
146158
- name: Test source gem
147159
run: |
160+
gem install --local *.gem --verbose
148161
cd test/rcd_test/
149162
bundle install
150163
ruby -rrcd_test -S rake test
151164
152-
test_native_gem:
153-
name: test native
165+
test-x86_64-linux-setup-ruby:
166+
name: "${{ matrix.platform }} setup-ruby(${{ matrix.ruby }})"
154167
needs: build_native_gem
155168
strategy:
156169
fail-fast: false
157170
matrix:
158-
os:
159-
- macos
160-
- ubuntu
161-
ruby:
162-
- "3.3"
163-
- "3.2"
164-
- "3.1"
165-
- "3.0"
166-
- "2.7"
167-
- "2.6"
168-
- "2.5"
169-
- "2.4"
171+
platform: [x86_64-linux, x86_64-linux-gnu]
172+
ruby: ["3.3", "3.2", "3.1", "3.0", "2.7", "2.6", "2.5", "2.4"]
173+
include:
174+
# declare rubygems for each ruby version
175+
- { ruby: "2.7", rubygems: "3.4.22" }
176+
- { ruby: "2.6", rubygems: "3.4.22" }
177+
- { ruby: "2.5", rubygems: "3.3.26" }
178+
- { ruby: "2.4", rubygems: "3.3.26" }
179+
runs-on: ubuntu-latest
180+
steps:
181+
- uses: actions/checkout@v3
182+
- uses: ruby/setup-ruby@v1
183+
with:
184+
ruby-version: ${{ matrix.ruby }}
185+
- name: Download gem-${{ matrix.platform }}
186+
uses: actions/download-artifact@v3
187+
with:
188+
name: gem-${{ matrix.platform }}
189+
- name: Test gem-${{ matrix.platform }}
190+
run: |
191+
gem update --system ${{ matrix.rubygems }}
192+
gem install --local *.gem --verbose
193+
cd test/rcd_test/
194+
bundle install
195+
ruby -rrcd_test -S rake test
196+
197+
test_architecture_matrix:
198+
name: "${{ matrix.platform }} ${{ matrix.ruby }}"
199+
needs: build_native_gem
200+
strategy:
201+
fail-fast: false
202+
matrix:
203+
platform:
204+
- aarch64-linux
205+
- aarch64-linux-gnu
206+
- aarch64-linux-musl
207+
- arm-linux
208+
- arm-linux-gnu
209+
- arm-linux-musl
210+
- x86-linux
211+
- x86-linux-gnu
212+
- x86-linux-musl
213+
- x86_64-linux
214+
- x86_64-linux-gnu
215+
- x86_64-linux-musl
216+
ruby: ["3.3", "3.2", "3.1", "3.0", "2.7", "2.6", "2.5", "2.4"]
217+
include:
218+
# declare rubygems for each ruby version
219+
- { ruby: "2.7", rubygems: "3.4.22" }
220+
- { ruby: "2.6", rubygems: "3.4.22" }
221+
- { ruby: "2.5", rubygems: "3.3.26" }
222+
- { ruby: "2.4", rubygems: "3.3.26" }
223+
# declare docker image for each platform
224+
- { platform: aarch64-linux-musl, docker_tag: "-alpine" }
225+
- { platform: arm-linux-musl, docker_tag: "-alpine" }
226+
- { platform: x86-linux-musl, docker_tag: "-alpine" }
227+
- { platform: x86_64-linux-musl, docker_tag: "-alpine" }
228+
# declare docker platform for each platform
229+
- { platform: aarch64-linux, docker_platform: "--platform=linux/arm64" }
230+
- { platform: aarch64-linux-gnu, docker_platform: "--platform=linux/arm64" }
231+
- { platform: aarch64-linux-musl, docker_platform: "--platform=linux/arm64" }
232+
- { platform: arm-linux, docker_platform: "--platform=linux/arm/v7" }
233+
- { platform: arm-linux-gnu, docker_platform: "--platform=linux/arm/v7" }
234+
- { platform: arm-linux-musl, docker_platform: "--platform=linux/arm/v7" }
235+
- { platform: x86-linux, docker_platform: "--platform=linux/386" }
236+
- { platform: x86-linux-gnu, docker_platform: "--platform=linux/386" }
237+
- { platform: x86-linux-musl, docker_platform: "--platform=linux/386" }
238+
runs-on: ubuntu-latest
239+
steps:
240+
- uses: actions/checkout@v3
241+
- name: Download gem-${{ matrix.platform }}
242+
uses: actions/download-artifact@v3
243+
with:
244+
name: gem-${{ matrix.platform }}
245+
- name: Run tests
246+
run: |
247+
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
248+
docker run --rm -v $PWD:/work -w /work \
249+
${{ matrix.docker_platform}} ruby:${{ matrix.ruby }}${{ matrix.docker_tag }} \
250+
sh -c "
251+
gem update --system ${{ matrix.rubygems }} &&
252+
gem install --local *.gem --verbose &&
253+
cd test/rcd_test/ &&
254+
bundle install &&
255+
ruby -rrcd_test -S rake test
256+
"
257+
258+
test_the_rest:
259+
name: "${{ matrix.platform }} ${{ matrix.ruby }}"
260+
needs: build_native_gem
261+
strategy:
262+
fail-fast: false
263+
matrix:
264+
os: [macos]
265+
ruby: ["3.3", "3.2", "3.1", "3.0", "2.7", "2.6", "2.5", "2.4"]
170266
include:
171267
- os: macos
172268
platform: x86_64-darwin
173-
- os: ubuntu
174-
platform: x86_64-linux
175269
- os: ubuntu
176270
ruby: jruby
177271
platform: jruby
@@ -213,16 +307,15 @@ jobs:
213307
uses: actions/download-artifact@v3
214308
with:
215309
name: gem-${{ matrix.platform }}
216-
- name: Install gem-${{ matrix.platform }}
217-
run: gem install --local *.gem --verbose
218-
- name: Run tests
310+
- name: Test gem-${{ matrix.platform }}
219311
run: |
312+
gem install --local *.gem --verbose
220313
cd test/rcd_test/
221314
bundle install
222315
ruby -rrcd_test -S rake test
223316
224-
test_static_native_gem:
225-
name: test static
317+
test_windows_static:
318+
name: "static ${{ matrix.platform }} ${{ matrix.ruby }}"
226319
needs: build_native_gem
227320
strategy:
228321
fail-fast: false
@@ -266,35 +359,37 @@ jobs:
266359
uses: actions/download-artifact@v3
267360
with:
268361
name: gem-${{ matrix.platform }}-static
269-
- name: Install gem-${{ matrix.platform }}-static
270-
run: gem install --local *.gem --verbose
271-
- name: Run tests
362+
- name: Test gem-${{ matrix.platform }}-static
272363
run: |
364+
gem install --local *.gem --verbose
273365
cd test/rcd_test/
274366
bundle install
275367
ruby -rrcd_test -S rake test
276368
277-
test_native_gem_multiarch:
278-
name: ${{ matrix.platform }} on ${{ matrix.from_image }}
369+
test_ad_hoc:
370+
name: "${{ matrix.platform }} on ${{ matrix.from_image }}"
279371
needs: build_native_gem
280372
strategy:
281373
fail-fast: false
282374
matrix:
283375
include:
284376
- from_image: amd64/centos
285-
platform: x86_64-linux
377+
platform: x86_64-linux # centos-8 ships ruby 2.5, rubygems won't recognize -gnu suffix
286378
dockerfile: centos
287379
- from_image: navikey/raspbian-bullseye
288-
platform: arm-linux
380+
platform: arm-linux # bullseye ships ruby 2.7, rubygems won't recognize -gnu suffix
289381
dockerfile: debian
290382
- from_image: arm64v8/ubuntu
291-
platform: aarch64-linux
383+
platform: aarch64-linux # arm64v8 ships ruby 3.0, rubygems won't recognize -gnu suffix
292384
dockerfile: debian
293385
- from_image: i386/alpine
294-
platform: x86-linux
386+
platform: x86-linux-musl
295387
dockerfile: alpine
296388
- from_image: arm32v6/alpine
297-
platform: arm-linux
389+
platform: arm-linux-musl
390+
dockerfile: alpine
391+
- from_image: alpine
392+
platform: x86_64-linux-musl
298393
dockerfile: alpine
299394
runs-on: ubuntu-latest
300395
steps:

.github/workflows/publish-images.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ jobs:
1313
fail-fast: false
1414
matrix:
1515
platform:
16-
- x86-mingw32
16+
- aarch64-linux-gnu
17+
- arm-linux-gnu
18+
- arm64-darwin
1719
- x64-mingw-ucrt
1820
- x64-mingw32
19-
- x86-linux
20-
- x86_64-linux
21+
- x86-linux-gnu
22+
- x86-mingw32
2123
- x86_64-darwin
22-
- arm64-darwin
23-
- arm-linux
24-
- aarch64-linux
24+
- x86_64-linux-gnu
2525
- jruby
2626
runs-on: ubuntu-latest
2727
steps:

.gitignore

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
/.bundle/
22
/.yardoc
3-
/Dockerfile.mri.aarch64-linux
4-
/Dockerfile.mri.arm-linux
3+
/Dockerfile.mri.aarch64-linux-gnu
4+
/Dockerfile.mri.aarch64-linux-musl
5+
/Dockerfile.mri.arm-linux-gnu
6+
/Dockerfile.mri.arm-linux-musl
57
/Dockerfile.mri.arm64-darwin
6-
/Dockerfile.mri.arm64-linux
78
/Dockerfile.mri.x64-mingw-ucrt
89
/Dockerfile.mri.x64-mingw32
9-
/Dockerfile.mri.x86-linux
10+
/Dockerfile.mri.x86-linux-gnu
11+
/Dockerfile.mri.x86-linux-musl
1012
/Dockerfile.mri.x86-mingw32
1113
/Dockerfile.mri.x86_64-darwin
12-
/Dockerfile.mri.x86_64-linux
14+
/Dockerfile.mri.x86_64-linux-gnu
15+
/Dockerfile.mri.x86_64-linux-musl
1316
/Gemfile.lock
1417
/_yardoc/
1518
/cache/

Dockerfile.mri.erb

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<%
22
image = case platform
3-
when /x86_64-linux/ then "quay.io/pypa/manylinux2014_x86_64"
4-
when /x86-linux/ then "quay.io/pypa/manylinux2014_i686"
3+
when /x86_64-linux-gnu/ then "quay.io/pypa/manylinux2014_x86_64"
4+
when /x86-linux-gnu/ then "quay.io/pypa/manylinux2014_i686"
55
else "ubuntu:20.04"
66
end
77
manylinux = !!(image =~ /manylinux/)
@@ -64,12 +64,16 @@ COPY --from=larskanis/mingw64-ucrt:20.04 \
6464
/debs/
6565
RUN dpkg -i /debs/*.deb
6666

67+
<% elsif platform =~ /linux-musl/ %>
68+
COPY build/mk_musl_cross.sh /tmp
69+
RUN /tmp/mk_musl_cross.sh <%= target %>
70+
6771
<% elsif !manylinux %>
6872
RUN apt-get -y update && \
6973
apt-get install -y <%
7074
if platform =~ /darwin/ %> clang python lzma-dev libxml2-dev libssl-dev libc++-10-dev <% end %><%
71-
if platform =~ /aarch64-linux/ %> gcc-aarch64-linux-gnu g++-aarch64-linux-gnu <% end %><%
72-
if platform =~ /arm-linux/ %> gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf <% end %><%
75+
if platform =~ /aarch64-linux-gnu/ %> gcc-aarch64-linux-gnu g++-aarch64-linux-gnu <% end %><%
76+
if platform =~ /arm-linux-gnu/ %> gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf <% end %><%
7377
if platform =~ /x86-mingw32/ %> gcc-mingw-w64-i686 g++-mingw-w64-i686 <% end %><%
7478
if platform =~ /x64-mingw32/ %> gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 <% end %> && \
7579
rm -rf /var/lib/apt/lists/*
@@ -144,11 +148,9 @@ else
144148
]
145149
end
146150

147-
xrubies_build_plan.each do |xrubies, bootstrap_ruby_version| %>
148-
ENV XRUBIES <%= xrubies %>
151+
strip = '-s' if platform !~ /darwin/
149152

150-
<% strip = '-s' if platform !~ /darwin/ %>
151-
# Build xruby versions, then cleanup all build artifacts
153+
xrubies_build_plan.each do |xrubies, bootstrap_ruby_version| %>
152154
RUN bash -c " \
153155
rbenv shell <%= bootstrap_ruby_version %> && \
154156
export CPPFLAGS='<%= "-D__USE_MINGW_ANSI_STDIO=1" if platform =~ /x64-mingw-ucrt/ %>' && \
@@ -157,7 +159,7 @@ RUN bash -c " \
157159
<%= "export LIBS='-l:libssp.a' &&" if platform =~ /mingw/ %> \
158160
<%= "export CC=#{target}-clang &&" if platform =~ /darwin/ %> \
159161
export MAKE='make V=1' && \
160-
rake-compiler cross-ruby VERSION=$XRUBIES HOST=<%= target %> && \
162+
rake-compiler cross-ruby VERSION=<%= xrubies %> HOST=<%= target %> && \
161163
rm -rf ~/.rake-compiler/builds ~/.rake-compiler/sources \
162164
"
163165
<% end %>

History.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
next / unreleased
22
-----------------
33

4+
* Linux builds and their images are now fully qualified with the libc flavor. So, `x86_64-linux`
5+
should now be referred to as `x86_64-linux-gnu`, and the generated files are also named with the
6+
libc name.
47
* Replace `rvm` with `rbenv` and `ruby-build`
58
- `rvm` has been replaced by `rbenv` and `ruby-build`
69
- no longer applying sendfile patches to bootstrap rubies

0 commit comments

Comments
 (0)