rake-compiler-dock 1.2.2 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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"