rake-compiler-dock 1.0.1 → 1.2.1
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 +7 -6
- data/Dockerfile.mri.erb +170 -73
- data/History.md +42 -0
- data/README.md +95 -36
- data/Rakefile +45 -10
- data/build/math_h.patch +189 -0
- data/build/parallel_docker_build.rb +7 -3
- data/build/patches/{ruby-2.5.7 → ruby-2.5.9}/no_sendfile.patch +0 -0
- data/build/patches/{ruby-2.7.0 → ruby-3.1.0}/no_sendfile.patch +6 -6
- data/build/patches2/rake-compiler-1.1.6/0004-Enable-build-of-static-libruby.patch +28 -0
- data/build/rcd-env.sh +6 -0
- data/build/runas +1 -8
- data/build/sudoers +1 -1
- 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 +22 -0
- data/test/env/Dockerfile.debian +24 -0
- data/test/rcd_test/Gemfile +11 -0
- data/test/rcd_test/Rakefile +75 -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 +23 -0
- data/test/rcd_test/ext/mri/rcd_test_ext.c +51 -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 +31 -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 +79 -19
- 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.0/0001-Allow-parallel-builds-of-cross-rubies.patch +0 -119
- data/build/patches2/rake-compiler-1.1.0/0001-Enable-build-of-static-libruby.patch +0 -28
- data/build/patches2/rake-compiler-1.1.0/0001-Fix-determining-of-ruby-versions-in-rake-native-gem.patch +0 -44
- data/build/patches2/rake-compiler-1.1.0/0002-Extend-mingw-search-pattern-to-find-x86_64-gcc.patch +0 -26
- data/build/patches2/rake-compiler-1.1.0/0002-Strip-cross-built-shared-library-files-while-linking.patch +0 -29
- data/build/patches2/ruby-2.7.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.1"
|
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
@@ -6,22 +6,33 @@ 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
|
+
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
|
+
]
|
23
|
+
|
9
24
|
namespace :build do
|
10
|
-
|
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
|
-
]
|
25
|
+
|
16
26
|
platforms.each do |platform, target|
|
17
27
|
sdf = "Dockerfile.mri.#{platform}"
|
28
|
+
|
18
29
|
desc "Build image for platform #{platform}"
|
19
30
|
task platform => sdf
|
20
31
|
task sdf do
|
21
|
-
sh "
|
32
|
+
sh(*docker_build_cmd, "-t", "#{DOCKERHUB_USER}/rake-compiler-dock-mri-#{platform}:#{RakeCompilerDock::IMAGE_VERSION}", "-f", "Dockerfile.mri.#{platform}", ".")
|
22
33
|
end
|
23
34
|
|
24
|
-
df = ERB.new(File.read("Dockerfile.mri.erb")).result(binding)
|
35
|
+
df = ERB.new(File.read("Dockerfile.mri.erb"), trim_mode: ">").result(binding)
|
25
36
|
File.write(sdf, df)
|
26
37
|
CLEAN.include(sdf)
|
27
38
|
end
|
@@ -29,10 +40,13 @@ namespace :build do
|
|
29
40
|
desc "Build image for JRuby"
|
30
41
|
task :jruby => "Dockerfile.jruby"
|
31
42
|
task "Dockerfile.jruby" do
|
32
|
-
sh "
|
43
|
+
sh(*docker_build_cmd, "-t", "#{DOCKERHUB_USER}/rake-compiler-dock-jruby:#{RakeCompilerDock::IMAGE_VERSION}", "-f", "Dockerfile.jruby", ".")
|
33
44
|
end
|
34
45
|
|
35
|
-
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)
|
47
|
+
|
48
|
+
desc "Build images for all MRI platforms in parallel"
|
49
|
+
multitask :mri => platforms.map(&:first)
|
36
50
|
|
37
51
|
desc "Build images for all platforms in parallel"
|
38
52
|
multitask :all => platforms.map(&:first) + ["jruby"]
|
@@ -40,6 +54,14 @@ end
|
|
40
54
|
|
41
55
|
task :build => "build:all"
|
42
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
|
+
|
43
65
|
desc "Run tests"
|
44
66
|
task :test do
|
45
67
|
sh "ruby -w -W2 -I. -Ilib -e \"#{Dir["test/test_*.rb"].map{|f| "require '#{f}';"}.join}\" -- -v"
|
@@ -66,3 +88,16 @@ task :update_lists do
|
|
66
88
|
EOT
|
67
89
|
end
|
68
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
|
data/build/math_h.patch
ADDED
@@ -0,0 +1,189 @@
|
|
1
|
+
--- centos7/math.h 2020-12-31 23:15:40.678843646 +0100
|
2
|
+
+++ builtin/math.h 2022-03-16 21:35:13.086169875 +0100
|
3
|
+
@@ -206,68 +206,142 @@
|
4
|
+
FP_NORMAL
|
5
|
+
};
|
6
|
+
|
7
|
+
+
|
8
|
+
+/* Depending on the type of TG_ARG, call an appropriately suffixed
|
9
|
+
+ version of FUNC with arguments (including parentheses) ARGS.
|
10
|
+
+ Suffixed functions may not exist for long double if it has the same
|
11
|
+
+ format as double, or for other types with the same format as float,
|
12
|
+
+ double or long double. The behavior is undefined if the argument
|
13
|
+
+ does not have a real floating type. The definition may use a
|
14
|
+
+ conditional expression, so all suffixed versions of FUNC must
|
15
|
+
+ return the same type (FUNC may include a cast if necessary rather
|
16
|
+
+ than being a single identifier). */
|
17
|
+
+#ifdef __NO_LONG_DOUBLE_MATH
|
18
|
+
+# if __HAVE_DISTINCT_FLOAT128
|
19
|
+
+# error "Distinct _Float128 without distinct long double not supported."
|
20
|
+
+# endif
|
21
|
+
+# define __MATH_TG(TG_ARG, FUNC, ARGS) \
|
22
|
+
+ (sizeof (TG_ARG) == sizeof (float) ? FUNC ## f ARGS : FUNC ARGS)
|
23
|
+
+#elif __HAVE_DISTINCT_FLOAT128
|
24
|
+
+# if __HAVE_GENERIC_SELECTION
|
25
|
+
+# if __HAVE_FLOATN_NOT_TYPEDEF && __HAVE_FLOAT32
|
26
|
+
+# define __MATH_TG_F32(FUNC, ARGS) _Float32: FUNC ## f ARGS,
|
27
|
+
+# else
|
28
|
+
+# define __MATH_TG_F32(FUNC, ARGS)
|
29
|
+
+# endif
|
30
|
+
+# if __HAVE_FLOATN_NOT_TYPEDEF && __HAVE_FLOAT64X
|
31
|
+
+# if __HAVE_FLOAT64X_LONG_DOUBLE
|
32
|
+
+# define __MATH_TG_F64X(FUNC, ARGS) _Float64x: FUNC ## l ARGS,
|
33
|
+
+# else
|
34
|
+
+# define __MATH_TG_F64X(FUNC, ARGS) _Float64x: FUNC ## f128 ARGS,
|
35
|
+
+# endif
|
36
|
+
+# else
|
37
|
+
+# define __MATH_TG_F64X(FUNC, ARGS)
|
38
|
+
+# endif
|
39
|
+
+# define __MATH_TG(TG_ARG, FUNC, ARGS) \
|
40
|
+
+ _Generic ((TG_ARG), \
|
41
|
+
+ float: FUNC ## f ARGS, \
|
42
|
+
+ __MATH_TG_F32 (FUNC, ARGS) \
|
43
|
+
+ default: FUNC ARGS, \
|
44
|
+
+ long double: FUNC ## l ARGS, \
|
45
|
+
+ __MATH_TG_F64X (FUNC, ARGS) \
|
46
|
+
+ _Float128: FUNC ## f128 ARGS)
|
47
|
+
+# else
|
48
|
+
+# if __HAVE_FLOATN_NOT_TYPEDEF
|
49
|
+
+# error "Non-typedef _FloatN but no _Generic."
|
50
|
+
+# endif
|
51
|
+
+# define __MATH_TG(TG_ARG, FUNC, ARGS) \
|
52
|
+
+ __builtin_choose_expr \
|
53
|
+
+ (__builtin_types_compatible_p (__typeof (TG_ARG), float), \
|
54
|
+
+ FUNC ## f ARGS, \
|
55
|
+
+ __builtin_choose_expr \
|
56
|
+
+ (__builtin_types_compatible_p (__typeof (TG_ARG), double), \
|
57
|
+
+ FUNC ARGS, \
|
58
|
+
+ __builtin_choose_expr \
|
59
|
+
+ (__builtin_types_compatible_p (__typeof (TG_ARG), long double), \
|
60
|
+
+ FUNC ## l ARGS, \
|
61
|
+
+ FUNC ## f128 ARGS)))
|
62
|
+
+# endif
|
63
|
+
+#else
|
64
|
+
+# define __MATH_TG(TG_ARG, FUNC, ARGS) \
|
65
|
+
+ (sizeof (TG_ARG) == sizeof (float) \
|
66
|
+
+ ? FUNC ## f ARGS \
|
67
|
+
+ : sizeof (TG_ARG) == sizeof (double) \
|
68
|
+
+ ? FUNC ARGS \
|
69
|
+
+ : FUNC ## l ARGS)
|
70
|
+
+#endif
|
71
|
+
+
|
72
|
+
/* Return number of classification appropriate for X. */
|
73
|
+
-# ifdef __NO_LONG_DOUBLE_MATH
|
74
|
+
-# define fpclassify(x) \
|
75
|
+
- (sizeof (x) == sizeof (float) ? __fpclassifyf (x) : __fpclassify (x))
|
76
|
+
-# else
|
77
|
+
-# define fpclassify(x) \
|
78
|
+
- (sizeof (x) == sizeof (float) \
|
79
|
+
- ? __fpclassifyf (x) \
|
80
|
+
- : sizeof (x) == sizeof (double) \
|
81
|
+
- ? __fpclassify (x) : __fpclassifyl (x))
|
82
|
+
+# if ((__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__) \
|
83
|
+
+ ) \
|
84
|
+
+ && (!defined __OPTIMIZE_SIZE__ || defined __cplusplus)
|
85
|
+
+ /* The check for __cplusplus allows the use of the builtin, even
|
86
|
+
+ when optimization for size is on. This is provided for
|
87
|
+
+ libstdc++, only to let its configure test work when it is built
|
88
|
+
+ with -Os. No further use of this definition of fpclassify is
|
89
|
+
+ expected in C++ mode, since libstdc++ provides its own version
|
90
|
+
+ of fpclassify in cmath (which undefines fpclassify). */
|
91
|
+
+# define fpclassify(x) __builtin_fpclassify (FP_NAN, FP_INFINITE, \
|
92
|
+
+ FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x)
|
93
|
+
+# else
|
94
|
+
+# define fpclassify(x) __MATH_TG ((x), __fpclassify, (x))
|
95
|
+
# endif
|
96
|
+
|
97
|
+
/* Return nonzero value if sign of X is negative. */
|
98
|
+
-# ifdef __NO_LONG_DOUBLE_MATH
|
99
|
+
-# define signbit(x) \
|
100
|
+
- (sizeof (x) == sizeof (float) ? __signbitf (x) : __signbit (x))
|
101
|
+
-# else
|
102
|
+
-# define signbit(x) \
|
103
|
+
- (sizeof (x) == sizeof (float) \
|
104
|
+
- ? __signbitf (x) \
|
105
|
+
- : sizeof (x) == sizeof (double) \
|
106
|
+
- ? __signbit (x) : __signbitl (x))
|
107
|
+
+# if __GNUC_PREREQ (6,0)
|
108
|
+
+# define signbit(x) __builtin_signbit (x)
|
109
|
+
+# elif defined __cplusplus
|
110
|
+
+ /* In C++ mode, __MATH_TG cannot be used, because it relies on
|
111
|
+
+ __builtin_types_compatible_p, which is a C-only builtin.
|
112
|
+
+ The check for __cplusplus allows the use of the builtin instead of
|
113
|
+
+ __MATH_TG. This is provided for libstdc++, only to let its configure
|
114
|
+
+ test work. No further use of this definition of signbit is expected
|
115
|
+
+ in C++ mode, since libstdc++ provides its own version of signbit
|
116
|
+
+ in cmath (which undefines signbit). */
|
117
|
+
+# define signbit(x) __builtin_signbitl (x)
|
118
|
+
+# elif __GNUC_PREREQ (4,0)
|
119
|
+
+# define signbit(x) __MATH_TG ((x), __builtin_signbit, (x))
|
120
|
+
+# else
|
121
|
+
+# define signbit(x) __MATH_TG ((x), __signbit, (x))
|
122
|
+
# endif
|
123
|
+
|
124
|
+
/* Return nonzero value if X is not +-Inf or NaN. */
|
125
|
+
-# ifdef __NO_LONG_DOUBLE_MATH
|
126
|
+
-# define isfinite(x) \
|
127
|
+
- (sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x))
|
128
|
+
-# else
|
129
|
+
-# define isfinite(x) \
|
130
|
+
- (sizeof (x) == sizeof (float) \
|
131
|
+
- ? __finitef (x) \
|
132
|
+
- : sizeof (x) == sizeof (double) \
|
133
|
+
- ? __finite (x) : __finitel (x))
|
134
|
+
+# if (__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__)
|
135
|
+
+# define isfinite(x) __builtin_isfinite (x)
|
136
|
+
+# else
|
137
|
+
+# define isfinite(x) __MATH_TG ((x), __finite, (x))
|
138
|
+
# endif
|
139
|
+
|
140
|
+
/* Return nonzero value if X is neither zero, subnormal, Inf, nor NaN. */
|
141
|
+
-# define isnormal(x) (fpclassify (x) == FP_NORMAL)
|
142
|
+
+# if (__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__)
|
143
|
+
+# define isnormal(x) __builtin_isnormal (x)
|
144
|
+
+# else
|
145
|
+
+# define isnormal(x) (fpclassify (x) == FP_NORMAL)
|
146
|
+
+# endif
|
147
|
+
|
148
|
+
/* Return nonzero value if X is a NaN. We could use `fpclassify' but
|
149
|
+
we already have this functions `__isnan' and it is faster. */
|
150
|
+
-# ifdef __NO_LONG_DOUBLE_MATH
|
151
|
+
-# define isnan(x) \
|
152
|
+
- (sizeof (x) == sizeof (float) ? __isnanf (x) : __isnan (x))
|
153
|
+
-# else
|
154
|
+
-# define isnan(x) \
|
155
|
+
- (sizeof (x) == sizeof (float) \
|
156
|
+
- ? __isnanf (x) \
|
157
|
+
- : sizeof (x) == sizeof (double) \
|
158
|
+
- ? __isnan (x) : __isnanl (x))
|
159
|
+
+# if (__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__)
|
160
|
+
+# define isnan(x) __builtin_isnan (x)
|
161
|
+
+# else
|
162
|
+
+# define isnan(x) __MATH_TG ((x), __isnan, (x))
|
163
|
+
# endif
|
164
|
+
|
165
|
+
/* Return nonzero value if X is positive or negative infinity. */
|
166
|
+
-# ifdef __NO_LONG_DOUBLE_MATH
|
167
|
+
+# if __HAVE_DISTINCT_FLOAT128 && !__GNUC_PREREQ (7,0) \
|
168
|
+
+ && !defined __SUPPORT_SNAN__ && !defined __cplusplus
|
169
|
+
+ /* Since __builtin_isinf_sign is broken for float128 before GCC 7.0,
|
170
|
+
+ use the helper function, __isinff128, with older compilers. This is
|
171
|
+
+ only provided for C mode, because in C++ mode, GCC has no support
|
172
|
+
+ for __builtin_types_compatible_p (and when in C++ mode, this macro is
|
173
|
+
+ not used anyway, because libstdc++ headers undefine it). */
|
174
|
+
# define isinf(x) \
|
175
|
+
- (sizeof (x) == sizeof (float) ? __isinff (x) : __isinf (x))
|
176
|
+
+ (__builtin_types_compatible_p (__typeof (x), _Float128) \
|
177
|
+
+ ? __isinff128 (x) : __builtin_isinf_sign (x))
|
178
|
+
+# elif (__GNUC_PREREQ (4,4) && !defined __SUPPORT_SNAN__)
|
179
|
+
+# define isinf(x) __builtin_isinf_sign (x)
|
180
|
+
# else
|
181
|
+
-# define isinf(x) \
|
182
|
+
- (sizeof (x) == sizeof (float) \
|
183
|
+
- ? __isinff (x) \
|
184
|
+
- : sizeof (x) == sizeof (double) \
|
185
|
+
- ? __isinf (x) : __isinfl (x))
|
186
|
+
+# define isinf(x) __MATH_TG ((x), __isinf, (x))
|
187
|
+
# endif
|
188
|
+
|
189
|
+
/* Bitmasks for the math_errhandling macro. */
|
@@ -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
|
@@ -11,14 +11,14 @@ index ebe3d8c..a336b73 100755
|
|
11
11
|
|
12
12
|
fi
|
13
13
|
diff --git a/io.c b/io.c
|
14
|
-
index
|
14
|
+
index 48592ac51a..2635ac8ec6 100644
|
15
15
|
--- a/io.c
|
16
16
|
+++ b/io.c
|
17
|
-
@@ -
|
17
|
+
@@ -11111,6 +11111,7 @@ nogvl_copy_stream_wait_write(struct copy_stream_struct *stp)
|
18
|
+
return 0;
|
18
19
|
}
|
19
20
|
|
20
|
-
|
21
|
-
-# define USE_COPY_FILE_RANGE
|
22
|
-
#endif
|
23
|
-
|
21
|
+
+#undef USE_COPY_FILE_RANGE
|
24
22
|
#ifdef USE_COPY_FILE_RANGE
|
23
|
+
|
24
|
+
static ssize_t
|
@@ -0,0 +1,28 @@
|
|
1
|
+
diff --git a/tasks/bin/cross-ruby.rake b/tasks/bin/cross-ruby.rake
|
2
|
+
index 8317a2a..5a1b3ea 100644
|
3
|
+
--- a/tasks/bin/cross-ruby.rake
|
4
|
+
+++ b/tasks/bin/cross-ruby.rake
|
5
|
+
@@ -116,10 +116,22 @@ RUBY_CC_VERSIONS.split(":").each do |ruby_cc_version|
|
6
|
+
"--host=#{mingw_host}",
|
7
|
+
"--target=#{mingw_target}",
|
8
|
+
"--build=#{RUBY_BUILD}",
|
9
|
+
- '--enable-shared',
|
10
|
+
+ '--enable-install-static-library',
|
11
|
+
+ '--disable-jit-support',
|
12
|
+
'--disable-install-doc',
|
13
|
+
'--with-ext=',
|
14
|
+
]
|
15
|
+
+ if mingw_host=~/darwin/
|
16
|
+
+ options += [
|
17
|
+
+ '--enable-static',
|
18
|
+
+ '--disable-shared',
|
19
|
+
+ ]
|
20
|
+
+ else
|
21
|
+
+ options += [
|
22
|
+
+ '--enable-static',
|
23
|
+
+ '--enable-shared',
|
24
|
+
+ ]
|
25
|
+
+ end
|
26
|
+
|
27
|
+
# Force Winsock2 for Ruby 1.8, 1.9 defaults to it
|
28
|
+
options << "--with-winsock2" if major == "1.8"
|
data/build/rcd-env.sh
ADDED
data/build/runas
CHANGED
@@ -4,11 +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
|
-
sudo -u "$USER" --set-home \
|
13
|
-
BASH_ENV=/etc/rubybashrc \
|
14
|
-
-- "$@"
|
7
|
+
/usr/bin/sudo -u "$USER" -H BASH_ENV=/etc/rubybashrc -- "$@"
|
data/build/sudoers
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Defaults env_keep += "http_proxy https_proxy ftp_proxy GEM_PRIVATE_KEY_PASSPHRASE RCD_HOST_RUBY_PLATFORM RCD_HOST_RUBY_VERSION RCD_IMAGE RUBY_CC_VERSION"
|
1
|
+
Defaults env_keep += "http_proxy https_proxy ftp_proxy GEM_PRIVATE_KEY_PASSPHRASE RCD_HOST_RUBY_PLATFORM RCD_HOST_RUBY_VERSION RCD_IMAGE RUBY_CC_VERSION LD_LIBRARY_PATH DEVTOOLSET_ROOTPATH"
|
@@ -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}"
|