зеркало из https://github.com/github/ruby.git
[rubygems/rubygems] install rust extensions into expected directory nesting
https://github.com/rubygems/rubygems/commit/85ea86d348
This commit is contained in:
Родитель
ca951f6719
Коммит
b4defea362
|
@ -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"
|
Загрузка…
Ссылка в новой задаче