diff options
-rw-r--r-- | lib/rubygems/ext/cargo_builder.rb | 32 | ||||
-rw-r--r-- | test/rubygems/test_gem_ext_cargo_builder.rb | 8 | ||||
-rw-r--r-- | test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec | 4 | ||||
-rw-r--r-- | test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock (renamed from test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.lock) | 0 | ||||
-rw-r--r-- | test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml (renamed from test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.toml) | 0 | ||||
-rw-r--r-- | test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/src/lib.rs (renamed from test/rubygems/test_gem_ext_cargo_builder/custom_name/src/lib.rs) | 0 | ||||
-rw-r--r-- | test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb | 1 |
7 files changed, 33 insertions, 12 deletions
diff --git a/lib/rubygems/ext/cargo_builder.rb b/lib/rubygems/ext/cargo_builder.rb index 7c1d4a72cd..2a9e72fdfe 100644 --- a/lib/rubygems/ext/cargo_builder.rb +++ b/lib/rubygems/ext/cargo_builder.rb @@ -14,7 +14,7 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder @profile = :release end - def build(_extension, dest_path, results, args = [], lib_dir = nil, cargo_dir = Dir.pwd) + def build(extension, dest_path, results, args = [], lib_dir = nil, cargo_dir = Dir.pwd) require "tempfile" require "fileutils" @@ -43,16 +43,19 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder dlext_path = File.join(File.dirname(dylib_path), dlext_name) FileUtils.cp(dylib_path, dlext_path) + nesting = extension_nesting(extension) + # TODO: remove in RubyGems 4 if Gem.install_extension_in_lib && lib_dir - FileUtils.mkdir_p lib_dir - p [dlext_path, lib_dir] - FileUtils.cp_r dlext_path, lib_dir, remove_destination: true + nested_lib_dir = File.join(lib_dir, nesting) + FileUtils.mkdir_p nested_lib_dir + FileUtils.cp_r dlext_path, nested_lib_dir, remove_destination: true end # move to final destination - FileUtils.mkdir_p dest_path - FileUtils.cp_r dlext_path, dest_path, remove_destination: true + nested_dest_path = File.join(dest_path, nesting) + FileUtils.mkdir_p nested_dest_path + FileUtils.cp_r dlext_path, nested_dest_path, remove_destination: true ensure # clean up intermediary build artifacts FileUtils.rm_rf tmp_dest if tmp_dest @@ -94,6 +97,23 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder ENV.fetch("CARGO", "cargo") end + # returns the directory nesting of the extension, ignoring the first part, so + # "ext/foo/bar/Cargo.toml" becomes "foo/bar" + def extension_nesting(extension) + parts = extension.to_s.split(Regexp.union([File::SEPARATOR, File::ALT_SEPARATOR].compact)) + + parts = parts.each_with_object([]) do |segment, final| + next if segment == "." + if segment == ".." + raise Gem::InstallError, "extension outside of gem root" if final.empty? + next final.pop + end + final << segment + end + + File.join(parts[1...-1]) + end + def rb_config_env result = {} RbConfig::CONFIG.each {|k, v| result["RBCONFIG_#{k}"] = v } diff --git a/test/rubygems/test_gem_ext_cargo_builder.rb b/test/rubygems/test_gem_ext_cargo_builder.rb index 5ffe5f0b6f..df50150d50 100644 --- a/test/rubygems/test_gem_ext_cargo_builder.rb +++ b/test/rubygems/test_gem_ext_cargo_builder.rb @@ -32,7 +32,7 @@ class TestGemExtCargoBuilder < Gem::TestCase Dir.chdir @ext do ENV.update(@rust_envs) builder = Gem::Ext::CargoBuilder.new - builder.build nil, @dest_path, output + builder.build "Cargo.toml", @dest_path, output end output = output.join "\n" @@ -58,7 +58,7 @@ class TestGemExtCargoBuilder < Gem::TestCase Dir.chdir @ext do ENV.update(@rust_envs) builder = Gem::Ext::CargoBuilder.new - builder.build nil, @dest_path, output + builder.build "Cargo.toml", @dest_path, output end output = output.join "\n" @@ -83,7 +83,7 @@ class TestGemExtCargoBuilder < Gem::TestCase Dir.chdir @ext do ENV.update(@rust_envs) builder = Gem::Ext::CargoBuilder.new - builder.build nil, @dest_path, [] + builder.build "Cargo.toml", @dest_path, [] end end @@ -130,7 +130,7 @@ class TestGemExtCargoBuilder < Gem::TestCase Open3.capture2e(*gem, "install", "--verbose", "--local", built_gem, *ARGV) end - stdout_and_stderr_str, status = Open3.capture2e(env_for_subprocess, *ruby_with_rubygems_in_load_path, "-rcustom_name_ext", "-e", "puts 'Result: ' + CustomName.say_hello") + stdout_and_stderr_str, status = Open3.capture2e(env_for_subprocess, *ruby_with_rubygems_in_load_path, "-rcustom_name", "-e", "puts 'Result: ' + CustomName.say_hello") assert status.success?, stdout_and_stderr_str assert_match "Result: Hello world!", stdout_and_stderr_str diff --git a/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec b/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec index 95332ec84f..43dddac243 100644 --- a/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec +++ b/test/rubygems/test_gem_ext_cargo_builder/custom_name/custom_name.gemspec @@ -2,7 +2,7 @@ Gem::Specification.new do |s| s.name = "custom_name" s.version = "0.1.0" s.summary = "A Rust extension for Ruby" - s.extensions = ["Cargo.toml"] + s.extensions = ["ext/custom_name_lib/Cargo.toml"] s.authors = ["Ian Ker-Seymer"] - s.files = ["Cargo.toml", "Cargo.lock", "src/lib.rs"] + s.files = ["lib/custom_name.rb", "ext/custom_name_lib/Cargo.toml", "ext/custom_name_lib/Cargo.lock", "ext/custom_name_lib/src/lib.rs"] end diff --git a/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.lock b/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock index 25905d8cf6..25905d8cf6 100644 --- a/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.lock +++ b/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.lock diff --git a/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.toml b/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml index 0777be730e..0777be730e 100644 --- a/test/rubygems/test_gem_ext_cargo_builder/custom_name/Cargo.toml +++ b/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/Cargo.toml diff --git a/test/rubygems/test_gem_ext_cargo_builder/custom_name/src/lib.rs b/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/src/lib.rs index 28ba3be564..28ba3be564 100644 --- a/test/rubygems/test_gem_ext_cargo_builder/custom_name/src/lib.rs +++ b/test/rubygems/test_gem_ext_cargo_builder/custom_name/ext/custom_name_lib/src/lib.rs diff --git a/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb b/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb new file mode 100644 index 0000000000..5ae8b00a5f --- /dev/null +++ b/test/rubygems/test_gem_ext_cargo_builder/custom_name/lib/custom_name.rb @@ -0,0 +1 @@ +require "custom_name_lib/custom_name_ext" |