[rubygems/rubygems] install rust extensions into expected directory nesting

https://github.com/rubygems/rubygems/commit/85ea86d348
This commit is contained in:
Mat Sadler 2023-01-22 22:46:22 -08:00 коммит произвёл git
Родитель ca951f6719
Коммит b4defea362
7 изменённых файлов: 33 добавлений и 12 удалений

Просмотреть файл

@ -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 }

Просмотреть файл

@ -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

Просмотреть файл

@ -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

Просмотреть файл

@ -0,0 +1 @@
require "custom_name_lib/custom_name_ext"