rake-compiler-dock 1.8.0 → 1.9.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d8defac75bbfdcb50e87c34ae26c04eeac94d56144481a01ea096cffe70f33ac
4
- data.tar.gz: 5fe13b2f51bea09bb8ed3f02c170ccf2984aa6fcd74bed05b74643d658a0d615
3
+ metadata.gz: 17f3ab24c0e7f48cc7eba4fbfce3af5d2e178643a6d0d5663b92a635ec9c48ae
4
+ data.tar.gz: 25c51dc1ebf4872403b8e9a2233dea9d4e47edb44506a7a65b2088657625de47
5
5
  SHA512:
6
- metadata.gz: 94bb24cf349bc6099fc6dd07ffe860588a782ef0408af57c59001a4100a5be568489e7d8610a840949590086289a474c123be34da1193633c7ba6aaff733c2fb
7
- data.tar.gz: 2123aa6ccb22c06ee123e58eb34e306a0f8e5b69e57fd6124b1bfe7cdd42a5f2a83a0b7c6ce63015e7c02f706f011bd46a1b0e56b823d86997a702fa7ab57525
6
+ metadata.gz: f2a8bc6953b45749a195aa0e742f3d84c18705d286b364acc2b0c9533f30f762e34b5ed09ffed3261749d3ff90654d858592f405bb68c17babc001246b65ef0b
7
+ data.tar.gz: 0c4e8fe5ba886f41b824637f018bac313d0fe4d8f4440a7789e90d706b4a9f96c54b0b06e2486a75bd94d54bd1172c43882b1e1060e09b5d1f086952e32ddd92
data/Dockerfile.mri.erb CHANGED
@@ -74,30 +74,30 @@ ENV BASH_ENV=/etc/rubybashrc
74
74
  ##
75
75
  USER rubyuser
76
76
 
77
- ENV RBENV_RUBIES="2.5.9 3.1.6"
77
+ ENV RBENV_RUBIES="2.5.9 3.1.6 3.4.1"
78
78
 
79
79
  # Install the bootstrap rubies
80
80
  RUN bash -c " \
81
- echo 'gem: --no-ri --no-rdoc --no-document' >> ~/.gemrc && \
82
- export CFLAGS='-s -O3 -fno-fast-math -fPIC' && \
83
- for v in ${RBENV_RUBIES} ; do \
84
- rbenv install \$v -- --disable-install-doc ; \
85
- done && \
86
- find ${RBENV_ROOT} -type d -print0 | sudo xargs -0 chmod g+w \
87
- "
81
+ echo 'gem: --no-ri --no-rdoc --no-document' >> ~/.gemrc && \
82
+ export CFLAGS='-s -O3 -fno-fast-math -fPIC' && \
83
+ for v in ${RBENV_RUBIES} ; do \
84
+ rbenv install \$v -- --disable-install-doc ; \
85
+ done && \
86
+ find ${RBENV_ROOT} -type d -print0 | sudo xargs -0 chmod g+w \
87
+ "
88
88
 
89
89
  # Install rake-compiler and patch it to build and install static libraries for Linux rubies
90
90
  COPY build/patches /home/rubyuser/patches
91
91
  RUN bash -c " \
92
- for v in ${RBENV_RUBIES} ; do \
93
- rbenv shell \$v && \
94
- gem install rake-compiler -v1.2.9 && \
95
- cd ${RBENV_ROOT}/versions/\$v/lib/ruby/gems/*/gems/rake-compiler-1.2.9 && \
96
- for patch in /home/rubyuser/patches/rake-compiler-1.2.9/*.patch ; do \
97
- patch -p1 < \$patch ; \
98
- done \
99
- done \
100
- "
92
+ for v in ${RBENV_RUBIES} ; do \
93
+ rbenv shell \$v && \
94
+ gem install rake-compiler -v1.2.9 && \
95
+ cd ${RBENV_ROOT}/versions/\$v/lib/ruby/gems/*/gems/rake-compiler-1.2.9 && \
96
+ for patch in /home/rubyuser/patches/rake-compiler-1.2.9/*.patch ; do \
97
+ patch -p1 < \$patch ; \
98
+ done \
99
+ done \
100
+ "
101
101
 
102
102
  # Install rake-compiler's cross rubies in global dir instead of /root
103
103
  RUN sudo mkdir -p /usr/local/rake-compiler && \
@@ -115,7 +115,7 @@ RUN sudo mkdir -p /usr/local/rake-compiler && \
115
115
  xrubies_build_plan = if platform =~ /x64-mingw-ucrt/
116
116
  [
117
117
  # Rubyinstaller-3.1+ is platform x64-mingw-ucrt
118
- ["3.4.1:3.3.5:3.2.6:3.1.6", "3.1.6"],
118
+ ["3.4.1:3.3.7:3.2.6:3.1.6", "3.4.1"],
119
119
  ]
120
120
  elsif platform =~ /x64-mingw32/
121
121
  [
@@ -126,7 +126,8 @@ elsif platform =~ /x64-mingw32/
126
126
  else
127
127
  [
128
128
  ["2.6.10:2.5.9:2.4.10", "2.5.9"],
129
- ["3.4.1:3.3.5:3.2.6:3.1.6:3.0.7:2.7.8", "3.1.6"],
129
+ ["2.7.8", "3.1.6"],
130
+ ["3.4.1:3.3.7:3.2.6:3.1.6:3.0.7", "3.4.1"],
130
131
  ]
131
132
  end
132
133
 
@@ -134,16 +135,16 @@ strip = '-s' if platform !~ /darwin/
134
135
 
135
136
  xrubies_build_plan.each do |xrubies, bootstrap_ruby_version| %>
136
137
  RUN bash -c " \
137
- rbenv shell <%= bootstrap_ruby_version %> && \
138
- export CPPFLAGS='<%= "-D__USE_MINGW_ANSI_STDIO=1" if platform =~ /x64-mingw-ucrt/ %>' && \
139
- export CFLAGS='-O1 -fno-omit-frame-pointer -fno-fast-math -fstack-protector-strong <%= strip %>' && \
140
- export LDFLAGS='-pipe <%= strip %>' && \
141
- <%= "export LIBS='-l:libssp.a' &&" if platform =~ /mingw/ %> \
142
- <%= "export CC=#{target}-clang &&" if platform =~ /darwin/ %> \
143
- export MAKE='make V=1' && \
144
- rake-compiler cross-ruby VERSION=<%= xrubies %> HOST=<%= target %> && \
145
- rm -rf ~/.rake-compiler/builds ~/.rake-compiler/sources \
146
- "
138
+ rbenv shell <%= bootstrap_ruby_version %> && \
139
+ export CPPFLAGS='<%= "-D__USE_MINGW_ANSI_STDIO=1" if platform =~ /x64-mingw-ucrt/ %>' && \
140
+ export CFLAGS='-O1 -fno-omit-frame-pointer -fno-fast-math -fstack-protector-strong <%= strip %>' && \
141
+ export LDFLAGS='-pipe <%= strip %>' && \
142
+ <%= "export LIBS='-l:libssp.a' &&" if platform =~ /mingw/ %> \
143
+ <%= "export CC=#{target}-clang &&" if platform =~ /darwin/ %> \
144
+ export MAKE='make V=1' && \
145
+ rake-compiler cross-ruby VERSION=<%= xrubies %> HOST=<%= target %> && \
146
+ rm -rf ~/.rake-compiler/builds ~/.rake-compiler/sources \
147
+ "
147
148
  <% end %>
148
149
  # "
149
150
 
@@ -223,8 +224,8 @@ RUN echo 'source /etc/profile.d/rcd-env.sh' >> /etc/rubybashrc
223
224
  # Install sudoers configuration
224
225
  COPY build/sudoers /etc/sudoers.d/rake-compiler-dock
225
226
 
226
- RUN bash -c "rbenv global 3.1.6"
227
+ RUN bash -c "rbenv global 3.4.1"
227
228
 
228
- ENV RUBY_CC_VERSION=3.4.1:3.3.5:3.2.6:3.1.6:3.0.7:2.7.8:2.6.10:2.5.9:2.4.10
229
+ ENV RUBY_CC_VERSION=3.4.1:3.3.7:3.2.6:3.1.6:3.0.7:2.7.8:2.6.10:2.5.9:2.4.10
229
230
 
230
231
  CMD bash
data/History.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # `rake-compiler/rake-compiler-dock` Changelog
2
2
 
3
+ ## v1.9.1 / 2025-01-20
4
+
5
+ ### Features
6
+
7
+ - Introduce `RakeCompilerDock.set_ruby_cc_version` to make it easier to set `RUBY_CC_VERSION` without hardcoding specific patch-level ruby versions. See the README for more deteails. #149, #150 @flavorjones
8
+
9
+
10
+ ## v1.9.0 / 2025-01-19
11
+
12
+ ### Changes
13
+
14
+ - Bump Ruby 3.3 to v3.3.7 (from v3.3.5). #147 @flavorjones
15
+ - The default `rbenv` ruby in the container is now Ruby v3.4.1 (previously the default was 3.1.6), which allows gems to drop Ruby 3.1 from their gemspecs. Fixes #145. #146 @flavorjones
16
+ - Ruby 3.4.x, 3.3.x, 3.2.x, 3.1.x, and 3.0.x are cross-compiled using Ruby v3.4.1. #146 @flavorjones
17
+
18
+ ### CRuby container summary
19
+
20
+ - native rubies: 3.4.1 (default), 3.1.6, 2.5.9
21
+ - `RUBY_CC_VERSION=3.4.1:3.3.7:3.2.6:3.1.6:3.0.7:2.7.8:2.6.10:2.5.9:2.4.10`
22
+
23
+
3
24
  ## v1.8.0 / 2025-01-05
4
25
 
5
26
  ### Notable changes
@@ -13,6 +34,11 @@ All versions of Ruby in the build containers are the latest patch version. #135
13
34
  - (Darwin) Set `OSXCROSS_PKG_CONFIG_USE_NATIVE_VARIABLES=1` to successfully build the 3.0 series.
14
35
  - (Darwin) The linker flags include `-Wl,-flat_namespace` for 2.7, 3.0, 3.1, 3.2, 3.3, and 3.4 rubies. Previously this was only needed for 3.2+, but code backported to 2.7.7, 3.0.5, and 3.1.3 required it for those versions as well.
15
36
 
37
+ ### CRuby container summary
38
+
39
+ - native rubies: 3.1.6 (default), 2.5.9
40
+ - `RUBY_CC_VERSION=3.4.1:3.3.5:3.2.6:3.1.6:3.0.7:2.7.8:2.6.10:2.5.9:2.4.10`
41
+
16
42
 
17
43
  ## v1.7.1 / 2025-01-03
18
44
 
data/README.md CHANGED
@@ -352,6 +352,44 @@ Other environment variables can be set or passed through to the container like t
352
352
  RakeCompilerDock.sh "rake cross native gem OPENSSL_VERSION=#{ENV['OPENSSL_VERSION']}"
353
353
  ```
354
354
 
355
+ ### Choosing specific Ruby versions to support
356
+
357
+ If you only want to precompile for certain Ruby versions, you can specify those versions by overwriting the `RUBY_CC_VERSION` environment variable.
358
+
359
+ For example, if you wanted to only support Ruby 3.4 and 3.3, you might set this variable to:
360
+
361
+ ``` ruby
362
+ ENV["RUBY_CC_VERSION"] = "3.4.1:3.3.7"
363
+ ```
364
+
365
+ In practice, though, hardcoding these versions is brittle because the patch versions in the container may very from release to release.
366
+
367
+ A more robust way to do this is to use `RakeCompilerDock.ruby_cc_version` which accepts an array of Ruby minor versions or patch version requirements.
368
+
369
+ ``` ruby
370
+ RakeCompilerDock.ruby_cc_version("3.3", "3.4")
371
+ # => "3.4.1:3.3.7"
372
+
373
+ RakeCompilerDock.ruby_cc_version("~> 3.4.0", "~> 3.3.0")
374
+ # => "3.4.1:3.3.7"
375
+
376
+ RakeCompilerDock.ruby_cc_version("~> 3.3")
377
+ # => "3.4.1:3.3.7"
378
+ ```
379
+
380
+ So you can either set the environment variable directly:
381
+
382
+ ``` ruby
383
+ ENV["RUBY_CC_VERSION"] = RakeCompilerDock.ruby_cc_version("~> 3.1")
384
+ ```
385
+
386
+ or do the same thing using the `set_ruby_cc_version` convenience method:
387
+
388
+ ``` ruby
389
+ RakeCompilerDock.set_ruby_cc_version("~> 3.1") # equivalent to the above assignment
390
+ ```
391
+
392
+
355
393
 
356
394
  ## More information
357
395
 
@@ -1,4 +1,4 @@
1
1
  module RakeCompilerDock
2
- VERSION = "1.8.0"
3
- IMAGE_VERSION = "1.8.0"
2
+ VERSION = "1.9.1"
3
+ IMAGE_VERSION = "1.9.1"
4
4
  end
@@ -73,5 +73,86 @@ module RakeCompilerDock
73
73
  Starter.exec(*args, &block)
74
74
  end
75
75
 
76
- module_function :exec, :sh, :image_name
76
+ # Retrieve the cross-rubies that are available in the docker image. This can be used to construct
77
+ # a custom `RUBY_CC_VERSION` string that is valid.
78
+ #
79
+ # Returns a Hash<minor_version => corresponding_patch_version>
80
+ #
81
+ # For example:
82
+ #
83
+ # RakeCompilerDock.cross_rubies
84
+ # # => {
85
+ # # "3.4" => "3.4.1",
86
+ # # "3.3" => "3.3.5",
87
+ # # "3.2" => "3.2.6",
88
+ # # "3.1" => "3.1.6",
89
+ # # "3.0" => "3.0.7",
90
+ # # "2.7" => "2.7.8",
91
+ # # "2.6" => "2.6.10",
92
+ # # "2.5" => "2.5.9",
93
+ # # "2.4" => "2.4.10",
94
+ # # }
95
+ #
96
+ def cross_rubies
97
+ {
98
+ "3.4" => "3.4.1",
99
+ "3.3" => "3.3.7",
100
+ "3.2" => "3.2.6",
101
+ "3.1" => "3.1.6",
102
+ "3.0" => "3.0.7",
103
+ "2.7" => "2.7.8",
104
+ "2.6" => "2.6.10",
105
+ "2.5" => "2.5.9",
106
+ "2.4" => "2.4.10",
107
+ }
108
+ end
109
+
110
+ # Returns a valid RUBY_CC_VERSION string for the given requirements,
111
+ # where each `requirement` may be:
112
+ #
113
+ # - a String that matches the minor version exactly
114
+ # - a String that can be used as a Gem::Requirement constructor argument
115
+ # - a Gem::Requirement object
116
+ #
117
+ # Note that the returned string will contain versions sorted in descending order.
118
+ #
119
+ # For example:
120
+ # RakeCompilerDock.ruby_cc_version("2.7", "3.4")
121
+ # # => "3.4.1:2.7.8"
122
+ #
123
+ # RakeCompilerDock.ruby_cc_version("~> 3.2")
124
+ # # => "3.4.1:3.3.7:3.2.6"
125
+ #
126
+ # RakeCompilerDock.ruby_cc_version(Gem::Requirement.new("~> 3.2"))
127
+ # # => "3.4.1:3.3.7:3.2.6"
128
+ #
129
+ def ruby_cc_version(*requirements)
130
+ cross = cross_rubies
131
+ output = []
132
+
133
+ if requirements.empty?
134
+ output += cross.values
135
+ else
136
+ requirements.each do |requirement|
137
+ if cross[requirement]
138
+ output << cross[requirement]
139
+ else
140
+ requirement = Gem::Requirement.new(requirement) unless requirement.is_a?(Gem::Requirement)
141
+ versions = cross.values.find_all { |v| requirement.satisfied_by?(Gem::Version.new(v)) }
142
+ raise("No matching ruby version for requirement: #{requirement.inspect}") if versions.empty?
143
+ output += versions
144
+ end
145
+ end
146
+ end
147
+
148
+ output.uniq.sort.reverse.join(":")
149
+ end
150
+
151
+ # Set the environment variable `RUBY_CC_VERSION` to the value returned by `ruby_cc_version`,
152
+ # for the given requirements.
153
+ def set_ruby_cc_version(*requirements)
154
+ ENV["RUBY_CC_VERSION"] = ruby_cc_version(*requirements)
155
+ end
156
+
157
+ module_function :exec, :sh, :image_name, :cross_rubies, :ruby_cc_version, :set_ruby_cc_version
77
158
  end
@@ -34,6 +34,8 @@ class TestEnvironmentVariables
34
34
  df = File.read(File.expand_path("../../Dockerfile.mri.erb", __FILE__))
35
35
  df =~ /^ENV RUBY_CC_VERSION=(.*)$/
36
36
  assert_equal $1, rcd_env['RUBY_CC_VERSION']
37
+
38
+ assert_equal RakeCompilerDock.ruby_cc_version, rcd_env['RUBY_CC_VERSION']
37
39
  end
38
40
 
39
41
  def test_RAKE_EXTENSION_TASK_NO_NATIVE
@@ -0,0 +1,82 @@
1
+ require 'rake_compiler_dock'
2
+ require 'rbconfig'
3
+ require 'test/unit'
4
+
5
+ class TestVersions < Test::Unit::TestCase
6
+ def test_cross_rubies
7
+ cross = RakeCompilerDock.cross_rubies
8
+ assert_operator(cross, :is_a?, Hash)
9
+ cross.each do |minor, patch|
10
+ assert_match(/^\d+\.\d+$/, minor)
11
+ assert_match(/^\d+\.\d+\.\d+$/, patch)
12
+ end
13
+ end
14
+
15
+ def test_ruby_cc_versions_no_args
16
+ cross = RakeCompilerDock.cross_rubies
17
+ expected = cross.values.sort.reverse.join(":")
18
+
19
+ assert_equal(expected, RakeCompilerDock.ruby_cc_version)
20
+ end
21
+
22
+ def test_ruby_cc_versions_strings
23
+ cross = RakeCompilerDock.cross_rubies
24
+
25
+ expected = cross["3.4"]
26
+ assert_equal(expected, RakeCompilerDock.ruby_cc_version("3.4"))
27
+
28
+ expected = [cross["3.4"], cross["3.2"]].join(":")
29
+ assert_equal(expected, RakeCompilerDock.ruby_cc_version("3.4", "3.2"))
30
+
31
+ expected = [cross["3.4"], cross["3.2"]].join(":")
32
+ assert_equal(expected, RakeCompilerDock.ruby_cc_version("3.2", "3.4"))
33
+
34
+ assert_raises do
35
+ RakeCompilerDock.ruby_cc_version("9.8")
36
+ end
37
+
38
+ assert_raises do
39
+ RakeCompilerDock.ruby_cc_version("foo")
40
+ end
41
+ end
42
+
43
+ def test_ruby_cc_versions_requirements
44
+ cross = RakeCompilerDock.cross_rubies
45
+
46
+ expected = cross["3.4"]
47
+ assert_equal(expected, RakeCompilerDock.ruby_cc_version("~> 3.4"))
48
+ assert_equal(expected, RakeCompilerDock.ruby_cc_version(Gem::Requirement.new("~> 3.4")))
49
+
50
+ expected = [cross["3.4"], cross["3.3"], cross["3.2"]].join(":")
51
+ assert_equal(expected, RakeCompilerDock.ruby_cc_version("~> 3.2"))
52
+ assert_equal(expected, RakeCompilerDock.ruby_cc_version(Gem::Requirement.new("~> 3.2")))
53
+
54
+ expected = [cross["3.4"], cross["3.2"]].join(":")
55
+ assert_equal(expected, RakeCompilerDock.ruby_cc_version("~> 3.2.0", "~> 3.4.0"))
56
+ assert_equal(expected, RakeCompilerDock.ruby_cc_version(Gem::Requirement.new("~> 3.2.0"), Gem::Requirement.new("~> 3.4.0")))
57
+
58
+ expected = [cross["3.4"], cross["3.3"], cross["3.2"]].join(":")
59
+ assert_equal(expected, RakeCompilerDock.ruby_cc_version(">= 3.2"))
60
+ assert_equal(expected, RakeCompilerDock.ruby_cc_version(Gem::Requirement.new(">= 3.2")))
61
+
62
+ assert_raises do
63
+ RakeCompilerDock.ruby_cc_version(Gem::Requirement.new("> 9.8"))
64
+ end
65
+ end
66
+
67
+ def test_set_ruby_cc_versions
68
+ original_ruby_cc_versions = ENV["RUBY_CC_VERSION"]
69
+ cross = RakeCompilerDock.cross_rubies
70
+
71
+ RakeCompilerDock.set_ruby_cc_version(Gem::Requirement.new("~> 3.2.0"), Gem::Requirement.new("~> 3.4.0"))
72
+ assert_equal([cross["3.4"], cross["3.2"]].join(":"), ENV["RUBY_CC_VERSION"])
73
+
74
+ RakeCompilerDock.set_ruby_cc_version("~> 3.2.0", "~> 3.4.0")
75
+ assert_equal([cross["3.4"], cross["3.2"]].join(":"), ENV["RUBY_CC_VERSION"])
76
+
77
+ RakeCompilerDock.set_ruby_cc_version("~> 3.1")
78
+ assert_equal([cross["3.4"], cross["3.3"], cross["3.2"], cross["3.1"]].join(":"), ENV["RUBY_CC_VERSION"])
79
+ ensure
80
+ ENV["RUBY_CC_VERSION"] = original_ruby_cc_versions
81
+ end
82
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rake-compiler-dock
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lars Kanis
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-01-06 00:00:00.000000000 Z
10
+ date: 2025-01-20 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: bundler
@@ -123,6 +123,7 @@ files:
123
123
  - test/test_environment_variables.rb
124
124
  - test/test_parallel_docker_build.rb
125
125
  - test/test_starter.rb
126
+ - test/test_versions.rb
126
127
  homepage: https://github.com/rake-compiler/rake-compiler-dock
127
128
  licenses:
128
129
  - MIT
@@ -162,3 +163,4 @@ test_files:
162
163
  - test/test_environment_variables.rb
163
164
  - test/test_parallel_docker_build.rb
164
165
  - test/test_starter.rb
166
+ - test/test_versions.rb