rake-compiler-dock 0.7.2 → 1.0.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.gitignore +4 -0
- data/Dockerfile.jruby +9 -5
- data/{Dockerfile.mri → Dockerfile.mri.erb} +81 -23
- data/History.md +23 -0
- data/README.md +62 -10
- data/Rakefile +36 -4
- data/{lib/rake_compiler_dock → build}/gem_helper.rb +0 -15
- data/build/parallel_docker_build.rb +102 -0
- data/build/patches/{ruby-2.5.3 → ruby-2.5.7}/no_sendfile.patch +1 -1
- data/build/patches/ruby-2.7.0/no_sendfile.patch +24 -0
- data/build/patches2/hoe-3.20.0/0001-Load-encrypted-private-key-using-ENV-GEM_PRIVATE_KEY.patch +32 -0
- data/build/patches2/rake-compiler-1.1.0/0001-Allow-parallel-builds-of-cross-rubies.patch +119 -0
- data/build/patches2/rake-compiler-1.1.0/0001-Enable-build-of-static-libruby.patch +28 -0
- data/build/patches2/rake-compiler-1.1.0/0001-Fix-determining-of-ruby-versions-in-rake-native-gem.patch +44 -0
- data/build/patches2/rake-compiler-1.1.0/0002-Extend-mingw-search-pattern-to-find-x86_64-gcc.patch +26 -0
- data/build/patches2/rake-compiler-1.1.0/0002-Strip-cross-built-shared-library-files-while-linking.patch +29 -0
- data/build/patches2/ruby-2.7.0/ruby2_keywords.patch +15 -0
- data/build/runas +2 -0
- data/build/sudoers +1 -1
- data/lib/rake_compiler_dock.rb +10 -0
- data/lib/rake_compiler_dock/docker_check.rb +12 -6
- data/lib/rake_compiler_dock/starter.rb +68 -53
- data/lib/rake_compiler_dock/version.rb +2 -2
- data/test/test_environment_variables.rb +2 -2
- data/test/test_parallel_docker_build.rb +57 -0
- metadata +39 -8
- metadata.gz.sig +2 -0
- data/build/patches/rake-compiler-1.0.7/enable-static.diff +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f619b5de824d49259e240b44270af56e87018e9678833f07de25992d71651557
|
4
|
+
data.tar.gz: 1ed31831b3763adf6a7b25005e58f47773fc633b728a7d92cfa6f26698fe72ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2aac49b389b5cbaeca4ffa98f09921fb5fa46bf4710cfda7cb299b8eb3c7dd03c15e7a6181fa4a267b94f9ec69b2086a57d65b9d8d136e4ffc0c26c63dad1941
|
7
|
+
data.tar.gz: cff042d7790888b2f7bd024475100ecdb6d9b70126fe0b6cd82b086e8897382d7b612d3e4d68de87ba9df28c7c5ea3fe013493b57ea34038735b0d19923f66b8
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
Binary file
|
data/.gitignore
CHANGED
data/Dockerfile.jruby
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
FROM ubuntu:18.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-11-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
16
|
RUN gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB && \
|
13
|
-
(curl -L http://get.rvm.io | sudo bash
|
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.
|
29
|
+
for v in jruby-9.2.9.0 ; do \
|
26
30
|
rvm install --binary \$v --patch \$(echo ~/patches/ruby-\$v/* | tr ' ' ','); \
|
27
31
|
done && \
|
28
32
|
rvm cleanup all && \
|
@@ -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.
|
46
|
-
RUN echo "rvm use jruby-9.2.
|
49
|
+
RUN bash -c "rvm alias create default jruby-9.2.9.0"
|
50
|
+
RUN echo "rvm use jruby-9.2.9.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
|
@@ -1,16 +1,21 @@
|
|
1
|
-
FROM ubuntu
|
1
|
+
FROM ubuntu:<%= platform=~/linux/ ? "16.04" : "18.04" %>
|
2
2
|
|
3
3
|
RUN apt-get -y update && \
|
4
|
-
apt-get install -y curl git-core xz-utils build-essential wget unzip sudo gnupg2 dirmngr
|
4
|
+
apt-get install -y curl git-core xz-utils build-essential wget unzip sudo gnupg2 dirmngr && \
|
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
|
+
chmod 700 ~/.gnupg && \
|
14
|
+
echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf
|
15
|
+
|
11
16
|
# install rvm, RVM 1.26.0+ has signed releases, source rvm for usage outside of package scripts
|
12
17
|
RUN gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB && \
|
13
|
-
(curl -L http://get.rvm.io | sudo bash
|
18
|
+
(curl -L http://get.rvm.io | sudo bash) && \
|
14
19
|
bash -c " \
|
15
20
|
source /etc/rubybashrc && \
|
16
21
|
rvmsudo rvm cleanup all "
|
@@ -22,7 +27,7 @@ ENV BASH_ENV /etc/rubybashrc
|
|
22
27
|
# install rubies and fix permissions on
|
23
28
|
RUN bash -c " \
|
24
29
|
export CFLAGS='-s -O3 -fno-fast-math -fPIC' && \
|
25
|
-
for v in 2.5.
|
30
|
+
for v in 2.5.7 ; do \
|
26
31
|
rvm install \$v --patch \$(echo ~/patches/ruby-\$v/* | tr ' ' ','); \
|
27
32
|
done && \
|
28
33
|
rvm cleanup all && \
|
@@ -32,6 +37,7 @@ RUN bash -c " \
|
|
32
37
|
# do not generate documentation for gems
|
33
38
|
RUN echo "gem: --no-ri --no-rdoc" >> ~/.gemrc && \
|
34
39
|
bash -c " \
|
40
|
+
rvm all do gem update --system --no-document && \
|
35
41
|
rvm all do gem install --no-document bundler 'bundler:~>1.16' rake-compiler hoe mini_portile rubygems-tasks mini_portile2 && \
|
36
42
|
find /usr/local/rvm -type d -print0 | sudo xargs -0 chmod g+sw "
|
37
43
|
|
@@ -43,33 +49,57 @@ RUN sudo mkdir -p /usr/local/rake-compiler && \
|
|
43
49
|
# Add cross compilers for Windows and Linux
|
44
50
|
USER root
|
45
51
|
RUN apt-get -y update && \
|
46
|
-
apt-get install -y
|
47
|
-
|
52
|
+
apt-get install -y moreutils <%
|
53
|
+
if platform=~/x86-mingw32/ %> gcc-mingw-w64-i686 g++-mingw-w64-i686 <% end %><%
|
54
|
+
if platform=~/x64-mingw32/ %> gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 <% end %><%
|
55
|
+
if platform=~/x86-linux/ %> gcc-multilib g++-multilib <% end %> && \
|
56
|
+
rm -rf /var/lib/apt/lists/*
|
57
|
+
|
58
|
+
RUN bash -c " \
|
59
|
+
rvm alias create default 2.5.7 && \
|
60
|
+
rvm use default "
|
48
61
|
|
49
|
-
|
62
|
+
<% if platform=~/linux/ %>
|
63
|
+
# Create dev tools x86-linux-*
|
50
64
|
COPY build/mk_i686.rb /root/
|
51
65
|
RUN bash -c " \
|
52
|
-
rvm alias create default 2.5.3 && \
|
53
|
-
rvm use default && \
|
54
66
|
ruby /root/mk_i686.rb "
|
67
|
+
<% end %>
|
55
68
|
|
56
69
|
USER rvm
|
57
70
|
|
71
|
+
COPY build/patches2 /home/rvm/patches/
|
58
72
|
# Patch rake-compiler to build and install static libraries for Linux rubies
|
59
|
-
RUN cd /usr/local/rvm/gems/ruby-2.5.
|
60
|
-
( git apply /home/rvm/patches/rake-compiler-1.0
|
73
|
+
RUN cd /usr/local/rvm/gems/ruby-2.5.7/gems/rake-compiler-1.1.0 && \
|
74
|
+
( git apply /home/rvm/patches/rake-compiler-1.1.0/*.patch || true )
|
75
|
+
RUN cd /usr/local/rvm/gems/ruby-2.5.7/gems/hoe-3.20.0 && \
|
76
|
+
( git apply /home/rvm/patches/hoe-3.20.0/*.patch || true )
|
77
|
+
|
78
|
+
|
79
|
+
# Patch ruby-2.7.0 for cross build
|
80
|
+
USER root
|
81
|
+
RUN curl -SL http://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.xz | tar -xJC /root/ && \
|
82
|
+
cd /root/ruby-2.7.0 && \
|
83
|
+
git apply /home/rvm/patches/ruby-2.7.0/*.patch && \
|
84
|
+
cd .. && \
|
85
|
+
mkdir -p /usr/local/rake-compiler/sources/ && \
|
86
|
+
tar cjf /usr/local/rake-compiler/sources/ruby-2.7.0.tar.bz2 ruby-2.7.0 && \
|
87
|
+
chown rvm /usr/local/rake-compiler -R && \
|
88
|
+
rm -rf /root/ruby-2.7.0
|
89
|
+
USER rvm
|
90
|
+
|
61
91
|
|
62
|
-
ENV XRUBIES 2.6.0 2.5.0 2.4.0 2.3.0 2.2.2
|
92
|
+
ENV XRUBIES 2.7.0 2.6.0 2.5.0 2.4.0 2.3.0 2.2.2
|
63
93
|
|
64
94
|
# First do downloads sequentially since they can not run in parallel
|
65
95
|
# Then build all xruby versions in parallel
|
66
96
|
# Then cleanup all build artifacts
|
67
97
|
RUN for rv in $XRUBIES; do \
|
68
|
-
bash -c "rake-compiler
|
98
|
+
bash -c "rake-compiler prepare-sources VERSION=$rv HOST=x86_64-linux"; \
|
69
99
|
done; \
|
70
100
|
for rv in $XRUBIES; do \
|
71
|
-
for host in
|
72
|
-
echo -n "'rake-compiler cross-ruby VERSION=$rv HOST=$host' " >> ~/xbuild_rubies; \
|
101
|
+
for host in <%= target %>; do \
|
102
|
+
echo -n "'env MAKE=\"make V=0\" rake-compiler cross-ruby VERSION=$rv HOST=$host' " >> ~/xbuild_rubies; \
|
73
103
|
done; \
|
74
104
|
done && \
|
75
105
|
cat ~/xbuild_rubies; \
|
@@ -79,33 +109,61 @@ RUN for rv in $XRUBIES; do \
|
|
79
109
|
rm -rf ~/.rake-compiler/builds ~/.rake-compiler/sources && \
|
80
110
|
find /usr/local/rvm -type d -print0 | sudo xargs -0 chmod g+sw "
|
81
111
|
|
112
|
+
<% if platform=~/linux/ %>
|
82
113
|
# Avoid linking against libruby shared object.
|
83
114
|
# See also https://github.com/rake-compiler/rake-compiler-dock/issues/13
|
84
115
|
RUN find /usr/local/rake-compiler/ruby/*linux*/ -name libruby.so | xargs rm
|
85
116
|
RUN find /usr/local/rake-compiler/ruby/*linux*/ -name libruby-static.a | while read f ; do cp $f `echo $f | sed s/-static//` ; done
|
86
117
|
RUN find /usr/local/rake-compiler/ruby/*linux*/ -name libruby.a | while read f ; do ar t $f | xargs ar d $f ; done
|
87
118
|
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
|
119
|
+
<% end %>
|
88
120
|
|
121
|
+
<% if platform=~/mingw/ %>
|
89
122
|
# RubyInstaller doesn't install libgcc -> link it static.
|
90
123
|
RUN find /usr/local/rake-compiler/ruby/*mingw*/ -name rbconfig.rb | while read f ; do sed -i 's/."LDFLAGS". = "/&-static-libgcc /' $f ; done
|
124
|
+
# Raise Windows-API to Vista (affects ruby < 2.6 only)
|
125
|
+
RUN find /usr/local/rake-compiler/ruby -name rbconfig.rb | while read f ; do sed -i 's/0x0501/0x0600/' $f ; done
|
126
|
+
# Don't link to static libruby
|
127
|
+
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
|
128
|
+
<% end %>
|
91
129
|
|
92
130
|
USER root
|
93
131
|
|
94
132
|
# Add more libraries and tools to support cross build
|
95
|
-
RUN
|
133
|
+
RUN <%
|
134
|
+
if platform=~/x86-linux/ %> dpkg --add-architecture i386 && <% end %> \
|
96
135
|
apt-get -y update && \
|
97
|
-
apt-get install -y
|
136
|
+
apt-get install -y cmake <%
|
137
|
+
if platform=~/x86-linux/ %> libc6-dev:i386 libudev-dev:i386 <% end %><%
|
138
|
+
if platform=~/x86_64-linux/ %> libudev-dev <% end %> && \
|
139
|
+
rm -rf /var/lib/apt/lists/*
|
98
140
|
|
99
141
|
# Fix paths in rake-compiler/config.yml and add rvm and mingw-tools to the global bashrc
|
100
142
|
RUN sed -i -- "s:/root/.rake-compiler:/usr/local/rake-compiler:g" /usr/local/rake-compiler/config.yml && \
|
101
143
|
echo "source /etc/profile.d/rvm.sh" >> /etc/bash.bashrc
|
102
144
|
|
103
|
-
|
145
|
+
<% if platform=~/mingw/ %>
|
146
|
+
# Install wrappers for strip commands as a workaround for "Protocol error" in boot2docker.
|
104
147
|
COPY build/strip_wrapper /root/
|
105
|
-
RUN mv /usr/bin
|
106
|
-
|
107
|
-
|
108
|
-
|
148
|
+
RUN mv /usr/bin/<%= target %>-strip /usr/bin/<%= target %>-strip.bin && \
|
149
|
+
ln /root/strip_wrapper /usr/bin/<%= target %>-strip
|
150
|
+
|
151
|
+
# Don't link to winpthread.dll but link static, since the DLL is not distributed with RubyInstaller
|
152
|
+
RUN find / -name libwinpthread.dll.a | xargs rm
|
153
|
+
RUN find / -name libwinpthread-1.dll | xargs rm
|
154
|
+
|
155
|
+
# Use posix pthread for mingw so that C++ standard library for thread could be
|
156
|
+
# available such as std::thread, std::mutex, so on.
|
157
|
+
# https://sourceware.org/pthreads-win32/
|
158
|
+
RUN printf "1\n" | update-alternatives --config <%= target %>-gcc && \
|
159
|
+
printf "1\n" | update-alternatives --config <%= target %>-g++
|
160
|
+
<% end %>
|
161
|
+
|
162
|
+
<% if platform=~/linux/ %>
|
163
|
+
# Make the system to have GLIBC 2.12 instead of 2.23 so that
|
164
|
+
# generated ruby package can run on CentOS 6 with GLIBC 2.12
|
165
|
+
RUN sed -i 's/__GLIBC_MINOR__\t[0-9][0-9]/__GLIBC_MINOR__\t12/' /usr/include/features.h
|
166
|
+
<% end %>
|
109
167
|
|
110
168
|
# Install SIGINT forwarder
|
111
169
|
COPY build/sigfw.c /root/
|
@@ -117,6 +175,6 @@ COPY build/runas /usr/local/bin/
|
|
117
175
|
# Install sudoers configuration
|
118
176
|
COPY build/sudoers /etc/sudoers.d/rake-compiler-dock
|
119
177
|
|
120
|
-
ENV RUBY_CC_VERSION 2.6.0:2.5.0:2.4.0:2.3.0:2.2.2
|
178
|
+
ENV RUBY_CC_VERSION 2.7.0:2.6.0:2.5.0:2.4.0:2.3.0:2.2.2
|
121
179
|
|
122
180
|
CMD bash
|
data/History.md
CHANGED
@@ -1,3 +1,26 @@
|
|
1
|
+
1.0.0 / 2020-01-04
|
2
|
+
------------------
|
3
|
+
* Add ruby-2.7.0 cross ruby.
|
4
|
+
* Use per-target docker images.
|
5
|
+
There are currently 5 docker images:
|
6
|
+
* larskanis/rake-compiler-dock-mri-x86-mingw32
|
7
|
+
* larskanis/rake-compiler-dock-mri-x64-mingw32
|
8
|
+
* larskanis/rake-compiler-dock-mri-x86-linux
|
9
|
+
* larskanis/rake-compiler-dock-mri-x86_64-linux
|
10
|
+
* larskanis/rake-compiler-dock-jruby
|
11
|
+
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.
|
12
|
+
See the README.md for more information.
|
13
|
+
* Ensure the separate docker images always use as much as possible common docker images layers to avoid increased download sizes.
|
14
|
+
* Pass GEM_PRIVATE_KEY_PASSPHRASE to the container.
|
15
|
+
* Update JRuby to 9.2.9.0 and native CRuby to 2.5.7.
|
16
|
+
* Create empty ~/.gem to be used for gem signing key.
|
17
|
+
* Ensure terminal is in cooked mode after build.
|
18
|
+
This fixes terminal misconfiguration after parallel builds.
|
19
|
+
* Raise Windows-API to Vista (affects ruby < 2.6 only)
|
20
|
+
* Use posix pthread for mingw so that C++ standard library for thread could be available such as std::thread, std::mutex, so on.
|
21
|
+
* 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
|
22
|
+
|
23
|
+
|
1
24
|
0.7.2 / 2019-03-18
|
2
25
|
------------------
|
3
26
|
* Fix missing libruby.a of cross rubies. Fixes #26
|
data/README.md
CHANGED
@@ -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://
|
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
|
|
@@ -34,16 +34,19 @@ Rake-compiler-dock provides the necessary tools to build Ruby extensions for Win
|
|
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
|
-
|
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
|
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-
|
67
|
-
|
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
|
|
@@ -105,13 +114,52 @@ This can be done like this:
|
|
105
114
|
task 'gem:native' do
|
106
115
|
require 'rake_compiler_dock'
|
107
116
|
sh "bundle package" # Avoid repeated downloads of gems by using gem files from the host.
|
108
|
-
|
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
|
109
120
|
RakeCompilerDock.sh "bundle --local && rake java gem", rubyvm: :jruby
|
110
121
|
end
|
111
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
|
+
|
112
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.
|
113
161
|
|
114
|
-
gem 'rake-compiler-dock', '~>
|
162
|
+
gem 'rake-compiler-dock', '~> 1.0'
|
115
163
|
|
116
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.
|
117
165
|
|
@@ -122,14 +170,18 @@ Rake-compiler-dock makes use of several environment variables.
|
|
122
170
|
|
123
171
|
The following variables are recognized by rake-compiler-dock:
|
124
172
|
|
125
|
-
* `RCD_RUBYVM` - The
|
173
|
+
* `RCD_RUBYVM` - The ruby VM and toolchain to be used.
|
126
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`.
|
127
178
|
* `RCD_IMAGE` - The docker image that is downloaded and started.
|
128
179
|
Defaults to "larskanis/rake-compiler-dock:IMAGE_VERSION" with an image version that is determined by the gem version.
|
129
180
|
|
130
181
|
The following variables are passed through to the docker container without modification:
|
131
182
|
|
132
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.
|
133
185
|
|
134
186
|
The following variables are provided to the running docker container:
|
135
187
|
|
data/Rakefile
CHANGED
@@ -1,13 +1,45 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require "rake/clean"
|
1
3
|
require "rake_compiler_dock"
|
2
|
-
|
4
|
+
require_relative "build/gem_helper"
|
5
|
+
require_relative "build/parallel_docker_build"
|
3
6
|
|
4
7
|
RakeCompilerDock::GemHelper.install_tasks
|
5
8
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
+
namespace :build do
|
10
|
+
platforms = [
|
11
|
+
["x86-mingw32", "i686-w64-mingw32"],
|
12
|
+
["x64-mingw32", "x86_64-w64-mingw32"],
|
13
|
+
["x86-linux", "i686-linux-gnu"],
|
14
|
+
["x86_64-linux", "x86_64-linux-gnu"],
|
15
|
+
]
|
16
|
+
platforms.each do |platform, target|
|
17
|
+
sdf = "Dockerfile.mri.#{platform}"
|
18
|
+
desc "Build image for platform #{platform}"
|
19
|
+
task platform => sdf
|
20
|
+
task sdf do
|
21
|
+
sh "docker build -t larskanis/rake-compiler-dock-mri-#{platform}:#{RakeCompilerDock::IMAGE_VERSION} -f Dockerfile.mri.#{platform} ."
|
22
|
+
end
|
23
|
+
|
24
|
+
df = ERB.new(File.read("Dockerfile.mri.erb")).result(binding)
|
25
|
+
File.write(sdf, df)
|
26
|
+
CLEAN.include(sdf)
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "Build image for JRuby"
|
30
|
+
task :jruby => "Dockerfile.jruby"
|
31
|
+
task "Dockerfile.jruby" do
|
32
|
+
sh "docker build -t larskanis/rake-compiler-dock-jruby:#{RakeCompilerDock::IMAGE_VERSION} -f Dockerfile.jruby ."
|
33
|
+
end
|
34
|
+
|
35
|
+
RakeCompilerDock::ParallelDockerBuild.new(platforms.map{|pl, _| "Dockerfile.mri.#{pl}" } + ["Dockerfile.jruby"], workdir: "tmp/docker")
|
36
|
+
|
37
|
+
desc "Build images for all platforms in parallel"
|
38
|
+
multitask :all => platforms.map(&:first) + ["jruby"]
|
9
39
|
end
|
10
40
|
|
41
|
+
task :build => "build:all"
|
42
|
+
|
11
43
|
desc "Run tests"
|
12
44
|
task :test do
|
13
45
|
sh "ruby -w -W2 -I. -Ilib -e \"#{Dir["test/test_*.rb"].map{|f| "require '#{f}';"}.join}\" -- -v"
|