rake-compiler-dock 0.7.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.gitignore +4 -0
  5. data/Dockerfile.jruby +12 -8
  6. data/Dockerfile.mri.erb +231 -0
  7. data/History.md +56 -0
  8. data/README.md +86 -15
  9. data/Rakefile +44 -4
  10. data/{lib/rake_compiler_dock → build}/gem_helper.rb +0 -15
  11. data/build/parallel_docker_build.rb +102 -0
  12. data/build/patches/{ruby-2.5.3 → ruby-2.5.8}/no_sendfile.patch +1 -1
  13. data/build/patches/ruby-3.0.0/no_sendfile.patch +24 -0
  14. data/build/patches2/hoe-3.20.0/0001-Load-encrypted-private-key-using-ENV-GEM_PRIVATE_KEY.patch +32 -0
  15. data/build/patches2/rake-compiler-1.1.1/0001-Fix-determining-of-ruby-versions-in-rake-native-gem.patch +44 -0
  16. data/build/patches2/rake-compiler-1.1.1/0003-Allow-building-of-cross-rubies-in-parallel.patch +214 -0
  17. data/build/patches2/rake-compiler-1.1.1/0004-Enable-build-of-static-libruby.patch +29 -0
  18. data/build/patches2/rake-compiler-1.1.1/0005-Don-t-mask-out-build-env-vars-for-cross-ruby.patch +30 -0
  19. data/build/patches2/rake-compiler-1.1.1/0006-Use-RAKE_EXTENSION_TASK_NO_NATIVE-env-var-as-the-def.patch +26 -0
  20. data/build/patches2/ruby-2.7.0/ruby2_keywords.patch +15 -0
  21. data/build/patches2/ruby-3.0.0/ruby2_keywords.patch +15 -0
  22. data/build/runas +4 -1
  23. data/build/sudoers +1 -1
  24. data/lib/rake_compiler_dock.rb +10 -0
  25. data/lib/rake_compiler_dock/docker_check.rb +12 -6
  26. data/lib/rake_compiler_dock/starter.rb +68 -53
  27. data/lib/rake_compiler_dock/version.rb +2 -2
  28. data/test/test_environment_variables.rb +2 -2
  29. data/test/test_parallel_docker_build.rb +57 -0
  30. metadata +35 -25
  31. metadata.gz.sig +0 -0
  32. data/Dockerfile.mri +0 -122
  33. data/build/patches/rake-compiler-1.0.6/enable-static.diff +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b4f1c79ba29d38c727c275cac167a4c8515677da374fedf15f5cadf6683cdd32
4
- data.tar.gz: f38bd41996e31d3ab825f642ce5906187dd240d50e80c4245eb6896876ca15b8
3
+ metadata.gz: 7bbe8d21de2a30484e2ec2d877bf6e2e2538c7f02d207e924716d9bb99609fbf
4
+ data.tar.gz: 2069a049a2a9974a98f13bfd704f60f8e07dc5741f2e0f5d18a6c4f122358875
5
5
  SHA512:
6
- metadata.gz: bb4677877ad29fbc0c14a9d0455fe22016bd6af64081d170b3556f0c6f1e7ba14b7bc7144fc59f70c0ac0cde44200016150929aa3120bf963d817f7af5d223ff
7
- data.tar.gz: c7cd83788dbdd56cec416c0736243fd6bc937420f22edd9183b1d365c5cd5e464022fd9b6ad341c15c479fdd371b237debaa1a65c6ec5d6c7d7546827650d4d3
6
+ metadata.gz: 197abac03aa2262d6893e4f79dcb9fa63bbf7018afa70d6ea7c189abc390074a36c7892b6745e8399ffbe4309686b5310c382d5227dfe9906d6bd875a561b5af
7
+ data.tar.gz: 184393bac4b1890e1c19567c7c80ecc3a015e78e8789232c4f00a28d7c2a6ba0209ae94e9c1ffa2dcbd58bcd9eb8a1875732c32263cdbd47499437bc0e3617aa
Binary file
data.tar.gz.sig CHANGED
Binary file
data/.gitignore CHANGED
@@ -1,5 +1,9 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
+ /Dockerfile.mri.x86-linux
4
+ /Dockerfile.mri.x86-mingw32
5
+ /Dockerfile.mri.x86_64-linux
6
+ /Dockerfile.mri.x64-mingw32
3
7
  /Gemfile.lock
4
8
  /_yardoc/
5
9
  /coverage/
@@ -1,16 +1,20 @@
1
- FROM ubuntu:18.04
1
+ FROM ubuntu:20.04
2
2
 
3
3
  RUN apt-get -y update && \
4
- apt-get install -y curl git-core xz-utils wget unzip sudo gpg dirmngr openjdk-11-jdk-headless
4
+ apt-get install -y curl git-core xz-utils wget unzip sudo gpg dirmngr openjdk-14-jdk-headless && \
5
+ rm -rf /var/lib/apt/lists/*
5
6
 
6
7
  # Add "rvm" as system group, to avoid conflicts with host GIDs typically starting with 1000
7
8
  RUN groupadd -r rvm && useradd -r -g rvm -G sudo -p "" --create-home rvm && \
8
9
  echo "source /etc/profile.d/rvm.sh" >> /etc/rubybashrc
9
10
  USER rvm
10
11
 
12
+ RUN mkdir ~/.gnupg && \
13
+ echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf
14
+
11
15
  # install rvm, RVM 1.26.0+ has signed releases, source rvm for usage outside of package scripts
12
- RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB && \
13
- (curl -L http://get.rvm.io | sudo bash -s stable) && \
16
+ RUN gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB && \
17
+ (curl -L http://get.rvm.io | sudo bash) && \
14
18
  bash -c " \
15
19
  source /etc/rubybashrc && \
16
20
  rvmsudo rvm cleanup all "
@@ -22,7 +26,7 @@ ENV BASH_ENV /etc/rubybashrc
22
26
  # install rubies and fix permissions on
23
27
  RUN bash -c " \
24
28
  export CFLAGS='-s -O3 -fno-fast-math -fPIC' && \
25
- for v in jruby-9.2.5.0 ; do \
29
+ for v in jruby-9.2.14.0 ; do \
26
30
  rvm install --binary \$v --patch \$(echo ~/patches/ruby-\$v/* | tr ' ' ','); \
27
31
  done && \
28
32
  rvm cleanup all && \
@@ -32,7 +36,7 @@ RUN bash -c " \
32
36
  # do not generate documentation for gems
33
37
  RUN echo "gem: --no-ri --no-rdoc" >> ~/.gemrc && \
34
38
  bash -c " \
35
- rvm all do gem install --no-document bundler rake-compiler hoe rubygems-tasks && \
39
+ rvm all do gem install --no-document bundler 'bundler:~>1.16' rake-compiler hoe rubygems-tasks && \
36
40
  find /usr/local/rvm -type d -print0 | sudo xargs -0 chmod g+sw "
37
41
 
38
42
  # Install rake-compiler's cross rubies in global dir instead of /root
@@ -42,8 +46,8 @@ RUN sudo mkdir -p /usr/local/rake-compiler && \
42
46
 
43
47
  USER root
44
48
 
45
- RUN bash -c "rvm alias create default jruby-9.2.5.0"
46
- RUN echo "rvm use jruby-9.2.5.0 > /dev/null" >> /etc/rubybashrc
49
+ RUN bash -c "rvm alias create default jruby-9.2.14.0"
50
+ RUN echo "rvm use jruby-9.2.14.0 > /dev/null" >> /etc/rubybashrc
47
51
 
48
52
  # Add rvm to the global bashrc
49
53
  RUN echo "source /etc/profile.d/rvm.sh" >> /etc/bash.bashrc
@@ -0,0 +1,231 @@
1
+ FROM <%=
2
+ case platform
3
+ when /x86_64-linux/ then "quay.io/pypa/manylinux2014_x86_64"
4
+ when /x86-linux/ then "quay.io/pypa/manylinux2014_i686"
5
+ else "ubuntu:20.04"
6
+ end %>
7
+
8
+ <% if platform=~/linux/ %>
9
+ # install packages which rvm will require
10
+ RUN yum install -y autoconf gcc-c++ libtool readline-devel sqlite-devel ruby openssl-devel xz cmake sudo less
11
+
12
+ # Prepare sudo and delete sudo as alias to gosu
13
+ RUN rm -f /usr/local/bin/sudo && \
14
+ groupadd -r sudo && \
15
+ echo "%sudo ALL=(ALL) ALL" >> /etc/sudoers
16
+ <% else %>
17
+ ENV DEBIAN_FRONTEND noninteractive
18
+ RUN apt-get -y update && \
19
+ 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 && \
20
+ rm -rf /var/lib/apt/lists/*
21
+ <% end %>
22
+
23
+ # Add "rvm" as system group, to avoid conflicts with host GIDs typically starting with 1000
24
+ RUN groupadd -r rvm && useradd -r -g rvm -G sudo -p "" --create-home rvm
25
+
26
+ # Make sure rvm and later settings are available in interactive and non-interactive shells
27
+ RUN echo "source /etc/profile.d/rvm.sh" >> /etc/rubybashrc && \
28
+ echo "source /etc/rubybashrc" >> /etc/bashrc && \
29
+ echo "source /etc/rubybashrc" >> /etc/bash.bashrc
30
+ ENV BASH_ENV /etc/rubybashrc
31
+
32
+ USER rvm
33
+
34
+ RUN mkdir ~/.gnupg && \
35
+ chmod 700 ~/.gnupg && \
36
+ echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf
37
+
38
+ # install rvm, RVM 1.26.0+ has signed releases, source rvm for usage outside of package scripts
39
+ RUN gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB && \
40
+ (curl -L http://get.rvm.io | sudo bash) && \
41
+ bash -c " \
42
+ source /etc/rubybashrc && \
43
+ rvm autolibs disable && \
44
+ rvmsudo rvm cleanup all "
45
+
46
+ # Import patch files for ruby and gems
47
+ COPY build/patches /home/rvm/patches/
48
+
49
+ # install rubies and fix permissions on
50
+ ENV RVM_RUBIES 2.5.8 3.0.0
51
+ RUN bash -c " \
52
+ export CFLAGS='-s -O3 -fno-fast-math -fPIC' && \
53
+ for v in ${RVM_RUBIES} ; do \
54
+ rvm install \$v --patch \$(echo ~/patches/ruby-\$v/* | tr ' ' ','); \
55
+ done && \
56
+ rvm cleanup all && \
57
+ find /usr/local/rvm -type d -print0 | sudo xargs -0 chmod g+sw "
58
+
59
+ # Install rake-compiler and typical gems in all Rubies
60
+ # do not generate documentation for gems
61
+ RUN echo "gem: --no-ri --no-rdoc" >> ~/.gemrc && \
62
+ bash -c " \
63
+ rvm all do gem update --system --no-document && \
64
+ rvm all do gem install --no-document bundler 'bundler:~>1.16' 'rake-compiler:1.1.1' 'hoe:3.20.0' mini_portile rubygems-tasks mini_portile2 && \
65
+ find /usr/local/rvm -type d -print0 | sudo xargs -0 chmod g+sw "
66
+
67
+ # Install rake-compiler's cross rubies in global dir instead of /root
68
+ RUN sudo mkdir -p /usr/local/rake-compiler && \
69
+ sudo chown rvm.rvm /usr/local/rake-compiler && \
70
+ ln -s /usr/local/rake-compiler ~/.rake-compiler
71
+
72
+ # Add cross compilers for Windows and Linux
73
+ USER root
74
+
75
+ <% if platform !~ /linux/ %>
76
+ RUN apt-get -y update && \
77
+ apt-get install -y <%
78
+ if platform=~/darwin/ %> clang python lzma-dev libxml2-dev libssl-dev libc++-10-dev <% end %><%
79
+ if platform=~/x86-mingw32/ %> gcc-mingw-w64-i686 g++-mingw-w64-i686 <% end %><%
80
+ if platform=~/x64-mingw32/ %> gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 <% end %> && \
81
+ rm -rf /var/lib/apt/lists/*
82
+ <% end %>
83
+
84
+ RUN bash -c " \
85
+ rvm alias create default 2.5.8 && \
86
+ rvm use default "
87
+
88
+ <% if platform=~/linux/ %>
89
+ # Create dev tools x86-linux-*
90
+ COPY build/mk_i686.rb /root/
91
+ RUN bash -c " \
92
+ ruby /root/mk_i686.rb "
93
+ <% end %>
94
+
95
+ <% if platform=~/darwin/ %>
96
+ RUN git clone -q --depth=1 https://github.com/tpoechtrager/osxcross.git /opt/osxcross && rm -rf /opt/osxcross/.git && \
97
+ cd /opt/osxcross/tarballs && \
98
+ curl -L -o MacOSX11.1.sdk.tar.xz https://github.com/larskanis/MacOSX-SDKs/releases/download/11.1/MacOSX11.1.sdk.tar.xz && \
99
+ tar -xf MacOSX11.1.sdk.tar.xz -C . && \
100
+ cp -rf /usr/lib/llvm-10/include/c++ MacOSX11.1.sdk/usr/include/c++ && \
101
+ cp -rf /usr/include/x86_64-linux-gnu/c++/9/bits/ MacOSX11.1.sdk/usr/include/c++/v1/bits && \
102
+ tar -cJf MacOSX11.1.sdk.tar.xz MacOSX11.1.sdk && \
103
+ cd /opt/osxcross && \
104
+ UNATTENDED=1 SDK_VERSION=11.1 OSX_VERSION_MIN=10.13 USE_CLANG_AS=1 ./build.sh && \
105
+ rm -rf *~ build tarballs/*
106
+
107
+ RUN echo "export PATH=/opt/osxcross/target/bin:\$PATH" >> /etc/rubybashrc && \
108
+ echo "export MACOSX_DEPLOYMENT_TARGET=10.13" >> /etc/rubybashrc && \
109
+ echo "export OSXCROSS_MP_INC=1" >> /etc/rubybashrc
110
+
111
+ # Add links to build tools without target version kind of:
112
+ # arm64-apple-darwin-clang => arm64-apple-darwin20.1-clang
113
+ RUN rm /opt/osxcross/target/bin/*-apple-darwin-* ; \
114
+ 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
115
+
116
+ # There's no objdump in osxcross but we can use llvm's
117
+ RUN ln -s /usr/lib/llvm-10/bin/llvm-objdump /opt/osxcross/target/bin/x86_64-apple-darwin-objdump && \
118
+ ln -s /usr/lib/llvm-10/bin/llvm-objdump /opt/osxcross/target/bin/aarch64-apple-darwin-objdump
119
+
120
+ <% end %>
121
+
122
+ # Patch rake-compiler to build and install static libraries for Linux rubies
123
+ USER rvm
124
+ COPY build/patches2 /home/rvm/patches/
125
+ RUN bash -c " \
126
+ for v in ${RVM_RUBIES} ; do \
127
+ cd /usr/local/rvm/gems/ruby-\$v/gems/rake-compiler-1.1.1 && \
128
+ echo applying patches to ruby-\$v /home/rvm/patches/rake-compiler-1.1.1/*.patch && \
129
+ ( git apply /home/rvm/patches/rake-compiler-1.1.1/*.patch || true ) && \
130
+ cd /usr/local/rvm/gems/ruby-\$v/gems/hoe-3.20.0 && \
131
+ echo applying patches to ruby-\$v /home/rvm/patches/hoe-3.20.0/*.patch && \
132
+ ( git apply /home/rvm/patches/hoe-3.20.0/*.patch || true ) \
133
+ done "
134
+
135
+ # Patch rubies for cross build
136
+ USER root
137
+ RUN bash -c " \
138
+ for v in 2.7.0 3.0.0 ; do \
139
+ curl -SL http://cache.ruby-lang.org/pub/ruby/\${v:0:3}/ruby-\$v.tar.xz | tar -xJC /root/ && \
140
+ cd /root/ruby-\$v && \
141
+ git apply /home/rvm/patches/ruby-\$v/*.patch && \
142
+ cd .. && \
143
+ mkdir -p /usr/local/rake-compiler/sources/ && \
144
+ tar cjf /usr/local/rake-compiler/sources/ruby-\$v.tar.bz2 ruby-\$v && \
145
+ chown rvm /usr/local/rake-compiler -R && \
146
+ rm -rf /root/ruby-\$v ; \
147
+ done "
148
+ USER rvm
149
+
150
+
151
+ ENV XRUBIES 3.0.0:2.7.0:2.6.0:2.5.0:2.4.0:2.3.0
152
+
153
+ <% strip = '-s' if platform !~ /darwin/ %>
154
+ # Build all xruby versions in parallel
155
+ # Then cleanup all build artifacts
156
+ RUN bash -c " \
157
+ export CFLAGS='-O1 -fno-omit-frame-pointer -fno-fast-math -fstack-protector-strong <%= strip %>' && \
158
+ export LDFLAGS='-pipe <%= strip %>' && \
159
+ <%= "export LIBS='-l:libssp.a' &&" if platform =~ /mingw/ %> \
160
+ <%= "export CC=#{target}-clang &&" if platform =~ /darwin/ %> \
161
+ export MAKE='make V=1' && \
162
+ rake-compiler cross-ruby VERSION=$XRUBIES HOST=<%= target %> && \
163
+ rm -rf ~/.rake-compiler/builds ~/.rake-compiler/sources && \
164
+ find /usr/local/rvm -type d -print0 | sudo xargs -0 chmod g+sw "
165
+
166
+ <% if platform=~/linux/ %>
167
+ # Avoid linking against libruby shared object.
168
+ # See also https://github.com/rake-compiler/rake-compiler-dock/issues/13
169
+ RUN find /usr/local/rake-compiler/ruby/*linux*/ -name libruby.so | xargs rm
170
+ RUN find /usr/local/rake-compiler/ruby/*linux*/ -name libruby-static.a | while read f ; do cp $f `echo $f | sed s/-static//` ; done
171
+ RUN find /usr/local/rake-compiler/ruby/*linux*/ -name libruby.a | while read f ; do ar t $f | xargs ar d $f ; done
172
+ RUN find /usr/local/rake-compiler/ruby/*linux*/ -name mkmf.rb | while read f ; do sed -i ':a;N;$!ba;s/TRY_LINK = [^\n]*\n[^\n]*\n[^\n]*LOCAL_LIBS)/& -lruby-static/' $f ; done
173
+ <% end %>
174
+
175
+ <% if platform=~/mingw/ %>
176
+ # RubyInstaller doesn't install libgcc -> link it static.
177
+ RUN find /usr/local/rake-compiler/ruby/*mingw*/ -name rbconfig.rb | while read f ; do sed -i 's/."LDFLAGS". = "/&-static-libgcc /' $f ; done
178
+ # Raise Windows-API to Vista (affects ruby < 2.6 only)
179
+ RUN find /usr/local/rake-compiler/ruby -name rbconfig.rb | while read f ; do sed -i 's/0x0501/0x0600/' $f ; done
180
+ # Don't link to static libruby
181
+ 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
182
+ <% end %>
183
+
184
+ USER root
185
+
186
+ # Fix paths in rake-compiler/config.yml
187
+ RUN sed -i -- "s:/root/.rake-compiler:/usr/local/rake-compiler:g" /usr/local/rake-compiler/config.yml
188
+
189
+
190
+ <% if platform=~/mingw/ %>
191
+ # Install wrappers for strip commands as a workaround for "Protocol error" in boot2docker.
192
+ COPY build/strip_wrapper /root/
193
+ RUN mv /usr/bin/<%= target %>-strip /usr/bin/<%= target %>-strip.bin && \
194
+ ln /root/strip_wrapper /usr/bin/<%= target %>-strip
195
+
196
+ # Use posix pthread for mingw so that C++ standard library for thread could be
197
+ # available such as std::thread, std::mutex, so on.
198
+ # https://sourceware.org/pthreads-win32/
199
+ RUN printf "1\n" | update-alternatives --config <%= target %>-gcc && \
200
+ printf "1\n" | update-alternatives --config <%= target %>-g++
201
+ <% end %>
202
+
203
+ <% if platform=~/linux/ %>
204
+ # Enable modern compiler toolset of manylinux image
205
+ RUN echo "export PATH=\$DEVTOOLSET_ROOTPATH/usr/bin:\$PATH" >> /etc/rubybashrc
206
+
207
+ # Add prefixed versions of compiler tools
208
+ 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
209
+
210
+ # ruby-2.5 links to libcrypt, which isn't necessary for extensions
211
+ RUN find /usr/local/rake-compiler/ruby -name rbconfig.rb | while read f ; do sed -i 's/-lcrypt//' $f ; done
212
+ <% end %>
213
+
214
+ <% if platform=~/arm64-darwin/ %>
215
+ # Add a arm64 darwin target as alternative to aarch64
216
+ RUN grep -E 'rbconfig-aarch64-darwin' /usr/local/rake-compiler/config.yml | sed 's/rbconfig-[a-z0-9_]*-darwin/rbconfig-<%= platform %>/' >> /usr/local/rake-compiler/config.yml
217
+ <% end %>
218
+
219
+ # Install SIGINT forwarder
220
+ COPY build/sigfw.c /root/
221
+ RUN gcc $HOME/sigfw.c -o /usr/bin/sigfw
222
+
223
+ # Install user mapper
224
+ COPY build/runas /usr/bin/
225
+
226
+ # Install sudoers configuration
227
+ COPY build/sudoers /etc/sudoers.d/rake-compiler-dock
228
+
229
+ ENV RUBY_CC_VERSION 3.0.0:2.7.0:2.6.0:2.5.0:2.4.0:2.3.0
230
+
231
+ CMD bash
data/History.md CHANGED
@@ -1,3 +1,59 @@
1
+ 1.1.0 / 2020-12-28
2
+ ------------------
3
+
4
+ * Use ManyLinux2014 as docker base image for linux targets.
5
+ That way compatibility to very old linux dists can be provided, while still using modern compilers.
6
+ * Add macOS cross build targets "x86_64-darwin" and "arm64-darwin".
7
+ They are based on MacOSX-SDK-11.1
8
+ * Add Ruby-3.0 as native rvm and cross ruby version.
9
+ * Remove Ruby-2.2 from RUBY_CC_VERSION and cross rubies.
10
+ * Update to Ubuntu-20.04 for Mingw and JRuby targets.
11
+ * Set `ExtensionTask#no_native=true` to fix issues with cross_compiling callback not being called.
12
+ See discussion here: https://github.com/rake-compiler/rake-compiler/pull/171
13
+ * Allow setting an alternative dockerhub user per `DOCKERHUB_USER`.
14
+
15
+
16
+ 1.0.1 / 2020-01-13
17
+ ------------------
18
+
19
+ * Fix error when using rake-compiler-dock on non-tty STDIN. #31
20
+
21
+
22
+ 1.0.0 / 2020-01-04
23
+ ------------------
24
+ * Add ruby-2.7.0 cross ruby.
25
+ * Use per-target docker images.
26
+ There are currently 5 docker images:
27
+ * larskanis/rake-compiler-dock-mri-x86-mingw32
28
+ * larskanis/rake-compiler-dock-mri-x64-mingw32
29
+ * larskanis/rake-compiler-dock-mri-x86-linux
30
+ * larskanis/rake-compiler-dock-mri-x86_64-linux
31
+ * larskanis/rake-compiler-dock-jruby
32
+
33
+ Since every image has only the taget specific compilers and rubies, care has to be taken, that only rake tasks are triggered, that belong to the specific target.
34
+ See the README.md for more information.
35
+ * Ensure the separate docker images always use as much as possible common docker images layers to avoid increased download sizes.
36
+ * Pass GEM_PRIVATE_KEY_PASSPHRASE to the container.
37
+ * Update JRuby to 9.2.9.0 and native CRuby to 2.5.7.
38
+ * Create empty ~/.gem to be used for gem signing key.
39
+ * Ensure terminal is in cooked mode after build.
40
+ This fixes terminal misconfiguration after parallel builds.
41
+ * Raise Windows-API to Vista (affects ruby < 2.6 only)
42
+ * Use posix pthread for mingw so that C++ standard library for thread could be available such as std::thread, std::mutex, so on.
43
+ * Make the system to have GLIBC 2.12 instead of 2.23 so that generated ruby package can run on CentOS 6 with GLIBC 2.12
44
+
45
+
46
+ 0.7.2 / 2019-03-18
47
+ ------------------
48
+ * Fix missing libruby.a of cross rubies. Fixes #26
49
+ * Downgrade to Ubuntu-16.04 for MRI base image. Fixes #25
50
+
51
+
52
+ 0.7.1 / 2019-01-27
53
+ ------------------
54
+ * Add bundler-2.x to image and keep bundler-1.x for compatibility with projects using a `Gemfile.lock` generated by bundler-1.x .
55
+
56
+
1
57
  0.7.0 / 2018-12-26
2
58
  ------------------
3
59
  * Add docker image for JRuby extensions, new option `:rubyvm` and `RCD_RUBYVM` environment variable
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # rake-compiler-dock
2
2
 
3
- **Easy to use and reliable cross compiler environment for building Windows and Linux binary gems.**
3
+ **Easy to use and reliable cross compiler environment for building Windows, Linux and JRuby binary gems.**
4
4
 
5
- It provides cross compilers and Ruby environments for 2.0 and newer versions of the [RubyInstaller](http://rubyinstaller.org/) and Linux runtime environments.
5
+ It provides cross compilers and Ruby environments for 2.2 and newer versions of the [RubyInstaller](http://rubyinstaller.org/) and Linux runtime environments.
6
6
  They are prepared for use with [rake-compiler](https://github.com/rake-compiler/rake-compiler).
7
- It is used by [many gems with C-extentions](https://github.com/rake-compiler/rake-compiler-dock/wiki/Projects-using-rake-compiler-dock).
7
+ It is used by [many gems with C or JRuby extentions](https://github.com/rake-compiler/rake-compiler-dock/wiki/Projects-using-rake-compiler-dock).
8
8
 
9
9
  This is kind of successor of [rake-compiler-dev-box](https://github.com/tjschuck/rake-compiler-dev-box).
10
10
  It is wrapped as a gem for easier setup, usage and integration and is based on lightweight Docker containers.
@@ -16,7 +16,7 @@ Install docker natively on Linux:
16
16
 
17
17
  $ sudo apt-get install docker.io
18
18
 
19
- ... or install [docker-toolbox for Windows and OSX](https://www.docker.com/docker-toolbox) or boot2docker on [Windows](https://github.com/boot2docker/windows-installer/releases) or [OS X](https://github.com/boot2docker/osx-installer/releases) .
19
+ ... or install [docker-toolbox for Windows and OSX](https://github.com/docker/toolbox/releases) or boot2docker on [Windows](https://github.com/boot2docker/windows-installer/releases) or [OS X](https://github.com/boot2docker/osx-installer/releases) .
20
20
 
21
21
  Install rake-compiler-dock as a gem. The docker image is downloaded later on demand:
22
22
 
@@ -30,20 +30,23 @@ Install rake-compiler-dock as a gem. The docker image is downloaded later on dem
30
30
 
31
31
  ## Usage
32
32
 
33
- Rake-compiler-dock provides the necessary tools to build Ruby extensions for Windows and Linux written in C and C++.
33
+ Rake-compiler-dock provides the necessary tools to build Ruby extensions for Windows and Linux written in C and C++ and JRuby written in Java.
34
34
  It is intended to be used in conjunction with [rake-compiler's](https://github.com/rake-compiler/rake-compiler) cross build capability.
35
35
  Your Rakefile should enable cross compilation like so:
36
36
 
37
- Rake::ExtensionTask.new('my_extension', my_gem_spec) do |ext|
37
+ exttask = Rake::ExtensionTask.new('my_extension', my_gem_spec) do |ext|
38
38
  ext.cross_compile = true
39
39
  ext.cross_platform = %w[x86-mingw32 x64-mingw32 x86-linux x86_64-linux]
40
40
  end
41
41
 
42
- It may also be used to build ffi based binary gems like [libusb](https://github.com/larskanis/libusb), but currently doesn't provide any additional build helpers for this use case, beyond docker invocation and cross compilers.
42
+ See below, how to invoke cross builds in your Rakefile.
43
+
44
+ Additionally it may also be used to build ffi based binary gems like [libusb](https://github.com/larskanis/libusb), but currently doesn't provide any additional build helpers for this use case, beyond docker invocation and cross compilers.
43
45
 
44
46
  ### Interactive Usage
45
47
 
46
48
  Rake-compiler-dock offers the shell command `rake-compiler-dock` and a [ruby API](http://www.rubydoc.info/gems/rake-compiler-dock/RakeCompilerDock) for issuing commands within the docker image, described below.
49
+ There dedicated are images for `x86-mingw32`, `x64-mingw32`, `x86-linux`, `x86_64-linux` and `jruby` targets.
47
50
 
48
51
  `rake-compiler-dock` without arguments starts an interactive shell session.
49
52
  This is best suited to try out and debug a build.
@@ -55,16 +58,22 @@ But note, that all other changes to the file system of the container are dropped
55
58
  All commands are executed with the same user and group of the host.
56
59
  This is done by copying user account data into the container and sudo to it.
57
60
 
58
- To build x86 and x64 Windows and Linux binary gems interactively, it can be called like this:
61
+ To build x86 Windows and x86_64 Linux binary gems interactively, it can be called like this:
59
62
 
60
63
  user@host:$ cd your-gem-dir/
61
- user@host:$ rake-compiler-dock # this enters a container with an interactive shell
64
+ user@host:$ rake-compiler-dock # this enters a container with an interactive shell for x86 Windows (default)
62
65
  user@5b53794ada92:$ bundle
63
66
  user@5b53794ada92:$ rake cross native gem
64
67
  user@5b53794ada92:$ exit
65
68
  user@host:$ ls pkg/*.gem
66
- your-gem-1.0.0.gem your-gem-1.0.0-x64-mingw32.gem your-gem-1.0.0-x86-mingw32.gem
67
- your-gem-1.0.0-x86_64-linux.gem your-gem-1.0.0-x86-linux.gem
69
+ your-gem-1.0.0.gem your-gem-1.0.0-x86-mingw32.gem
70
+
71
+ user@host:$ RCD_PLATFORM=x86_64-linux rake-compiler-dock # this enters a container for amd64 Linux target
72
+ user@adc55b2b92a9:$ bundle
73
+ user@adc55b2b92a9:$ rake cross native gem
74
+ user@adc55b2b92a9:$ exit
75
+ user@host:$ ls pkg/*.gem
76
+ your-gem-1.0.0.gem your-gem-1.0.0-x86_64-linux.gem
68
77
 
69
78
  Or non-interactive:
70
79
 
@@ -78,23 +87,79 @@ This is local to the running session, only:
78
87
  sudo apt-get update && sudo apt-get install your-package
79
88
 
80
89
  You can also choose between different executable ruby versions by `rvm use <version>` .
81
- The current default is 2.3.
90
+ The current default is 2.5.
91
+
92
+ ### JRuby support
82
93
 
94
+ Rake-compiler-dock offers a dedicated docker image for JRuby.
95
+ JRuby doesn't need a complicated cross build environment like C-ruby, but using Rake-compiler-dock for JRuby makes building binary gems more consistent.
96
+
97
+ To build java binary gems interactively, it can be called like this:
98
+
99
+ user@host:$ cd your-gem-dir/
100
+ user@host:$ RCD_RUBYVM=jruby rake-compiler-dock # this enters a container with an interactive shell
101
+ user@5b53794ada92:$ ruby -v
102
+ jruby 9.2.5.0 (2.5.0) 2018-12-06 6d5a228 OpenJDK 64-Bit Server VM 10.0.2+13-Ubuntu-1ubuntu0.18.04.4 on 10.0.2+13-Ubuntu-1ubuntu0.18.04.4 +jit [linux-x86_64]
103
+ user@5b53794ada92:$ bundle
104
+ user@5b53794ada92:$ rake java gem
105
+ user@5b53794ada92:$ exit
106
+ user@host:$ ls pkg/*.gem
107
+ your-gem-1.0.0.gem your-gem-1.0.0-java.gem
83
108
 
84
109
  ### Add to your Rakefile
85
110
 
86
- To make the build process reproduceable for other parties, it is recommended to add rake-compiler-dock to your Rakefile.
111
+ To make the build process reproducible for other parties, it is recommended to add rake-compiler-dock to your Rakefile.
87
112
  This can be done like this:
88
113
 
89
114
  task 'gem:native' do
90
115
  require 'rake_compiler_dock'
91
116
  sh "bundle package" # Avoid repeated downloads of gems by using gem files from the host.
92
- RakeCompilerDock.sh "bundle --local && rake cross native gem"
117
+ %w[ x86-mingw32 x64-mingw32 x86-linux x86_64-linux ].each do |plat|
118
+ RakeCompilerDock.sh "bundle --local && rake native:#{plat} gem", platform: plat
119
+ end
120
+ RakeCompilerDock.sh "bundle --local && rake java gem", rubyvm: :jruby
93
121
  end
94
122
 
123
+ This runs the `bundle` and `rake` commands once for each platform.
124
+ That is once for the jruby gems and 4 times for the specified MRI platforms.
125
+
126
+ ### Run builds in parallel
127
+
128
+ rake-compiler-dock uses dedicated docker images per build target (since rake-compiler-dock-1.0).
129
+ Because each target runs in a separate docker container, it is simple to run all targets in parallel.
130
+ The following example defines `rake gem:native` as a multitask and separates the preparation which should run only once.
131
+ It also shows how gem signing can be done with parallel builds.
132
+ Please note, that parallel builds only work reliable, if the specific platform gem is requested (instead of just "rake gem").
133
+
134
+ ```ruby
135
+ namespace "gem" do
136
+ exttask.cross_platform.each do |plat|
137
+ desc "Build the native binary gems"
138
+ multitask 'native' => plat
139
+
140
+ task 'prepare' do
141
+ require 'rake_compiler_dock'
142
+ sh "cp ~/.gem/gem-*.pem build/gem/ || true"
143
+ require 'io/console'
144
+ ENV["GEM_PRIVATE_KEY_PASSPHRASE"] = STDIN.getpass("Enter passphrase of gem signature key: ")
145
+ end
146
+
147
+ task plat => 'prepare' do
148
+ RakeCompilerDock.sh <<-EOT, platform: plat
149
+ (cp build/gem/gem-*.pem ~/.gem/ || true) &&
150
+ bundle --local &&
151
+ rake native:#{plat} pkg/#{exttask.gem_spec.full_name}-#{plat}.gem
152
+ EOT
153
+ end
154
+ end
155
+ end
156
+ ```
157
+
158
+ ### Add to your Gemfile
159
+
95
160
  Rake-compiler-dock uses [semantic versioning](http://semver.org/), so you should add it into your Gemfile, to make sure, that future changes will not break your build.
96
161
 
97
- gem 'rake-compiler-dock', '~> 0.6.0'
162
+ gem 'rake-compiler-dock', '~> 1.0'
98
163
 
99
164
  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.
100
165
 
@@ -105,12 +170,18 @@ Rake-compiler-dock makes use of several environment variables.
105
170
 
106
171
  The following variables are recognized by rake-compiler-dock:
107
172
 
173
+ * `RCD_RUBYVM` - The ruby VM and toolchain to be used.
174
+ Must be one of `mri`, `jruby`.
175
+ * `RCD_PLATFORM` - The target rubygems platform.
176
+ Must be a space separated list out of `x86-mingw32`, `x64-mingw32`, `x86-linux` and `x86_64-linux`.
177
+ It is ignored when `rubyvm` is set to `:jruby`.
108
178
  * `RCD_IMAGE` - The docker image that is downloaded and started.
109
179
  Defaults to "larskanis/rake-compiler-dock:IMAGE_VERSION" with an image version that is determined by the gem version.
110
180
 
111
181
  The following variables are passed through to the docker container without modification:
112
182
 
113
183
  * `http_proxy`, `https_proxy`, `ftp_proxy` - See [Frequently asked questions](https://github.com/rake-compiler/rake-compiler-dock/wiki/FAQ) for more details.
184
+ * `GEM_PRIVATE_KEY_PASSPHRASE` - To avoid interactive password prompts in the container.
114
185
 
115
186
  The following variables are provided to the running docker container:
116
187