rake-compiler-dock 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/workflows/ci.yml +168 -0
- data/.gitignore +11 -1
- data/Dockerfile.jruby +6 -5
- data/Dockerfile.mri.erb +83 -43
- data/History.md +19 -1
- data/README.md +95 -36
- data/Rakefile +39 -12
- data/build/parallel_docker_build.rb +7 -3
- data/build/patches/{ruby-2.5.8 → ruby-2.5.9}/no_sendfile.patch +0 -0
- data/build/patches/{ruby-3.0.0 → ruby-3.1.0}/no_sendfile.patch +0 -0
- data/build/patches2/{rake-compiler-1.1.1 → rake-compiler-1.1.6}/0004-Enable-build-of-static-libruby.patch +3 -4
- data/build/rcd-env.sh +6 -0
- data/build/runas +1 -9
- data/lib/rake_compiler_dock/starter.rb +3 -2
- data/lib/rake_compiler_dock/version.rb +2 -2
- data/mingw64-ucrt/Dockerfile +62 -0
- data/mingw64-ucrt/binutils-mingw-w64-ignore-check-errors.patch +13 -0
- data/mingw64-ucrt/gcc-mingw-w64-only-c-c++.patch +13 -0
- data/mingw64-ucrt/mingw-w64-enable-ucrt.patch +22 -0
- data/rake-compiler-dock.gemspec +2 -2
- data/test/env/Dockerfile.alpine +17 -0
- data/test/env/Dockerfile.centos +17 -0
- data/test/env/Dockerfile.debian +24 -0
- data/test/rcd_test/Gemfile +11 -0
- data/test/rcd_test/Rakefile +74 -0
- data/test/rcd_test/ext/java/RcdTestExtService.java +19 -0
- data/test/rcd_test/ext/java/RubyRcdTest.java +16 -0
- data/test/rcd_test/ext/mri/extconf.rb +20 -0
- data/test/rcd_test/ext/mri/rcd_test_ext.c +35 -0
- data/test/rcd_test/ext/mri/rcd_test_ext.h +6 -0
- data/test/rcd_test/lib/rcd_test.rb +6 -0
- data/test/rcd_test/rcd_test.gemspec +27 -0
- data/test/rcd_test/test/test_basic.rb +22 -0
- data/test/test_environment_variables.rb +56 -31
- data/test/test_parallel_docker_build.rb +19 -6
- data.tar.gz.sig +0 -0
- metadata +74 -37
- metadata.gz.sig +0 -0
- data/build/patches2/hoe-3.20.0/0001-Load-encrypted-private-key-using-ENV-GEM_PRIVATE_KEY.patch +0 -32
- data/build/patches2/rake-compiler-1.1.1/0001-Fix-determining-of-ruby-versions-in-rake-native-gem.patch +0 -44
- data/build/patches2/rake-compiler-1.1.1/0003-Allow-building-of-cross-rubies-in-parallel.patch +0 -214
- data/build/patches2/rake-compiler-1.1.1/0005-Don-t-mask-out-build-env-vars-for-cross-ruby.patch +0 -30
- data/build/patches2/rake-compiler-1.1.1/0006-Use-RAKE_EXTENSION_TASK_NO_NATIVE-env-var-as-the-def.patch +0 -26
- data/build/patches2/ruby-2.7.0/ruby2_keywords.patch +0 -15
- data/build/patches2/ruby-3.0.0/ruby2_keywords.patch +0 -15
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# rake-compiler-dock
|
2
2
|
|
3
|
-
**Easy to use and reliable cross compiler environment for building Windows, Linux and JRuby binary gems.**
|
3
|
+
**Easy to use and reliable cross compiler environment for building Windows, Linux, Mac and JRuby binary gems.**
|
4
4
|
|
5
|
-
It provides cross compilers and Ruby environments for 2.
|
5
|
+
It provides cross compilers and Ruby environments for 2.4 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
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
|
|
@@ -12,11 +12,7 @@ It is also more reliable, since the underlying docker images are versioned and i
|
|
12
12
|
|
13
13
|
## Installation
|
14
14
|
|
15
|
-
Install docker
|
16
|
-
|
17
|
-
$ sudo apt-get install docker.io
|
18
|
-
|
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) .
|
15
|
+
Install docker [following the instructions on the docker website](https://docs.docker.com/engine/install/) ... 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
16
|
|
21
17
|
Install rake-compiler-dock as a gem. The docker image is downloaded later on demand:
|
22
18
|
|
@@ -34,10 +30,12 @@ Rake-compiler-dock provides the necessary tools to build Ruby extensions for Win
|
|
34
30
|
It is intended to be used in conjunction with [rake-compiler's](https://github.com/rake-compiler/rake-compiler) cross build capability.
|
35
31
|
Your Rakefile should enable cross compilation like so:
|
36
32
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
33
|
+
```ruby
|
34
|
+
exttask = Rake::ExtensionTask.new('my_extension', my_gem_spec) do |ext|
|
35
|
+
ext.cross_compile = true
|
36
|
+
ext.cross_platform = %w[x86-mingw32 x64-mingw-ucrt x64-mingw32 x86-linux x86_64-linux x86_64-darwin arm64-darwin]
|
37
|
+
end
|
38
|
+
```
|
41
39
|
|
42
40
|
See below, how to invoke cross builds in your Rakefile.
|
43
41
|
|
@@ -46,7 +44,9 @@ Additionally it may also be used to build ffi based binary gems like [libusb](ht
|
|
46
44
|
### Interactive Usage
|
47
45
|
|
48
46
|
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
|
47
|
+
There are dedicated images for `x86-mingw32`, `x64-mingw-ucrt`, `x64-mingw32`, `x86-linux`, `x86_64-linux`, `x86_64-darwin`, `arm64-darwin` and `jruby` targets.
|
48
|
+
The images contain all supported cross ruby versions, with the exception of `x64-mingw32`, which has versions before 3.1 only, and `x64-mingw-ucrt`, which has only ruby-3.1+.
|
49
|
+
This is to match the [changed platform of RubyInstaller-3.1](https://rubyinstaller.org/2021/12/31/rubyinstaller-3.1.0-1-released.html).
|
50
50
|
|
51
51
|
`rake-compiler-dock` without arguments starts an interactive shell session.
|
52
52
|
This is best suited to try out and debug a build.
|
@@ -81,13 +81,64 @@ Or non-interactive:
|
|
81
81
|
|
82
82
|
The environment variable `RUBY_CC_VERSION` is predefined as described [below](#environment-variables).
|
83
83
|
|
84
|
-
If necessary, additional software
|
85
|
-
This is local to the running session, only
|
84
|
+
If necessary, additional software can be installed, prior to the build command.
|
85
|
+
This is local to the running session, only.
|
86
|
+
|
87
|
+
For Windows and Mac:
|
86
88
|
|
87
89
|
sudo apt-get update && sudo apt-get install your-package
|
88
90
|
|
91
|
+
For Linux:
|
92
|
+
|
93
|
+
sudo yum install your-package
|
94
|
+
|
89
95
|
You can also choose between different executable ruby versions by `rvm use <version>` .
|
90
|
-
The current default is
|
96
|
+
The current default is 3.1.
|
97
|
+
|
98
|
+
|
99
|
+
### As a CI System Container
|
100
|
+
|
101
|
+
The OCI images provided by rake-compiler-dock can be used without the `rake-compiler-dock` gem or wrapper. This may be useful if your CI pipeline is building native gems.
|
102
|
+
|
103
|
+
For example, a Github Actions job might look like this:
|
104
|
+
|
105
|
+
``` yaml
|
106
|
+
jobs:
|
107
|
+
native-gem:
|
108
|
+
name: "native-gem"
|
109
|
+
runs-on: ubuntu-latest
|
110
|
+
container:
|
111
|
+
image: "larskanis/rake-compiler-dock-mri-x86_64-linux:1.2.0"
|
112
|
+
steps:
|
113
|
+
- uses: actions/checkout@v2
|
114
|
+
- run: bundle install && bundle exec rake gem:x86_64-linux:rcd
|
115
|
+
- uses: actions/upload-artifact@v2
|
116
|
+
with:
|
117
|
+
name: native-gem
|
118
|
+
path: gems
|
119
|
+
retention-days: 1
|
120
|
+
```
|
121
|
+
|
122
|
+
Where the referenced rake task might be defined by:
|
123
|
+
|
124
|
+
``` ruby
|
125
|
+
cross_platforms = ["x64-mingw32", "x86_64-linux", "x86_64-darwin", "arm64-darwin"]
|
126
|
+
|
127
|
+
namespace "gem" do
|
128
|
+
cross_platforms.each do |platform|
|
129
|
+
namespace platform do
|
130
|
+
task "rcd" do
|
131
|
+
Rake::Task["native:#{platform}"].invoke
|
132
|
+
Rake::Task["pkg/#{rcee_precompiled_spec.full_name}-#{Gem::Platform.new(platform)}.gem"].invoke
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
```
|
139
|
+
|
140
|
+
For an example of rake tasks that support this style of invocation, visit https://github.com/flavorjones/ruby-c-extensions-explained/tree/main/precompiled
|
141
|
+
|
91
142
|
|
92
143
|
### JRuby support
|
93
144
|
|
@@ -111,17 +162,19 @@ To build java binary gems interactively, it can be called like this:
|
|
111
162
|
To make the build process reproducible for other parties, it is recommended to add rake-compiler-dock to your Rakefile.
|
112
163
|
This can be done like this:
|
113
164
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
165
|
+
```ruby
|
166
|
+
task 'gem:native' do
|
167
|
+
require 'rake_compiler_dock'
|
168
|
+
sh "bundle package --all" # Avoid repeated downloads of gems by using gem files from the host.
|
169
|
+
%w[ x86-mingw32 x64-mingw-ucrt x64-mingw32 x86-linux x86_64-linux arm-linux aarch64-linux x86_64-darwin arm64-darwin ].each do |plat|
|
170
|
+
RakeCompilerDock.sh "bundle --local && rake native:#{plat} gem", platform: plat
|
171
|
+
end
|
172
|
+
RakeCompilerDock.sh "bundle --local && rake java gem", rubyvm: :jruby
|
173
|
+
end
|
174
|
+
```
|
122
175
|
|
123
176
|
This runs the `bundle` and `rake` commands once for each platform.
|
124
|
-
That is once for the jruby gems and
|
177
|
+
That is once for the jruby gems and 6 times for the specified MRI platforms.
|
125
178
|
|
126
179
|
### Run builds in parallel
|
127
180
|
|
@@ -133,17 +186,19 @@ Please note, that parallel builds only work reliable, if the specific platform g
|
|
133
186
|
|
134
187
|
```ruby
|
135
188
|
namespace "gem" do
|
189
|
+
task 'prepare' do
|
190
|
+
require 'rake_compiler_dock'
|
191
|
+
require 'io/console'
|
192
|
+
sh "bundle package --all"
|
193
|
+
sh "cp ~/.gem/gem-*.pem build/gem/ || true"
|
194
|
+
ENV["GEM_PRIVATE_KEY_PASSPHRASE"] = STDIN.getpass("Enter passphrase of gem signature key: ")
|
195
|
+
end
|
196
|
+
|
136
197
|
exttask.cross_platform.each do |plat|
|
137
|
-
desc "Build
|
198
|
+
desc "Build all native binary gems in parallel"
|
138
199
|
multitask 'native' => plat
|
139
200
|
|
140
|
-
|
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
|
-
|
201
|
+
desc "Build the native gem for #{plat}"
|
147
202
|
task plat => 'prepare' do
|
148
203
|
RakeCompilerDock.sh <<-EOT, platform: plat
|
149
204
|
(cp build/gem/gem-*.pem ~/.gem/ || true) &&
|
@@ -159,7 +214,9 @@ Please note, that parallel builds only work reliable, if the specific platform g
|
|
159
214
|
|
160
215
|
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.
|
161
216
|
|
162
|
-
|
217
|
+
```ruby
|
218
|
+
gem 'rake-compiler-dock', '~> 1.2'
|
219
|
+
```
|
163
220
|
|
164
221
|
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.
|
165
222
|
|
@@ -173,7 +230,7 @@ The following variables are recognized by rake-compiler-dock:
|
|
173
230
|
* `RCD_RUBYVM` - The ruby VM and toolchain to be used.
|
174
231
|
Must be one of `mri`, `jruby`.
|
175
232
|
* `RCD_PLATFORM` - The target rubygems platform.
|
176
|
-
Must be a space separated list out of `x86-mingw32`, `x64-mingw32`, `x86-linux`
|
233
|
+
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`.
|
177
234
|
It is ignored when `rubyvm` is set to `:jruby`.
|
178
235
|
* `RCD_IMAGE` - The docker image that is downloaded and started.
|
179
236
|
Defaults to "larskanis/rake-compiler-dock:IMAGE_VERSION" with an image version that is determined by the gem version.
|
@@ -189,7 +246,7 @@ The following variables are provided to the running docker container:
|
|
189
246
|
* `RCD_HOST_RUBY_PLATFORM` - The `RUBY_PLATFORM` of the host ruby.
|
190
247
|
* `RCD_HOST_RUBY_VERSION` - The `RUBY_VERSION` of the host ruby.
|
191
248
|
* `RUBY_CC_VERSION` - The target ruby versions for rake-compiler.
|
192
|
-
The default is defined in the [Dockerfile](https://github.com/rake-compiler/rake-compiler-dock/blob/
|
249
|
+
The default is defined in the [Dockerfile](https://github.com/rake-compiler/rake-compiler-dock/blob/94770238d68d71df5f70abe76097451a575ce46c/Dockerfile.mri.erb#L229), but can be changed as a parameter to rake.
|
193
250
|
* `RCD_MOUNTDIR` - The directory which is mounted into the docker container.
|
194
251
|
Defaults to pwd.
|
195
252
|
* `RCD_WORKDIR` - The working directory within the docker container.
|
@@ -197,7 +254,9 @@ The following variables are provided to the running docker container:
|
|
197
254
|
|
198
255
|
Other environment variables can be set or passed through to the container like this:
|
199
256
|
|
200
|
-
|
257
|
+
```ruby
|
258
|
+
RakeCompilerDock.sh "rake cross native gem OPENSSL_VERSION=#{ENV['OPENSSL_VERSION']}"
|
259
|
+
```
|
201
260
|
|
202
261
|
|
203
262
|
## More information
|
data/Rakefile
CHANGED
@@ -7,26 +7,32 @@ require_relative "build/parallel_docker_build"
|
|
7
7
|
RakeCompilerDock::GemHelper.install_tasks
|
8
8
|
|
9
9
|
DOCKERHUB_USER = ENV['DOCKERHUB_USER'] || "larskanis"
|
10
|
+
docker_build_cmd = Shellwords.split(ENV['RCD_DOCKER_BUILD'] || "docker build")
|
11
|
+
|
12
|
+
platforms = [
|
13
|
+
["x86-mingw32", "i686-w64-mingw32"],
|
14
|
+
["x64-mingw32", "x86_64-w64-mingw32"],
|
15
|
+
["x64-mingw-ucrt", "x86_64-w64-mingw32"],
|
16
|
+
["x86-linux", "i686-redhat-linux"],
|
17
|
+
["x86_64-linux", "x86_64-redhat-linux"],
|
18
|
+
["x86_64-darwin", "x86_64-apple-darwin"],
|
19
|
+
["arm64-darwin", "aarch64-apple-darwin"],
|
20
|
+
["arm-linux", "arm-linux-gnueabihf"],
|
21
|
+
["aarch64-linux", "aarch64-linux-gnu"],
|
22
|
+
]
|
10
23
|
|
11
24
|
namespace :build do
|
12
|
-
|
13
|
-
["x86-mingw32", "i686-w64-mingw32"],
|
14
|
-
["x64-mingw32", "x86_64-w64-mingw32"],
|
15
|
-
["x86-linux", "i686-redhat-linux"],
|
16
|
-
["x86_64-linux", "x86_64-redhat-linux"],
|
17
|
-
["x86_64-darwin", "x86_64-apple-darwin"],
|
18
|
-
["arm64-darwin", "aarch64-apple-darwin"],
|
19
|
-
]
|
25
|
+
|
20
26
|
platforms.each do |platform, target|
|
21
27
|
sdf = "Dockerfile.mri.#{platform}"
|
22
28
|
|
23
29
|
desc "Build image for platform #{platform}"
|
24
30
|
task platform => sdf
|
25
31
|
task sdf do
|
26
|
-
sh "
|
32
|
+
sh(*docker_build_cmd, "-t", "#{DOCKERHUB_USER}/rake-compiler-dock-mri-#{platform}:#{RakeCompilerDock::IMAGE_VERSION}", "-f", "Dockerfile.mri.#{platform}", ".")
|
27
33
|
end
|
28
34
|
|
29
|
-
df = ERB.new(File.read("Dockerfile.mri.erb")).result(binding)
|
35
|
+
df = ERB.new(File.read("Dockerfile.mri.erb"), trim_mode: ">").result(binding)
|
30
36
|
File.write(sdf, df)
|
31
37
|
CLEAN.include(sdf)
|
32
38
|
end
|
@@ -34,10 +40,10 @@ namespace :build do
|
|
34
40
|
desc "Build image for JRuby"
|
35
41
|
task :jruby => "Dockerfile.jruby"
|
36
42
|
task "Dockerfile.jruby" do
|
37
|
-
sh "
|
43
|
+
sh(*docker_build_cmd, "-t", "#{DOCKERHUB_USER}/rake-compiler-dock-jruby:#{RakeCompilerDock::IMAGE_VERSION}", "-f", "Dockerfile.jruby", ".")
|
38
44
|
end
|
39
45
|
|
40
|
-
RakeCompilerDock::ParallelDockerBuild.new(platforms.map{|pl, _| "Dockerfile.mri.#{pl}" } + ["Dockerfile.jruby"], workdir: "tmp/docker")
|
46
|
+
RakeCompilerDock::ParallelDockerBuild.new(platforms.map{|pl, _| "Dockerfile.mri.#{pl}" } + ["Dockerfile.jruby"], workdir: "tmp/docker", docker_build_cmd: docker_build_cmd)
|
41
47
|
|
42
48
|
desc "Build images for all MRI platforms in parallel"
|
43
49
|
multitask :mri => platforms.map(&:first)
|
@@ -48,6 +54,14 @@ end
|
|
48
54
|
|
49
55
|
task :build => "build:all"
|
50
56
|
|
57
|
+
namespace :prepare do
|
58
|
+
desc "Build cross compiler for x64-mingw-ucrt aka RubyInstaller-3.1+"
|
59
|
+
task "mingw64-ucrt" do
|
60
|
+
sh(*docker_build_cmd, "-t", "#{DOCKERHUB_USER}/mingw64-ucrt:20.04", ".",
|
61
|
+
chdir: "mingw64-ucrt")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
51
65
|
desc "Run tests"
|
52
66
|
task :test do
|
53
67
|
sh "ruby -w -W2 -I. -Ilib -e \"#{Dir["test/test_*.rb"].map{|f| "require '#{f}';"}.join}\" -- -v"
|
@@ -74,3 +88,16 @@ task :update_lists do
|
|
74
88
|
EOT
|
75
89
|
end
|
76
90
|
end
|
91
|
+
|
92
|
+
namespace :release do
|
93
|
+
desc "push all docker images"
|
94
|
+
task :images do
|
95
|
+
jimg = "#{DOCKERHUB_USER}/rake-compiler-dock-jruby:#{RakeCompilerDock::IMAGE_VERSION}"
|
96
|
+
sh "docker", "push", jimg
|
97
|
+
|
98
|
+
platforms.each do |platform, _|
|
99
|
+
img = "#{DOCKERHUB_USER}/rake-compiler-dock-mri-#{platform}:#{RakeCompilerDock::IMAGE_VERSION}"
|
100
|
+
sh "docker", "push", img
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -6,7 +6,11 @@ module RakeCompilerDock
|
|
6
6
|
class ParallelDockerBuild
|
7
7
|
include Rake::DSL
|
8
8
|
|
9
|
-
|
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
|
10
14
|
FileUtils.mkdir_p(workdir)
|
11
15
|
|
12
16
|
files = parse_dockerfiles(dockerfiles, inputdir)
|
@@ -25,7 +29,7 @@ module RakeCompilerDock
|
|
25
29
|
# "File1"=>[" FROM a\n",
|
26
30
|
# ...
|
27
31
|
def parse_dockerfiles(dockerfiles, inputdir)
|
28
|
-
|
32
|
+
dockerfiles.map do |fn|
|
29
33
|
[fn, File.read(File.join(inputdir, fn))]
|
30
34
|
end.map do |fn, f|
|
31
35
|
# Split file contant in lines unless line ends with backslash
|
@@ -96,7 +100,7 @@ module RakeCompilerDock
|
|
96
100
|
#
|
97
101
|
# The layers will be reused in subsequent builds, even if they run in parallel.
|
98
102
|
def docker_build(filename, workdir)
|
99
|
-
sh
|
103
|
+
sh(*docker_build_cmd, "-f", File.join(workdir, filename), ".")
|
100
104
|
end
|
101
105
|
end
|
102
106
|
end
|
File without changes
|
File without changes
|
@@ -1,8 +1,8 @@
|
|
1
1
|
diff --git a/tasks/bin/cross-ruby.rake b/tasks/bin/cross-ruby.rake
|
2
|
-
index
|
2
|
+
index 8317a2a..5a1b3ea 100644
|
3
3
|
--- a/tasks/bin/cross-ruby.rake
|
4
4
|
+++ b/tasks/bin/cross-ruby.rake
|
5
|
-
@@ -116,
|
5
|
+
@@ -116,10 +116,22 @@ RUBY_CC_VERSIONS.split(":").each do |ruby_cc_version|
|
6
6
|
"--host=#{mingw_host}",
|
7
7
|
"--target=#{mingw_target}",
|
8
8
|
"--build=#{RUBY_BUILD}",
|
@@ -11,7 +11,6 @@ index 8edf5cd..5d25b82 100644
|
|
11
11
|
+ '--disable-jit-support',
|
12
12
|
'--disable-install-doc',
|
13
13
|
'--with-ext=',
|
14
|
-
- 'LDFLAGS=-pipe -s',
|
15
14
|
]
|
16
15
|
+ if mingw_host=~/darwin/
|
17
16
|
+ options += [
|
@@ -24,6 +23,6 @@ index 8edf5cd..5d25b82 100644
|
|
24
23
|
+ '--enable-shared',
|
25
24
|
+ ]
|
26
25
|
+ end
|
27
|
-
|
26
|
+
|
28
27
|
# Force Winsock2 for Ruby 1.8, 1.9 defaults to it
|
29
28
|
options << "--with-winsock2" if major == "1.8"
|
data/build/rcd-env.sh
ADDED
data/build/runas
CHANGED
@@ -4,12 +4,4 @@ groupadd -o -g "$GID" "$GROUP"
|
|
4
4
|
mkdir -p /tmp/home
|
5
5
|
useradd -o -g "$GID" -u "$UID" -G rvm,sudo -p "" -b /tmp/home -m "$USER"
|
6
6
|
|
7
|
-
|
8
|
-
ln -s /usr/local/rake-compiler "$HOME"/.rake-compiler
|
9
|
-
mkdir -p "$HOME"/.gem
|
10
|
-
chown "$USER" "$HOME"/.gem
|
11
|
-
|
12
|
-
/usr/bin/sudo -u "$USER" -H \
|
13
|
-
BASH_ENV=/etc/rubybashrc \
|
14
|
-
RAKE_EXTENSION_TASK_NO_NATIVE=true \
|
15
|
-
-- "$@"
|
7
|
+
/usr/bin/sudo -u "$USER" -H BASH_ENV=/etc/rubybashrc -- "$@"
|
@@ -41,11 +41,12 @@ module RakeCompilerDock
|
|
41
41
|
user = options.fetch(:username){ current_user }
|
42
42
|
group = options.fetch(:groupname){ current_group }
|
43
43
|
rubyvm = options.fetch(:rubyvm){ ENV['RCD_RUBYVM'] } || "mri"
|
44
|
+
jrubyvm = rubyvm.to_s == "jruby"
|
44
45
|
|
45
|
-
platforms = options.fetch(:platform){ ENV['RCD_PLATFORM'] } || "x86-mingw32 x64-mingw32"
|
46
|
+
platforms = options.fetch(:platform){ ENV['RCD_PLATFORM'] } || (jrubyvm ? "jruby" : "x86-mingw32 x64-mingw32")
|
46
47
|
platforms.split(" ").each do |platform|
|
47
48
|
image_name = options.fetch(:image) do
|
48
|
-
platform_postfix =
|
49
|
+
platform_postfix = jrubyvm ? "" : "-#{platform}"
|
49
50
|
ENV['RCD_IMAGE'] ||
|
50
51
|
ENV['RAKE_COMPILER_DOCK_IMAGE'] ||
|
51
52
|
"larskanis/rake-compiler-dock-#{rubyvm}#{platform_postfix}:#{IMAGE_VERSION}"
|
@@ -0,0 +1,62 @@
|
|
1
|
+
FROM ubuntu:20.04
|
2
|
+
|
3
|
+
ARG DEBIAN_FRONTEND=noninteractive
|
4
|
+
|
5
|
+
RUN set -ex \
|
6
|
+
&& sed -i -- 's/# deb-src/deb-src/g' /etc/apt/sources.list \
|
7
|
+
&& apt-get update \
|
8
|
+
&& apt-get install -y --no-install-recommends \
|
9
|
+
build-essential \
|
10
|
+
cdbs \
|
11
|
+
devscripts \
|
12
|
+
equivs \
|
13
|
+
fakeroot \
|
14
|
+
pkg-config \
|
15
|
+
&& apt-get clean \
|
16
|
+
&& rm -rf /tmp/* /var/tmp/*
|
17
|
+
|
18
|
+
WORKDIR /build
|
19
|
+
|
20
|
+
# Download mingw sources
|
21
|
+
RUN apt-get source mingw-w64-common && \
|
22
|
+
cd mingw-w64-* && \
|
23
|
+
mk-build-deps -ir -t "apt-get -o Debug::pkgProblemResolver=yes -y --no-install-recommends"
|
24
|
+
|
25
|
+
# Patch build for UCRT and build UCRT enabled deb-packages
|
26
|
+
ADD mingw-w64-*.patch ./
|
27
|
+
RUN cd mingw-w64-* && \
|
28
|
+
cat debian/rules && \
|
29
|
+
ls ../mingw-w64-*.patch | xargs -n1 patch --verbose -p1 -i && \
|
30
|
+
dpkg-buildpackage -b && \
|
31
|
+
rm -rf ../*.ddeb ../*i686* `pwd`
|
32
|
+
|
33
|
+
# Install UCRT enabled deb-packages
|
34
|
+
RUN dpkg -i mingw-w64-common_7.0.0-2_all.deb \
|
35
|
+
mingw-w64-tools_7.0.0-2_amd64.deb \
|
36
|
+
mingw-w64-x86-64-dev_7.0.0-2_all.deb
|
37
|
+
|
38
|
+
# Download gcc-binutils sources for mingw
|
39
|
+
RUN apt-get source binutils-mingw-w64 && \
|
40
|
+
cd binutils-mingw-w64-* && \
|
41
|
+
mk-build-deps -ir -t "apt-get -o Debug::pkgProblemResolver=yes -y --no-install-recommends"
|
42
|
+
|
43
|
+
# Build gcc-binutils based on UCRT headers and crt
|
44
|
+
ADD binutils-mingw-w64-*.patch ./
|
45
|
+
RUN cd binutils-mingw-w64-* && \
|
46
|
+
ls ../binutils-mingw-w64-*.patch | xargs -n1 patch --verbose -p1 -i && \
|
47
|
+
dpkg-buildpackage -b --jobs=auto && \
|
48
|
+
rm -rf ../*.ddeb ../*i686* `pwd`
|
49
|
+
|
50
|
+
# Download gcc sources for mingw
|
51
|
+
RUN apt-get source gcc-mingw-w64 && \
|
52
|
+
cd gcc-mingw-w64-* && \
|
53
|
+
mk-build-deps -ir -t "apt-get -o Debug::pkgProblemResolver=yes -y --no-install-recommends"
|
54
|
+
|
55
|
+
# Build gcc (only C and C++) based on UCRT headers and crt
|
56
|
+
ADD gcc-mingw-w64-*.patch ./
|
57
|
+
RUN cd gcc-mingw-w64-* && \
|
58
|
+
ls ../gcc-mingw-w64-*.patch | xargs -n1 patch --verbose -p1 -i && \
|
59
|
+
dpkg-buildpackage -b --jobs=auto && \
|
60
|
+
rm -rf ../*.ddeb ../*i686* `pwd`
|
61
|
+
|
62
|
+
RUN ls -l *.deb
|
@@ -0,0 +1,13 @@
|
|
1
|
+
diff --git a/debian/rules b/debian/rules
|
2
|
+
index 4401493..62c8fe4 100755
|
3
|
+
--- a/debian/rules
|
4
|
+
+++ b/debian/rules
|
5
|
+
@@ -91,7 +91,7 @@ override_dh_auto_test-arch:
|
6
|
+
unset CFLAGS CPPFLAGS LDFLAGS; \
|
7
|
+
env > $(build_dir)/env; \
|
8
|
+
for target in $(targets); do \
|
9
|
+
- dh_auto_test -B$(build_dir)/$$target; \
|
10
|
+
+ dh_auto_test -B$(build_dir)/$$target || true; \
|
11
|
+
done
|
12
|
+
|
13
|
+
override_dh_auto_install-arch:
|
@@ -0,0 +1,13 @@
|
|
1
|
+
diff --git a/debian/rules b/debian/rules
|
2
|
+
index 9e7e40c..fa9a8a2 100755
|
3
|
+
--- a/debian/rules
|
4
|
+
+++ b/debian/rules
|
5
|
+
@@ -58,7 +58,7 @@ ifneq ($(filter stage1,$(DEB_BUILD_PROFILES)),)
|
6
|
+
INSTALL_TARGET := install-gcc
|
7
|
+
else
|
8
|
+
# Build the full GCC.
|
9
|
+
- languages := c,c++,fortran,objc,obj-c++,ada
|
10
|
+
+ languages := c,c++
|
11
|
+
BUILD_TARGET :=
|
12
|
+
INSTALL_TARGET := install install-lto-plugin
|
13
|
+
endif
|
@@ -0,0 +1,22 @@
|
|
1
|
+
diff --git a/debian/rules b/debian/rules
|
2
|
+
index 9fb970c..5473839 100755
|
3
|
+
--- a/debian/rules
|
4
|
+
+++ b/debian/rules
|
5
|
+
@@ -94,7 +94,7 @@ build-arch-stamp: $(patsubst %,$(host)~$(host)~tools-%-install-stamp,$(HOST_TOOL
|
6
|
+
%~headers-configure-stamp: autoreconf-stamp
|
7
|
+
mkdir -p $(call buildfolder,$*~headers) && \
|
8
|
+
cd $(call buildfolder,$*~headers) && \
|
9
|
+
- $(call sourcefolder,$*~headers)/configure --prefix=/usr/$(call ruletarget,$*~headers) --host=$(call rulehost,$*~headers) --enable-sdk=all --enable-secure-api
|
10
|
+
+ $(call sourcefolder,$*~headers)/configure --prefix=/usr/$(call ruletarget,$*~headers) --host=$(call rulehost,$*~headers) --enable-sdk=all --with-default-msvcrt=ucrt
|
11
|
+
touch $*-headers-configure-stamp
|
12
|
+
|
13
|
+
# Override CRT configuration to avoid multilib builds
|
14
|
+
@@ -108,7 +108,7 @@ target64crt := $(target64)~$(target64)~crt
|
15
|
+
$(target64crt)-configure-stamp: $(target64)~$(target64)~headers-install-stamp autoreconf-stamp
|
16
|
+
mkdir -p $(call buildfolder,$(target64crt)) && \
|
17
|
+
cd $(call buildfolder,$(target64crt)) && \
|
18
|
+
- $(call sourcefolder,$(target64crt))/configure --prefix=/usr/$(call ruletarget,$(target64crt)) --host=$(call rulehost,$(target64crt)) --target=$(call ruletarget,$(target64crt)) --disable-lib32 --enable-lib64 CPPFLAGS="$(CPPFLAGS) -I$(top_dir)/debian/tmp/usr/$(call ruletarget,$(target64crt))/include"
|
19
|
+
+ $(call sourcefolder,$(target64crt))/configure --prefix=/usr/$(call ruletarget,$(target64crt)) --host=$(call rulehost,$(target64crt)) --target=$(call ruletarget,$(target64crt)) --disable-lib32 --enable-lib64 --with-default-msvcrt=ucrt CPPFLAGS="$(CPPFLAGS) -I$(top_dir)/debian/tmp/usr/$(call ruletarget,$(target64crt))/include"
|
20
|
+
touch $@
|
21
|
+
|
22
|
+
build-indep-stamp: $(foreach target,$(targets),$(patsubst %,$(target)~$(target)~%-install-stamp,$(TARGET_PROJECTS))) $(patsubst %,$(target32)~$(target32)~%-install-stamp,$(TARGET32_PROJECTS))
|
data/rake-compiler-dock.gemspec
CHANGED
@@ -22,7 +22,7 @@ Use rake-compiler-dock to enter an interactive shell session or add a task to yo
|
|
22
22
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
23
23
|
spec.require_paths = ["lib"]
|
24
24
|
|
25
|
-
spec.add_development_dependency "bundler", "
|
26
|
-
spec.add_development_dependency "rake", "
|
25
|
+
spec.add_development_dependency "bundler", ">= 1.7", "< 3.0"
|
26
|
+
spec.add_development_dependency "rake", ">= 12"
|
27
27
|
spec.add_development_dependency "test-unit", "~> 3.0"
|
28
28
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
ARG from_image
|
2
|
+
FROM ${from_image}
|
3
|
+
|
4
|
+
RUN uname -a
|
5
|
+
RUN apk add ruby ruby-etc ruby-rake git
|
6
|
+
|
7
|
+
RUN ruby --version
|
8
|
+
RUN gem env
|
9
|
+
RUN gem inst bundler
|
10
|
+
|
11
|
+
WORKDIR /build
|
12
|
+
|
13
|
+
CMD ruby -e "puts Gem::Platform.local.to_s" && \
|
14
|
+
gem install --local *.gem --verbose --no-document && \
|
15
|
+
cd test/rcd_test/ && \
|
16
|
+
bundle install && \
|
17
|
+
rake test
|
@@ -0,0 +1,17 @@
|
|
1
|
+
ARG from_image
|
2
|
+
FROM ${from_image}
|
3
|
+
|
4
|
+
RUN uname -a
|
5
|
+
RUN yum install -y ruby git
|
6
|
+
|
7
|
+
RUN ruby --version
|
8
|
+
RUN gem env
|
9
|
+
RUN gem inst bundler
|
10
|
+
|
11
|
+
WORKDIR /build
|
12
|
+
|
13
|
+
CMD ruby -e "puts Gem::Platform.local.to_s" && \
|
14
|
+
gem install --local *.gem --verbose --no-document && \
|
15
|
+
cd test/rcd_test/ && \
|
16
|
+
bundle install && \
|
17
|
+
rake test
|
@@ -0,0 +1,24 @@
|
|
1
|
+
ARG from_image
|
2
|
+
FROM ${from_image}
|
3
|
+
|
4
|
+
# To prevent installed tzdata deb package to show interactive dialog.
|
5
|
+
ENV DEBIAN_FRONTEND noninteractive
|
6
|
+
|
7
|
+
RUN uname -a
|
8
|
+
RUN apt-get update -qq && \
|
9
|
+
apt-get install -yq \
|
10
|
+
-o Dpkg::Options::='--force-confnew' \
|
11
|
+
ruby \
|
12
|
+
git
|
13
|
+
|
14
|
+
RUN ruby --version
|
15
|
+
RUN gem env
|
16
|
+
RUN gem inst bundler
|
17
|
+
|
18
|
+
WORKDIR /build
|
19
|
+
|
20
|
+
CMD ruby -e "puts Gem::Platform.local.to_s" && \
|
21
|
+
gem install --local *.gem --verbose --no-document && \
|
22
|
+
cd test/rcd_test/ && \
|
23
|
+
bundle install && \
|
24
|
+
rake test
|