rake-compiler-dock 1.2.2 → 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/ %>
@@ -220,12 +190,23 @@ RUN find /usr/local/rake-compiler/ruby -name rbconfig.rb | while read f ; do sed
220
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,27 @@
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
+
1
25
  1.2.2 / 2022-06-27
2
26
  ------------------
3
27
 
data/README.md CHANGED
@@ -187,7 +187,7 @@ jobs:
187
187
  name: "native-gem"
188
188
  runs-on: ubuntu-latest
189
189
  container:
190
- image: "larskanis/rake-compiler-dock-mri-x86_64-linux:1.2.1"
190
+ image: "ghcr.io/rake-compiler/rake-compiler-dock-image:1.2.2-mri-x86_64-linux"
191
191
  steps:
192
192
  - uses: actions/checkout@v2
193
193
  - run: bundle install && bundle exec rake gem:x86_64-linux:rcd
@@ -218,6 +218,16 @@ end
218
218
 
219
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
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
+
230
+
221
231
  ## Environment Variables
222
232
 
223
233
  Rake-compiler-dock makes use of several environment variables.
@@ -230,7 +240,7 @@ The following variables are recognized by rake-compiler-dock:
230
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`.
231
241
  It is ignored when `rubyvm` is set to `:jruby`.
232
242
  * `RCD_IMAGE` - The docker image that is downloaded and started.
233
- 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.
234
244
 
235
245
  The following variables are passed through to the docker container without modification:
236
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
+
@@ -40,17 +40,9 @@ module RakeCompilerDock
40
40
  end
41
41
  user = options.fetch(:username){ current_user }
42
42
  group = options.fetch(:groupname){ current_group }
43
- rubyvm = options.fetch(:rubyvm){ ENV['RCD_RUBYVM'] } || "mri"
44
- jrubyvm = rubyvm.to_s == "jruby"
45
-
46
- platforms = options.fetch(:platform){ ENV['RCD_PLATFORM'] } || (jrubyvm ? "jruby" : "x86-mingw32 x64-mingw32")
47
- platforms.split(" ").each do |platform|
48
- image_name = options.fetch(:image) do
49
- platform_postfix = jrubyvm ? "" : "-#{platform}"
50
- ENV['RCD_IMAGE'] ||
51
- ENV['RAKE_COMPILER_DOCK_IMAGE'] ||
52
- "larskanis/rake-compiler-dock-#{rubyvm}#{platform_postfix}:#{IMAGE_VERSION}"
53
- end
43
+
44
+ platforms(options).split(" ").each do |platform|
45
+ image_name = container_image_name(options.merge(platform: platform))
54
46
 
55
47
  check = check_docker(mountdir) if options.fetch(:check_docker){ true }
56
48
  docker_opts = options.fetch(:options) do
@@ -166,6 +158,38 @@ module RakeCompilerDock
166
158
  def sanitize_windows_path(path)
167
159
  path.gsub(/^([a-z]):/i){ "/#{$1.downcase}" }
168
160
  end
161
+
162
+ def container_image_name(options={})
163
+ options.fetch(:image) do
164
+ image_name = ENV['RCD_IMAGE'] || ENV['RAKE_COMPILER_DOCK_IMAGE']
165
+ return image_name unless image_name.nil?
166
+
167
+ "%s/rake-compiler-dock-image:%s-%s%s" % [
168
+ container_registry,
169
+ options.fetch(:version) { IMAGE_VERSION },
170
+ container_rubyvm(options),
171
+ container_jrubyvm?(options) ? "" : "-#{options.fetch(:platform)}",
172
+ ]
173
+ end
174
+ end
175
+
176
+ def container_registry
177
+ ENV['CONTAINER_REGISTRY'] || "ghcr.io/rake-compiler"
178
+ end
179
+
180
+ def container_rubyvm(options={})
181
+ return "jruby" if options[:platform] == "jruby"
182
+ options.fetch(:rubyvm) { ENV['RCD_RUBYVM'] } || "mri"
183
+ end
184
+
185
+ def container_jrubyvm?(options={})
186
+ container_rubyvm(options).to_s == "jruby"
187
+ end
188
+
189
+ def platforms(options={})
190
+ options.fetch(:platform) { ENV['RCD_PLATFORM'] } ||
191
+ (container_jrubyvm?(options) ? "jruby" : "x86-mingw32 x64-mingw32")
192
+ end
169
193
  end
170
194
  end
171
195
  end
@@ -1,4 +1,4 @@
1
1
  module RakeCompilerDock
2
- VERSION = "1.2.2"
3
- IMAGE_VERSION = "1.2.2"
2
+ VERSION = "1.3.0"
3
+ IMAGE_VERSION = "1.3.0"
4
4
  end
@@ -11,7 +11,9 @@ RUN yum install -y ruby git
11
11
 
12
12
  RUN ruby --version
13
13
  RUN gem env
14
- RUN gem inst bundler
14
+
15
+ # centos-8 comes with Ruby 2.5, and this is the last version of bundler that supports it
16
+ RUN gem install bundler -v2.2.28
15
17
 
16
18
  WORKDIR /build
17
19
 
@@ -7,5 +7,5 @@ gemspec
7
7
 
8
8
  gem "rake", "~> 13.0"
9
9
  gem "rake-compiler"
10
- gem "rake-compiler-dock"
10
+ gem "rake-compiler-dock", path: "../.."
11
11
  gem "minitest", "~> 5.0"