rake-compiler-dock 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +174 -51
- data/.github/workflows/publish-images.yml +67 -0
- data/.gitignore +2 -0
- data/CONTRIBUTING.md +38 -0
- data/Dockerfile.jruby +17 -14
- data/Dockerfile.mri.erb +84 -101
- data/History.md +30 -0
- data/README.md +53 -46
- data/Rakefile +21 -14
- data/build/mk_i686.rb +2 -0
- data/build/mk_osxcross.sh +38 -0
- data/build/parallel_docker_build.rb +21 -6
- data/build/patches/{ruby-3.1.0 → ruby-3.1.3}/no_sendfile.patch +0 -0
- data/build/patches2/{rake-compiler-1.1.6 → rake-compiler-1.2.1}/0004-Enable-build-of-static-libruby.patch +0 -0
- data/build/patches2/rake-compiler-1.2.1/0005-make-miniruby.patch +19 -0
- data/lib/rake_compiler_dock/starter.rb +35 -11
- data/lib/rake_compiler_dock/version.rb +2 -2
- data/test/env/Dockerfile.centos +3 -1
- data/test/rcd_test/Gemfile +1 -1
- data/test/rcd_test/Rakefile +9 -6
- data/test/rcd_test/ext/mri/extconf.rb +72 -0
- data/test/test_environment_variables.rb +27 -19
- data/test/test_parallel_docker_build.rb +1 -1
- data/test/test_starter.rb +119 -0
- metadata +10 -33
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -0
data/Dockerfile.mri.erb
CHANGED
@@ -8,9 +8,12 @@ manylinux = !!(image =~ /manylinux/)
|
|
8
8
|
%>
|
9
9
|
FROM <%= image %>
|
10
10
|
|
11
|
+
##
|
12
|
+
## RVM and native rubies
|
13
|
+
##
|
14
|
+
# Install packages which rvm will require
|
11
15
|
<% if manylinux %>
|
12
|
-
|
13
|
-
RUN yum install -y autoconf gcc-c++ libtool readline-devel sqlite-devel ruby openssl-devel xz cmake sudo less libffi-devel git wget
|
16
|
+
RUN yum install -y sudo ruby less git wget curl autoconf libtool cmake gcc-c++ xz readline-devel sqlite-devel openssl-devel libffi-devel libyaml-devel
|
14
17
|
|
15
18
|
# Prepare sudo and delete sudo as alias to gosu
|
16
19
|
RUN rm -f /usr/local/bin/sudo && \
|
@@ -19,7 +22,7 @@ RUN rm -f /usr/local/bin/sudo && \
|
|
19
22
|
<% else %>
|
20
23
|
ENV DEBIAN_FRONTEND noninteractive
|
21
24
|
RUN apt-get -y update && \
|
22
|
-
apt-get install -y curl git-core
|
25
|
+
apt-get install -y sudo wget autoconf cmake curl git-core pkg-config build-essential xz-utils unzip gnupg2 dirmngr zlib1g-dev libreadline-dev libsqlite0-dev libssl-dev libyaml-dev libffi-dev && \
|
23
26
|
rm -rf /var/lib/apt/lists/*
|
24
27
|
<% end %>
|
25
28
|
|
@@ -42,37 +45,34 @@ RUN mkdir ~/.gnupg && \
|
|
42
45
|
RUN gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB && \
|
43
46
|
(curl -L http://get.rvm.io | sudo bash) && \
|
44
47
|
bash -c " \
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
+
source /etc/rubybashrc && \
|
49
|
+
rvm autolibs disable && \
|
50
|
+
rvmsudo rvm cleanup all \
|
51
|
+
"
|
48
52
|
|
49
|
-
#
|
53
|
+
# Install native rubies and fix permissions
|
50
54
|
COPY build/patches /home/rvm/patches/
|
51
|
-
|
52
|
-
# install rubies and fix permissions on
|
53
|
-
ENV RVM_RUBIES 2.5.9 3.1.0
|
55
|
+
ENV RVM_RUBIES 2.5.9 3.1.3
|
54
56
|
RUN bash -c " \
|
55
|
-
|
56
|
-
|
57
|
+
export CFLAGS='-s -O3 -fno-fast-math -fPIC' && \
|
58
|
+
for v in ${RVM_RUBIES} ; do \
|
57
59
|
rvm install \$v --patch \$(echo ~/patches/ruby-\$v/* | tr ' ' ','); \
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
# Install rake-compiler and typical gems in all Rubies
|
63
|
-
# do not generate documentation for gems
|
64
|
-
RUN echo "gem: --no-ri --no-rdoc" >> ~/.gemrc && \
|
65
|
-
bash -c " \
|
66
|
-
rvm all do gem update --system --no-document && \
|
67
|
-
rvm all do gem install --no-document bundler 'bundler:~>1.16' 'rake-compiler:1.1.6' hoe mini_portile rubygems-tasks mini_portile2 && \
|
68
|
-
find /usr/local/rvm -type d -print0 | sudo xargs -0 chmod g+sw "
|
60
|
+
done && \
|
61
|
+
rvm cleanup all && \
|
62
|
+
find /usr/local/rvm -type d -print0 | sudo xargs -0 chmod g+sw \
|
63
|
+
"
|
69
64
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
65
|
+
RUN bash -c " \
|
66
|
+
echo "gem: --no-ri --no-rdoc" >> ~/.gemrc && \
|
67
|
+
rvm all do gem update --system --no-document && \
|
68
|
+
rvm all do gem update --no-document && \
|
69
|
+
rvm all do gem install bundler --no-document && \
|
70
|
+
find /usr/local/rvm -type d -print0 | sudo xargs -0 chmod g+sw \
|
71
|
+
"
|
72
|
+
|
73
|
+
##
|
74
|
+
## Cross compilers
|
75
|
+
##
|
76
76
|
USER root
|
77
77
|
|
78
78
|
<% if platform=~/x64-mingw-ucrt/ %>
|
@@ -97,89 +97,58 @@ if platform=~/x64-mingw32/ %> gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 <% end
|
|
97
97
|
rm -rf /var/lib/apt/lists/*
|
98
98
|
<% end %>
|
99
99
|
|
100
|
-
RUN bash -c " \
|
101
|
-
rvm alias create default 3.1.0 && \
|
102
|
-
rvm use default "
|
103
|
-
|
104
100
|
<% if manylinux %>
|
105
101
|
# Create dev tools x86-linux-*
|
106
102
|
COPY build/mk_i686.rb /root/
|
107
|
-
RUN
|
108
|
-
ruby /root/mk_i686.rb "
|
103
|
+
RUN /root/mk_i686.rb
|
109
104
|
<% end %>
|
110
105
|
|
111
106
|
<% if platform=~/darwin/ %>
|
112
|
-
|
113
|
-
|
114
|
-
curl -L -o MacOSX11.1.sdk.tar.xz https://github.com/larskanis/MacOSX-SDKs/releases/download/11.1/MacOSX11.1.sdk.tar.xz && \
|
115
|
-
tar -xf MacOSX11.1.sdk.tar.xz -C . && \
|
116
|
-
cp -rf /usr/lib/llvm-10/include/c++ MacOSX11.1.sdk/usr/include/c++ && \
|
117
|
-
cp -rf /usr/include/x86_64-linux-gnu/c++/9/bits/ MacOSX11.1.sdk/usr/include/c++/v1/bits && \
|
118
|
-
tar -cJf MacOSX11.1.sdk.tar.xz MacOSX11.1.sdk && \
|
119
|
-
cd /opt/osxcross && \
|
120
|
-
UNATTENDED=1 SDK_VERSION=11.1 OSX_VERSION_MIN=10.13 USE_CLANG_AS=1 ./build.sh && \
|
121
|
-
ln -s /usr/bin/llvm-config-10 /usr/bin/llvm-config && \
|
122
|
-
ENABLE_COMPILER_RT_INSTALL=1 SDK_VERSION=11.1 ./build_compiler_rt.sh && \
|
123
|
-
rm -rf *~ build tarballs/*
|
124
|
-
|
125
|
-
RUN echo "export PATH=/opt/osxcross/target/bin:\$PATH" >> /etc/rubybashrc && \
|
126
|
-
echo "export MACOSX_DEPLOYMENT_TARGET=10.13" >> /etc/rubybashrc && \
|
127
|
-
echo "export OSXCROSS_MP_INC=1" >> /etc/rubybashrc
|
128
|
-
|
129
|
-
# Add links to build tools without target version kind of:
|
130
|
-
# arm64-apple-darwin-clang => arm64-apple-darwin20.1-clang
|
131
|
-
RUN rm /opt/osxcross/target/bin/*-apple-darwin-* ; \
|
132
|
-
find /opt/osxcross/target/bin/ -name '*-apple-darwin[0-9]*' | sort | while read f ; do d=`echo $f | sed s/darwin[0-9\.]*/darwin/`; echo $f '"$@"' | tee $d && chmod +x $d ; done
|
133
|
-
|
134
|
-
# There's no objdump in osxcross but we can use llvm's
|
135
|
-
RUN ln -s /usr/lib/llvm-10/bin/llvm-objdump /opt/osxcross/target/bin/x86_64-apple-darwin-objdump && \
|
136
|
-
ln -s /usr/lib/llvm-10/bin/llvm-objdump /opt/osxcross/target/bin/aarch64-apple-darwin-objdump
|
137
|
-
|
107
|
+
COPY build/mk_osxcross.sh /home/rvm
|
108
|
+
RUN /home/rvm/mk_osxcross.sh
|
138
109
|
<% end %>
|
139
110
|
|
140
|
-
|
111
|
+
|
112
|
+
##
|
113
|
+
## Cross-compile rubies
|
114
|
+
##
|
141
115
|
USER rvm
|
116
|
+
|
117
|
+
RUN bash -c "rvm all do gem install --no-document rake-compiler:1.2.1"
|
118
|
+
|
119
|
+
# Install rake-compiler's cross rubies in global dir instead of /root
|
120
|
+
RUN sudo mkdir -p /usr/local/rake-compiler && \
|
121
|
+
sudo chown rvm.rvm /usr/local/rake-compiler && \
|
122
|
+
ln -s /usr/local/rake-compiler ~/.rake-compiler
|
123
|
+
|
124
|
+
# Patch rake-compiler to build and install static libraries for Linux rubies
|
142
125
|
COPY build/patches2 /home/rvm/patches/
|
143
126
|
RUN bash -c " \
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
# Patch rubies for cross build
|
151
|
-
#USER root
|
152
|
-
#RUN bash -c " \
|
153
|
-
# for v in 2.7.0 3.0.0 3.1.0 ; do \
|
154
|
-
# curl -SL http://cache.ruby-lang.org/pub/ruby/\${v:0:3}/ruby-\$v.tar.xz | tar -xJC /root/ && \
|
155
|
-
# cd /root/ruby-\$v && \
|
156
|
-
# git apply /home/rvm/patches/ruby-\$v/*.patch && \
|
157
|
-
# cd .. && \
|
158
|
-
# mkdir -p /usr/local/rake-compiler/sources/ && \
|
159
|
-
# tar cjf /usr/local/rake-compiler/sources/ruby-\$v.tar.bz2 ruby-\$v && \
|
160
|
-
# chown rvm /usr/local/rake-compiler -R && \
|
161
|
-
# rm -rf /root/ruby-\$v ; \
|
162
|
-
# done "
|
163
|
-
#USER rvm
|
127
|
+
for v in ${RVM_RUBIES} ; do \
|
128
|
+
cd /usr/local/rvm/gems/ruby-\$v/gems/rake-compiler-1.2.1 && \
|
129
|
+
echo applying patches to ruby-\$v /home/rvm/patches/rake-compiler-1.2.1/*.patch && \
|
130
|
+
( git apply /home/rvm/patches/rake-compiler-1.2.1/*.patch || true ) \
|
131
|
+
done \
|
132
|
+
"
|
164
133
|
|
165
134
|
<%
|
166
135
|
axrubies = if platform =~ /x64-mingw-ucrt/
|
167
136
|
[
|
168
137
|
# Rubyinstaller-3.1.0+ is platform x64-mingw-ucrt
|
169
|
-
["3.1.0", "3.1.
|
138
|
+
["3.2.0:3.1.0", "3.1.3", true],
|
170
139
|
]
|
171
140
|
elsif platform =~ /x64-mingw32/
|
172
141
|
[
|
173
142
|
# Rubyinstaller prior to 3.1.0 is platform x64-mingw32
|
174
143
|
["2.6.0:2.5.0:2.4.0", "2.5.9", false],
|
175
|
-
["3.0.0:2.7.0", "3.1.
|
144
|
+
["3.0.0:2.7.0", "3.1.3", true],
|
176
145
|
]
|
177
146
|
else
|
178
147
|
[
|
179
148
|
# Build xruby versions prior ruby2_keywords in parallel using ruby-2.5
|
180
149
|
["2.6.0:2.5.0:2.4.0", "2.5.9", false],
|
181
150
|
# Build xruby versions with ruby2_keywords in parallel using ruby-3.x
|
182
|
-
["3.1.0:3.0.0:2.7.0", "3.1.
|
151
|
+
["3.2.0:3.1.0:3.0.0:2.7.0", "3.1.3", true],
|
183
152
|
]
|
184
153
|
end
|
185
154
|
|
@@ -190,16 +159,17 @@ ENV XRUBIES <%= xrubies %>
|
|
190
159
|
# Build xruby versions in parallel
|
191
160
|
# Then cleanup all build artifacts
|
192
161
|
RUN bash -c " \
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
162
|
+
rvm use <%= rvm %> && \
|
163
|
+
export CPPFLAGS='<%= "-D__USE_MINGW_ANSI_STDIO=1" if platform=~/x64-mingw-ucrt/ %>' && \
|
164
|
+
export CFLAGS='-O1 -fno-omit-frame-pointer -fno-fast-math -fstack-protector-strong <%= strip %>' && \
|
165
|
+
export LDFLAGS='-pipe <%= strip %>' && \
|
166
|
+
<%= "export LIBS='-l:libssp.a' &&" if platform =~ /mingw/ %> \
|
167
|
+
<%= "export CC=#{target}-clang &&" if platform =~ /darwin/ %> \
|
168
|
+
export MAKE='make V=1 <%= "-j`nproc`" if parallel %>' && \
|
169
|
+
rake-compiler cross-ruby VERSION=$XRUBIES HOST=<%= target %> && \
|
170
|
+
rm -rf ~/.rake-compiler/builds ~/.rake-compiler/sources && \
|
171
|
+
find /usr/local/rvm -type d -print0 | sudo xargs -0 chmod g+sw \
|
172
|
+
"
|
203
173
|
<% end %>
|
204
174
|
|
205
175
|
<% if platform=~/linux/ %>
|
@@ -217,15 +187,26 @@ RUN find /usr/local/rake-compiler/ruby/*mingw*/ -name rbconfig.rb | while read f
|
|
217
187
|
# Raise Windows-API to Vista (affects ruby < 2.6 only)
|
218
188
|
RUN find /usr/local/rake-compiler/ruby -name rbconfig.rb | while read f ; do sed -i 's/0x0501/0x0600/' $f ; done
|
219
189
|
# Don't link to static libruby
|
220
|
-
RUN find /usr/local/rake-compiler/ruby -name
|
190
|
+
RUN find /usr/local/rake-compiler/ruby -name lib*-ruby*.dll.a | while read f ; do n=`echo $f | sed s/.dll//` ; mv $f $n ; done
|
221
191
|
<% end %>
|
222
192
|
|
193
|
+
# ruby-2.5 links to libcrypt, which isn't necessary for extensions
|
194
|
+
RUN find /usr/local/rake-compiler/ruby -name rbconfig.rb | while read f ; do sed -i 's/-lcrypt//' $f ; done
|
195
|
+
|
196
|
+
<% if platform=~/darwin/ %>
|
197
|
+
# ruby-3.2 on darwin links with `-bundle_loader`, see https://github.com/rake-compiler/rake-compiler-dock/issues/87
|
198
|
+
RUN find /usr/local/rake-compiler/ruby/*/*/lib/ruby/3.2.0 -name rbconfig.rb | \
|
199
|
+
while read f ; do sed -i 's/\["EXTDLDFLAGS"\] = "/&-Wl,-flat_namespace /' $f ; done
|
200
|
+
<% end %>
|
201
|
+
|
202
|
+
##
|
203
|
+
## Final adjustments
|
204
|
+
##
|
223
205
|
USER root
|
224
206
|
|
225
207
|
# Fix paths in rake-compiler/config.yml
|
226
208
|
RUN sed -i -- "s:/root/.rake-compiler:/usr/local/rake-compiler:g" /usr/local/rake-compiler/config.yml
|
227
209
|
|
228
|
-
|
229
210
|
<% if platform=~/mingw/ %>
|
230
211
|
# Install wrappers for strip commands as a workaround for "Protocol error" in boot2docker.
|
231
212
|
COPY build/strip_wrapper /root/
|
@@ -246,9 +227,6 @@ RUN echo "export PATH=\$DEVTOOLSET_ROOTPATH/usr/bin:\$PATH" >> /etc/rubybashrc
|
|
246
227
|
# Add prefixed versions of compiler tools
|
247
228
|
RUN for f in addr2line gcc gcov-tool ranlib ar dwp gcc-ranlib nm readelf as elfedit gcc-ar gprof objcopy size c++filt g++ gcov ld objdump strings cpp gcc-nm pkg-config strip ; do ln -sf $DEVTOOLSET_ROOTPATH/usr/bin/$f $DEVTOOLSET_ROOTPATH/usr/bin/<%= target %>-$f ; done
|
248
229
|
|
249
|
-
# ruby-2.5 links to libcrypt, which isn't necessary for extensions
|
250
|
-
RUN find /usr/local/rake-compiler/ruby -name rbconfig.rb | while read f ; do sed -i 's/-lcrypt//' $f ; done
|
251
|
-
|
252
230
|
# Use builtin functions of newer gcc to avoid linker issues on Musl based Linux
|
253
231
|
COPY build/math_h.patch /root/
|
254
232
|
RUN cd /usr/include/ && \
|
@@ -272,6 +250,11 @@ RUN echo "source /etc/profile.d/rcd-env.sh" >> /etc/rubybashrc
|
|
272
250
|
# Install sudoers configuration
|
273
251
|
COPY build/sudoers /etc/sudoers.d/rake-compiler-dock
|
274
252
|
|
275
|
-
|
253
|
+
RUN bash -c " \
|
254
|
+
rvm alias create default 3.1.3 && \
|
255
|
+
rvm use default \
|
256
|
+
"
|
257
|
+
|
258
|
+
ENV RUBY_CC_VERSION 3.2.0:3.1.0:3.0.0:2.7.0:2.6.0:2.5.0:2.4.0
|
276
259
|
|
277
260
|
CMD bash
|
data/History.md
CHANGED
@@ -1,3 +1,33 @@
|
|
1
|
+
1.3.0 / 2022-01-11
|
2
|
+
------------------
|
3
|
+
|
4
|
+
* Add Ruby 3.2 cross-compilation support.
|
5
|
+
* Update RVM installations to latest rubygems.
|
6
|
+
* Update to rake-compiler 1.2.1.
|
7
|
+
* Reduce pre-installed gems to only rake-compiler and bundler.
|
8
|
+
* Install yaml and ffi development headers in the base images, for psych and ffi gem compilation.
|
9
|
+
* Ensure autoconf is installed in the base iamges.
|
10
|
+
* Bump JRuby to 9.4.0.0
|
11
|
+
* Move docker images to ghcr.io/rake-compiler:
|
12
|
+
* `ghcr.io/rake-compiler/rake-compiler-dock-image:1.3.0-jruby`
|
13
|
+
* `ghcr.io/rake-compiler/rake-compiler-dock-image:1.3.0-mri-aarch64-linux`
|
14
|
+
* `ghcr.io/rake-compiler/rake-compiler-dock-image:1.3.0-mri-arm-linux`
|
15
|
+
* `ghcr.io/rake-compiler/rake-compiler-dock-image:1.3.0-mri-arm64-darwin`
|
16
|
+
* `ghcr.io/rake-compiler/rake-compiler-dock-image:1.3.0-mri-x64-mingw-ucrt`
|
17
|
+
* `ghcr.io/rake-compiler/rake-compiler-dock-image:1.3.0-mri-x64-mingw32`
|
18
|
+
* `ghcr.io/rake-compiler/rake-compiler-dock-image:1.3.0-mri-x86-linux`
|
19
|
+
* `ghcr.io/rake-compiler/rake-compiler-dock-image:1.3.0-mri-x86-mingw32`
|
20
|
+
* `ghcr.io/rake-compiler/rake-compiler-dock-image:1.3.0-mri-x86_64-darwin`
|
21
|
+
* `ghcr.io/rake-compiler/rake-compiler-dock-image:1.3.0-mri-x86_64-linux`
|
22
|
+
* Start publishing weekly image snapshots.
|
23
|
+
|
24
|
+
|
25
|
+
1.2.2 / 2022-06-27
|
26
|
+
------------------
|
27
|
+
|
28
|
+
* Fix ucrt libruby file naming for static build. #69
|
29
|
+
|
30
|
+
|
1
31
|
1.2.1 / 2022-03-17
|
2
32
|
------------------
|
3
33
|
|
data/README.md
CHANGED
@@ -95,51 +95,6 @@ For Linux:
|
|
95
95
|
You can also choose between different executable ruby versions by `rvm use <version>` .
|
96
96
|
The current default is 3.1.
|
97
97
|
|
98
|
-
|
99
|
-
### As a CI System Container
|
100
|
-
|
101
|
-
The OCI images provided by rake-compiler-dock can be used without the `rake-compiler-dock` gem or wrapper. This may be useful if your CI pipeline is building native gems.
|
102
|
-
|
103
|
-
For example, a Github Actions job might look like this:
|
104
|
-
|
105
|
-
``` yaml
|
106
|
-
jobs:
|
107
|
-
native-gem:
|
108
|
-
name: "native-gem"
|
109
|
-
runs-on: ubuntu-latest
|
110
|
-
container:
|
111
|
-
image: "larskanis/rake-compiler-dock-mri-x86_64-linux:1.2.1"
|
112
|
-
steps:
|
113
|
-
- uses: actions/checkout@v2
|
114
|
-
- run: bundle install && bundle exec rake gem:x86_64-linux:rcd
|
115
|
-
- uses: actions/upload-artifact@v2
|
116
|
-
with:
|
117
|
-
name: native-gem
|
118
|
-
path: gems
|
119
|
-
retention-days: 1
|
120
|
-
```
|
121
|
-
|
122
|
-
Where the referenced rake task might be defined by:
|
123
|
-
|
124
|
-
``` ruby
|
125
|
-
cross_platforms = ["x64-mingw32", "x86_64-linux", "x86_64-darwin", "arm64-darwin"]
|
126
|
-
|
127
|
-
namespace "gem" do
|
128
|
-
cross_platforms.each do |platform|
|
129
|
-
namespace platform do
|
130
|
-
task "rcd" do
|
131
|
-
Rake::Task["native:#{platform}"].invoke
|
132
|
-
Rake::Task["pkg/#{rcee_precompiled_spec.full_name}-#{Gem::Platform.new(platform)}.gem"].invoke
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
```
|
139
|
-
|
140
|
-
For an example of rake tasks that support this style of invocation, visit https://github.com/flavorjones/ruby-c-extensions-explained/tree/main/precompiled
|
141
|
-
|
142
|
-
|
143
98
|
### JRuby support
|
144
99
|
|
145
100
|
Rake-compiler-dock offers a dedicated docker image for JRuby.
|
@@ -220,6 +175,58 @@ gem 'rake-compiler-dock', '~> 1.2'
|
|
220
175
|
|
221
176
|
See [the wiki](https://github.com/rake-compiler/rake-compiler-dock/wiki/Projects-using-rake-compiler-dock) for projects which make use of rake-compiler-dock.
|
222
177
|
|
178
|
+
### As a CI System Container
|
179
|
+
|
180
|
+
The OCI images provided by rake-compiler-dock can be used without the `rake-compiler-dock` gem or wrapper. This may be useful if your CI pipeline is building native gems.
|
181
|
+
|
182
|
+
For example, a Github Actions job might look like this:
|
183
|
+
|
184
|
+
``` yaml
|
185
|
+
jobs:
|
186
|
+
native-gem:
|
187
|
+
name: "native-gem"
|
188
|
+
runs-on: ubuntu-latest
|
189
|
+
container:
|
190
|
+
image: "ghcr.io/rake-compiler/rake-compiler-dock-image:1.2.2-mri-x86_64-linux"
|
191
|
+
steps:
|
192
|
+
- uses: actions/checkout@v2
|
193
|
+
- run: bundle install && bundle exec rake gem:x86_64-linux:rcd
|
194
|
+
- uses: actions/upload-artifact@v2
|
195
|
+
with:
|
196
|
+
name: native-gem
|
197
|
+
path: gems
|
198
|
+
retention-days: 1
|
199
|
+
```
|
200
|
+
|
201
|
+
Where the referenced rake task might be defined by:
|
202
|
+
|
203
|
+
``` ruby
|
204
|
+
cross_platforms = ["x64-mingw32", "x86_64-linux", "x86_64-darwin", "arm64-darwin"]
|
205
|
+
|
206
|
+
namespace "gem" do
|
207
|
+
cross_platforms.each do |platform|
|
208
|
+
namespace platform do
|
209
|
+
task "rcd" do
|
210
|
+
Rake::Task["native:#{platform}"].invoke
|
211
|
+
Rake::Task["pkg/#{rcee_precompiled_spec.full_name}-#{Gem::Platform.new(platform)}.gem"].invoke
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
```
|
218
|
+
|
219
|
+
For an example of rake tasks that support this style of invocation, visit https://github.com/flavorjones/ruby-c-extensions-explained/tree/main/precompiled
|
220
|
+
|
221
|
+
|
222
|
+
### Living on the edge: using weekly snapshots
|
223
|
+
|
224
|
+
OCI images snapshotted from `master` are published weekly to Github Container Registry with the string "snapshot" in place of the version number in the tag name, e.g.:
|
225
|
+
|
226
|
+
- `ghcr.io/rake-compiler/rake-compiler-dock-image:snapshot-mri-x86_64-linux`
|
227
|
+
|
228
|
+
These images are intended for integration testing. They may not work properly and should not be considered production ready.
|
229
|
+
|
223
230
|
|
224
231
|
## Environment Variables
|
225
232
|
|
@@ -233,7 +240,7 @@ The following variables are recognized by rake-compiler-dock:
|
|
233
240
|
Must be a space separated list out of `x86-mingw32`, `x64-mingw-ucrt`, `x64-mingw32`, `x86-linux`, `x86_64-linux`, `arm-linux`, `aarch64-linux`, `x86_64-darwin` and `arm64-darwin`.
|
234
241
|
It is ignored when `rubyvm` is set to `:jruby`.
|
235
242
|
* `RCD_IMAGE` - The docker image that is downloaded and started.
|
236
|
-
Defaults to "
|
243
|
+
Defaults to "ghcr.io/rake-compiler/rake-compiler-dock-image:IMAGE_VERSION-PLATFORM" with an image version that is determined by the gem version.
|
237
244
|
|
238
245
|
The following variables are passed through to the docker container without modification:
|
239
246
|
|
data/Rakefile
CHANGED
@@ -6,9 +6,6 @@ require_relative "build/parallel_docker_build"
|
|
6
6
|
|
7
7
|
RakeCompilerDock::GemHelper.install_tasks
|
8
8
|
|
9
|
-
DOCKERHUB_USER = ENV['DOCKERHUB_USER'] || "larskanis"
|
10
|
-
docker_build_cmd = Shellwords.split(ENV['RCD_DOCKER_BUILD'] || "docker build")
|
11
|
-
|
12
9
|
platforms = [
|
13
10
|
["x86-mingw32", "i686-w64-mingw32"],
|
14
11
|
["x64-mingw32", "x86_64-w64-mingw32"],
|
@@ -29,7 +26,8 @@ namespace :build do
|
|
29
26
|
desc "Build image for platform #{platform}"
|
30
27
|
task platform => sdf
|
31
28
|
task sdf do
|
32
|
-
|
29
|
+
image_name = RakeCompilerDock::Starter.container_image_name(platform: platform)
|
30
|
+
sh(*RakeCompilerDock.docker_build_cmd(platform), "-t", image_name, "-f", "Dockerfile.mri.#{platform}", ".")
|
33
31
|
end
|
34
32
|
|
35
33
|
df = ERB.new(File.read("Dockerfile.mri.erb"), trim_mode: ">").result(binding)
|
@@ -40,16 +38,25 @@ namespace :build do
|
|
40
38
|
desc "Build image for JRuby"
|
41
39
|
task :jruby => "Dockerfile.jruby"
|
42
40
|
task "Dockerfile.jruby" do
|
43
|
-
|
41
|
+
image_name = RakeCompilerDock::Starter.container_image_name(rubyvm: "jruby")
|
42
|
+
sh(*RakeCompilerDock.docker_build_cmd("jruby"), "-t", image_name, "-f", "Dockerfile.jruby", ".")
|
44
43
|
end
|
45
44
|
|
46
|
-
RakeCompilerDock::ParallelDockerBuild.new(platforms.map{|pl, _| "Dockerfile.mri.#{pl}" } + ["Dockerfile.jruby"], workdir: "tmp/docker"
|
45
|
+
RakeCompilerDock::ParallelDockerBuild.new(platforms.map{|pl, _| "Dockerfile.mri.#{pl}" } + ["Dockerfile.jruby"], workdir: "tmp/docker")
|
47
46
|
|
48
47
|
desc "Build images for all MRI platforms in parallel"
|
49
|
-
|
48
|
+
if ENV['RCD_USE_BUILDX_CACHE']
|
49
|
+
task :mri => platforms.map(&:first)
|
50
|
+
else
|
51
|
+
multitask :mri => platforms.map(&:first)
|
52
|
+
end
|
50
53
|
|
51
54
|
desc "Build images for all platforms in parallel"
|
52
|
-
|
55
|
+
if ENV['RCD_USE_BUILDX_CACHE']
|
56
|
+
task :all => platforms.map(&:first) + ["jruby"]
|
57
|
+
else
|
58
|
+
multitask :all => platforms.map(&:first) + ["jruby"]
|
59
|
+
end
|
53
60
|
end
|
54
61
|
|
55
62
|
task :build => "build:all"
|
@@ -57,14 +64,14 @@ task :build => "build:all"
|
|
57
64
|
namespace :prepare do
|
58
65
|
desc "Build cross compiler for x64-mingw-ucrt aka RubyInstaller-3.1+"
|
59
66
|
task "mingw64-ucrt" do
|
60
|
-
sh(*docker_build_cmd, "-t", "
|
67
|
+
sh(*RakeCompilerDock.docker_build_cmd, "-t", "larskanis/mingw64-ucrt:20.04", ".",
|
61
68
|
chdir: "mingw64-ucrt")
|
62
69
|
end
|
63
70
|
end
|
64
71
|
|
65
72
|
desc "Run tests"
|
66
73
|
task :test do
|
67
|
-
sh
|
74
|
+
sh %Q{ruby -w -W2 -I. -Ilib -e "#{Dir["test/test_*.rb"].map{|f| "require '#{f}';"}.join}" -- -v #{ENV['TESTOPTS']}}
|
68
75
|
end
|
69
76
|
|
70
77
|
desc "Update predefined_user_group.rb"
|
@@ -92,12 +99,12 @@ end
|
|
92
99
|
namespace :release do
|
93
100
|
desc "push all docker images"
|
94
101
|
task :images do
|
95
|
-
|
96
|
-
sh
|
102
|
+
image_name = RakeCompilerDock::Starter.container_image_name(rubyvm: "jruby")
|
103
|
+
sh("docker", "push", image_name)
|
97
104
|
|
98
105
|
platforms.each do |platform, _|
|
99
|
-
|
100
|
-
sh
|
106
|
+
image_name = RakeCompilerDock::Starter.container_image_name(platform: platform)
|
107
|
+
sh("docker", "push", image_name)
|
101
108
|
end
|
102
109
|
end
|
103
110
|
end
|
data/build/mk_i686.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
#! /usr/bin/env bash
|
2
|
+
|
3
|
+
set -o errexit
|
4
|
+
set -o pipefail
|
5
|
+
set -x
|
6
|
+
|
7
|
+
git clone -q --depth=1 https://github.com/tpoechtrager/osxcross.git /opt/osxcross
|
8
|
+
rm -rf /opt/osxcross/.git
|
9
|
+
|
10
|
+
set +x
|
11
|
+
cd /opt/osxcross/tarballs
|
12
|
+
set -x
|
13
|
+
curl -L -o MacOSX11.1.sdk.tar.xz https://github.com/larskanis/MacOSX-SDKs/releases/download/11.1/MacOSX11.1.sdk.tar.xz
|
14
|
+
tar -xf MacOSX11.1.sdk.tar.xz -C .
|
15
|
+
cp -rf /usr/lib/llvm-10/include/c++ MacOSX11.1.sdk/usr/include/c++
|
16
|
+
cp -rf /usr/include/x86_64-linux-gnu/c++/9/bits/ MacOSX11.1.sdk/usr/include/c++/v1/bits
|
17
|
+
tar -cJf MacOSX11.1.sdk.tar.xz MacOSX11.1.sdk
|
18
|
+
|
19
|
+
set +x
|
20
|
+
cd /opt/osxcross
|
21
|
+
set -x
|
22
|
+
UNATTENDED=1 SDK_VERSION=11.1 OSX_VERSION_MIN=10.13 USE_CLANG_AS=1 ./build.sh
|
23
|
+
ln -s /usr/bin/llvm-config-10 /usr/bin/llvm-config
|
24
|
+
ENABLE_COMPILER_RT_INSTALL=1 SDK_VERSION=11.1 ./build_compiler_rt.sh
|
25
|
+
rm -rf *~ build tarballs/*
|
26
|
+
|
27
|
+
echo "export PATH=/opt/osxcross/target/bin:\$PATH" >> /etc/rubybashrc
|
28
|
+
echo "export MACOSX_DEPLOYMENT_TARGET=10.13" >> /etc/rubybashrc
|
29
|
+
echo "export OSXCROSS_MP_INC=1" >> /etc/rubybashrc
|
30
|
+
|
31
|
+
# Add links to build tools without target version kind of:
|
32
|
+
# arm64-apple-darwin-clang => arm64-apple-darwin20.1-clang
|
33
|
+
rm -f /opt/osxcross/target/bin/*-apple-darwin-*
|
34
|
+
find /opt/osxcross/target/bin/ -name '*-apple-darwin[0-9]*' | sort | while read f ; do d=`echo $f | sed s/darwin[0-9\.]*/darwin/`; echo $f '"$@"' | tee $d && chmod +x $d ; done
|
35
|
+
|
36
|
+
# There's no objdump in osxcross but we can use llvm's
|
37
|
+
ln -s /usr/lib/llvm-10/bin/llvm-objdump /opt/osxcross/target/bin/x86_64-apple-darwin-objdump
|
38
|
+
ln -s /usr/lib/llvm-10/bin/llvm-objdump /opt/osxcross/target/bin/aarch64-apple-darwin-objdump
|
@@ -2,15 +2,28 @@ require "fileutils"
|
|
2
2
|
require "rake"
|
3
3
|
|
4
4
|
module RakeCompilerDock
|
5
|
+
class << self
|
6
|
+
def docker_build_cmd(platform=nil)
|
7
|
+
cmd = if ENV['RCD_USE_BUILDX_CACHE']
|
8
|
+
if platform
|
9
|
+
cache_version = RakeCompilerDock::IMAGE_VERSION.split(".").take(2).join(".")
|
10
|
+
cache = File.join("cache", cache_version, platform)
|
11
|
+
"docker buildx build --cache-to=type=local,dest=#{cache},mode=max --cache-from=type=local,src=#{cache} --load"
|
12
|
+
else
|
13
|
+
return nil
|
14
|
+
end
|
15
|
+
else
|
16
|
+
ENV['RCD_DOCKER_BUILD'] || "docker build"
|
17
|
+
end
|
18
|
+
Shellwords.split(cmd)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
5
22
|
# Run docker builds in parallel, but ensure that common docker layers are reused
|
6
23
|
class ParallelDockerBuild
|
7
24
|
include Rake::DSL
|
8
25
|
|
9
|
-
|
10
|
-
|
11
|
-
def initialize(dockerfiles, workdir: "tmp/docker", inputdir: ".", task_prefix: "common-",
|
12
|
-
docker_build_cmd: %w["docker", "build"])
|
13
|
-
@docker_build_cmd = docker_build_cmd
|
26
|
+
def initialize(dockerfiles, workdir: "tmp/docker", inputdir: ".", task_prefix: "common-")
|
14
27
|
FileUtils.mkdir_p(workdir)
|
15
28
|
|
16
29
|
files = parse_dockerfiles(dockerfiles, inputdir)
|
@@ -100,7 +113,9 @@ module RakeCompilerDock
|
|
100
113
|
#
|
101
114
|
# The layers will be reused in subsequent builds, even if they run in parallel.
|
102
115
|
def docker_build(filename, workdir)
|
103
|
-
|
116
|
+
cmd = RakeCompilerDock.docker_build_cmd
|
117
|
+
return if cmd.nil?
|
118
|
+
sh(*RakeCompilerDock.docker_build_cmd, "-f", File.join(workdir, filename), ".")
|
104
119
|
end
|
105
120
|
end
|
106
121
|
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,19 @@
|
|
1
|
+
fix(temp): rake-compiler explicitly builds miniruby first
|
2
|
+
|
3
|
+
See https://bugs.ruby-lang.org/issues/19239 for the upstream bug
|
4
|
+
report.
|
5
|
+
|
6
|
+
TODO: This patch can be removed if that's fixed in a 3.2.0 final release.
|
7
|
+
|
8
|
+
diff --git a/tasks/bin/cross-ruby.rake b/tasks/bin/cross-ruby.rake
|
9
|
+
index 8317a2a..d9bfe4c 100644
|
10
|
+
--- a/tasks/bin/cross-ruby.rake
|
11
|
+
+++ b/tasks/bin/cross-ruby.rake
|
12
|
+
@@ -129,6 +129,7 @@
|
13
|
+
|
14
|
+
# make
|
15
|
+
file "#{build_dir}/ruby.exe" => ["#{build_dir}/Makefile"] do |t|
|
16
|
+
+ sh "#{MAKE} miniruby", chdir: File.dirname(t.prerequisites.first)
|
17
|
+
sh MAKE, chdir: File.dirname(t.prerequisites.first)
|
18
|
+
end
|
19
|
+
|