summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/rake/extensiontask.rb19
-rw-r--r--spec/lib/rake/extensiontask_spec.rb40
2 files changed, 49 insertions, 10 deletions
diff --git a/lib/rake/extensiontask.rb b/lib/rake/extensiontask.rb
index dd12593..38466e1 100644
--- a/lib/rake/extensiontask.rb
+++ b/lib/rake/extensiontask.rb
@@ -255,10 +255,13 @@ Java extension should be preferred.
spec.platform = Gem::Platform.new(platf)
# set ruby version constraints
- cross_rubies = @ruby_versions_per_platform[platf] || []
+ ruby_versions = @ruby_versions_per_platform[platf] || []
+ sorted_ruby_versions = ruby_versions.sort_by do |ruby_version|
+ ruby_version.split(".").collect(&:to_i)
+ end
spec.required_ruby_version = [
- ">= #{version_ary2str( cross_rubies.min[0,2] )}",
- "< #{version_ary2str( cross_rubies.max[0,2].succ )}"
+ ">= #{ruby_api_version(sorted_ruby_versions.first)}",
+ "< #{ruby_api_version(sorted_ruby_versions.last).succ}"
]
# clear the extensions defined in the specs
@@ -356,7 +359,7 @@ Java extension should be preferred.
# Update cross compiled platform/version combinations
ruby_versions = (@ruby_versions_per_platform[for_platform] ||= [])
- ruby_versions << version_str2ary(version)
+ ruby_versions << version
define_cross_platform_tasks_with_version(for_platform, version)
@@ -509,12 +512,8 @@ Java extension should be preferred.
[*@cross_platform].map { |p| "native:#{p}" }
end
- def version_str2ary(version_string)
- version_string[/\A[^-]+/].split(".").map(&:to_i).pack("C*")
- end
-
- def version_ary2str(version_ary)
- version_ary.unpack("C*").join(".")
+ def ruby_api_version(ruby_version)
+ ruby_version.split(".")[0, 2].join(".")
end
def fake_rb(platform, version)
diff --git a/spec/lib/rake/extensiontask_spec.rb b/spec/lib/rake/extensiontask_spec.rb
index 703bc5a..4be1062 100644
--- a/spec/lib/rake/extensiontask_spec.rb
+++ b/spec/lib/rake/extensiontask_spec.rb
@@ -454,6 +454,46 @@ describe Rake::ExtensionTask do
end
end
+ it "should set required_ruby_version from RUBY_CC_VERSION" do
+ platforms = ["x86-mingw32", "x64-mingw32"]
+ ruby_cc_versions = ["1.8.6", "2.1.10", "2.2.6", "2.3.3", "2.10.1"]
+ ENV["RUBY_CC_VERSION"] = ruby_cc_versions.join(":")
+ config = mock(Hash)
+ ruby_cc_versions.each do |ruby_cc_version|
+ platforms.each do |platform|
+ config.stub!(:[]).
+ with("rbconfig-#{platform}-#{ruby_cc_version}").
+ and_return("/rubies/#{ruby_cc_version}/rbconfig.rb")
+ end
+ end
+ YAML.stub!(:load_file).and_return(config)
+
+ Gem.stub_chain(:configuration, :verbose=).and_return(true)
+
+ spec = Gem::Specification.new do |s|
+ s.name = 'my_gem'
+ s.platform = Gem::Platform::RUBY
+ end
+
+ cross_specs = []
+ Rake::ExtensionTask.new("extension_one", spec) do |ext|
+ ext.cross_platform = platforms
+ ext.cross_compile = true
+ ext.cross_compiling do |cross_spec|
+ cross_specs << cross_spec
+ end
+ end
+ platforms.each do |platform|
+ Rake::Task["native:my_gem:#{platform}"].execute
+ end
+
+ expected_required_ruby_versions = [
+ Gem::Requirement.new([">= 1.8", "< 2.11"]),
+ Gem::Requirement.new([">= 1.8", "< 2.11"]),
+ ]
+ cross_specs.collect(&:required_ruby_version).should == expected_required_ruby_versions
+ end
+
after :each do
ENV.delete('RUBY_CC_VERSION')
end