rake-compiler-dock 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
- # install packages which rvm will require
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 xz-utils build-essential zlib1g-dev libreadline-dev libssl-dev wget unzip sudo gnupg2 dirmngr cmake pkg-config && \
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
- source /etc/rubybashrc && \
46
- rvm autolibs disable && \
47
- rvmsudo rvm cleanup all "
48
+ source /etc/rubybashrc && \
49
+ rvm autolibs disable && \
50
+ rvmsudo rvm cleanup all \
51
+ "
48
52
 
49
- # Import patch files for ruby and gems
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
- export CFLAGS='-s -O3 -fno-fast-math -fPIC' && \
56
- for v in ${RVM_RUBIES} ; do \
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
- done && \
59
- rvm cleanup all && \
60
- find /usr/local/rvm -type d -print0 | sudo xargs -0 chmod g+sw "
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
- # Install rake-compiler's cross rubies in global dir instead of /root
71
- RUN sudo mkdir -p /usr/local/rake-compiler && \
72
- sudo chown rvm.rvm /usr/local/rake-compiler && \
73
- ln -s /usr/local/rake-compiler ~/.rake-compiler
74
-
75
- # Add cross compilers for Windows and Linux
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 bash -c " \
108
- ruby /root/mk_i686.rb "
103
+ RUN /root/mk_i686.rb
109
104
  <% end %>
110
105
 
111
106
  <% if platform=~/darwin/ %>
112
- RUN git clone -q --depth=1 https://github.com/tpoechtrager/osxcross.git /opt/osxcross && rm -rf /opt/osxcross/.git && \
113
- cd /opt/osxcross/tarballs && \
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
- # Patch rake-compiler to build and install static libraries for Linux rubies
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
- for v in ${RVM_RUBIES} ; do \
145
- cd /usr/local/rvm/gems/ruby-\$v/gems/rake-compiler-1.1.6 && \
146
- echo applying patches to ruby-\$v /home/rvm/patches/rake-compiler-1.1.6/*.patch && \
147
- ( git apply /home/rvm/patches/rake-compiler-1.1.6/*.patch || true ) \
148
- done "
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.0", true],
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.0", true],
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.0", true],
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
- rvm use <%= rvm %> && \
194
- export CPPFLAGS='<%= "-D__USE_MINGW_ANSI_STDIO=1" if platform=~/x64-mingw-ucrt/ %>' && \
195
- export CFLAGS='-O1 -fno-omit-frame-pointer -fno-fast-math -fstack-protector-strong <%= strip %>' && \
196
- export LDFLAGS='-pipe <%= strip %>' && \
197
- <%= "export LIBS='-l:libssp.a' &&" if platform =~ /mingw/ %> \
198
- <%= "export CC=#{target}-clang &&" if platform =~ /darwin/ %> \
199
- export MAKE='make V=1 <%= "-j`nproc`" if parallel %>' && \
200
- rake-compiler cross-ruby VERSION=$XRUBIES HOST=<%= target %> && \
201
- rm -rf ~/.rake-compiler/builds ~/.rake-compiler/sources && \
202
- find /usr/local/rvm -type d -print0 | sudo xargs -0 chmod g+sw "
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 *msvcrt-ruby*.dll.a | while read f ; do n=`echo $f | sed s/.dll//` ; mv $f $n ; done
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
- ENV RUBY_CC_VERSION 3.1.0:3.0.0:2.7.0:2.6.0:2.5.0:2.4.0
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 "larskanis/rake-compiler-dock:IMAGE_VERSION" with an image version that is determined by the gem version.
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
- sh(*docker_build_cmd, "-t", "#{DOCKERHUB_USER}/rake-compiler-dock-mri-#{platform}:#{RakeCompilerDock::IMAGE_VERSION}", "-f", "Dockerfile.mri.#{platform}", ".")
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
- sh(*docker_build_cmd, "-t", "#{DOCKERHUB_USER}/rake-compiler-dock-jruby:#{RakeCompilerDock::IMAGE_VERSION}", "-f", "Dockerfile.jruby", ".")
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", docker_build_cmd: docker_build_cmd)
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
- multitask :mri => platforms.map(&:first)
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
- multitask :all => platforms.map(&:first) + ["jruby"]
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", "#{DOCKERHUB_USER}/mingw64-ucrt:20.04", ".",
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 "ruby -w -W2 -I. -Ilib -e \"#{Dir["test/test_*.rb"].map{|f| "require '#{f}';"}.join}\" -- -v"
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
- jimg = "#{DOCKERHUB_USER}/rake-compiler-dock-jruby:#{RakeCompilerDock::IMAGE_VERSION}"
96
- sh "docker", "push", jimg
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
- img = "#{DOCKERHUB_USER}/rake-compiler-dock-mri-#{platform}:#{RakeCompilerDock::IMAGE_VERSION}"
100
- sh "docker", "push", img
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
@@ -1,3 +1,5 @@
1
+ #! /usr/bin/env ruby
2
+
1
3
  require "fileutils"
2
4
 
3
5
  Dir["/usr/bin/x86_64-linux-gnu-*"].each do |file|
@@ -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
- attr_reader :docker_build_cmd
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
- sh(*docker_build_cmd, "-f", File.join(workdir, filename), ".")
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
@@ -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
+