From f6620037ba1477d2c337d7b511f094d6d0fbb69c Mon Sep 17 00:00:00 2001 From: Hiroshi SHIBATA Date: Thu, 22 Dec 2022 08:20:23 +0900 Subject: Merge RubyGems-3.4.0 and Bundler-2.4.0 --- lib/rubygems/dependency.rb | 5 ++++- lib/rubygems/ext/cargo_builder.rb | 15 +++++++++++++-- lib/rubygems/ext/cargo_builder/link_flag_converter.rb | 14 +++++++++----- lib/rubygems/specification_policy.rb | 14 ++++++++++++++ 4 files changed, 40 insertions(+), 8 deletions(-) (limited to 'lib/rubygems') diff --git a/lib/rubygems/dependency.rb b/lib/rubygems/dependency.rb index 85f8609677..7fa0f91bd4 100644 --- a/lib/rubygems/dependency.rb +++ b/lib/rubygems/dependency.rb @@ -277,7 +277,10 @@ class Gem::Dependency requirement.satisfied_by?(spec.version) && env_req.satisfied_by?(spec.version) end.map(&:to_spec) - Gem::BundlerVersionFinder.prioritize!(matches) if prioritizes_bundler? + if prioritizes_bundler? + require_relative "bundler_version_finder" + Gem::BundlerVersionFinder.prioritize!(matches) + end if platform_only matches.reject! do |spec| diff --git a/lib/rubygems/ext/cargo_builder.rb b/lib/rubygems/ext/cargo_builder.rb index 3377c9a8ad..3851e8d523 100644 --- a/lib/rubygems/ext/cargo_builder.rb +++ b/lib/rubygems/ext/cargo_builder.rb @@ -37,7 +37,8 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder def build_env build_env = rb_config_env build_env["RUBY_STATIC"] = "true" if ruby_static? && ENV.key?("RUBY_STATIC") - build_env["RUSTFLAGS"] = "#{ENV["RUSTFLAGS"]} --cfg=rb_sys_gem".strip + cfg = "--cfg=rb_sys_gem --cfg=rubygems --cfg=rubygems_#{Gem::VERSION.tr(".", "_")}" + build_env["RUSTFLAGS"] = [ENV["RUSTFLAGS"], cfg].compact.join(" ") build_env end @@ -47,6 +48,7 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder cmd = [] cmd += [cargo, "rustc"] + cmd += ["--crate-type", "cdylib"] cmd += ["--target", ENV["CARGO_BUILD_TARGET"]] if ENV["CARGO_BUILD_TARGET"] cmd += ["--target-dir", dest_path] cmd += ["--manifest-path", manifest] @@ -103,14 +105,23 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder # We want to use the same linker that Ruby uses, so that the linker flags from # mkmf work properly. def linker_args - # Have to handle CC="cl /nologo" on mswin cc_flag = Shellwords.split(makefile_config("CC")) linker = cc_flag.shift link_args = cc_flag.flat_map {|a| ["-C", "link-arg=#{a}"] } + return mswin_link_args if linker == "cl" + ["-C", "linker=#{linker}", *link_args] end + def mswin_link_args + args = [] + args += ["-l", makefile_config("LIBRUBYARG_SHARED").chomp(".lib")] + args += split_flags("LIBS").flat_map {|lib| ["-l", lib.chomp(".lib")] } + args += split_flags("LOCAL_LIBS").flat_map {|lib| ["-l", lib.chomp(".lib")] } + args + end + def libruby_args(dest_dir) libs = makefile_config(ruby_static? ? "LIBRUBYARG_STATIC" : "LIBRUBYARG_SHARED") raw_libs = Shellwords.split(libs) diff --git a/lib/rubygems/ext/cargo_builder/link_flag_converter.rb b/lib/rubygems/ext/cargo_builder/link_flag_converter.rb index 111bb05492..e4d196cb10 100644 --- a/lib/rubygems/ext/cargo_builder/link_flag_converter.rb +++ b/lib/rubygems/ext/cargo_builder/link_flag_converter.rb @@ -3,20 +3,24 @@ class Gem::Ext::CargoBuilder < Gem::Ext::Builder # Converts Ruby link flags into something cargo understands class LinkFlagConverter + FILTERED_PATTERNS = [ + /compress-debug-sections/, # Not supported by all linkers, and not required for Rust + ].freeze + def self.convert(arg) + return [] if FILTERED_PATTERNS.any? {|p| p.match?(arg) } + case arg.chomp when /^-L\s*(.+)$/ ["-L", "native=#{$1}"] when /^--library=(\w+\S+)$/, /^-l\s*(\w+\S+)$/ ["-l", $1] - when /^-l\s*:lib(\S+).a$/ - ["-l", "static=#{$1}"] - when /^-l\s*:lib(\S+).(so|dylib|dll)$/ - ["-l", "dylib=#{$1}"] + when /^-l\s*([^:\s])+/ # -lfoo, but not -l:libfoo.a + ["-l", $1] when /^-F\s*(.*)$/ ["-l", "framework=#{$1}"] else - ["-C", "link_arg=#{arg}"] + ["-C", "link-args=#{arg}"] end end end diff --git a/lib/rubygems/specification_policy.rb b/lib/rubygems/specification_policy.rb index 44b31211e5..f01a6cd743 100644 --- a/lib/rubygems/specification_policy.rb +++ b/lib/rubygems/specification_policy.rb @@ -460,6 +460,20 @@ http://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard li require_relative "ext" builder = Gem::Ext::Builder.new(@specification) + validate_rake_extensions(builder) + validate_rust_extensions(builder) + end + + def validate_rust_extensions(builder) # :nodoc: + rust_extension = @specification.extensions.any? {|s| builder.builder_for(s).is_a? Gem::Ext::CargoBuilder } + missing_cargo_lock = !@specification.files.include?("Cargo.lock") + + error <<-ERROR if rust_extension && missing_cargo_lock +You have specified rust based extension, but Cargo.lock is not part of the gem files. Please run `cargo generate-lockfile` or any other command to generate Cargo.lock and ensure it is added to your gem files section in gemspec. + ERROR + end + + def validate_rake_extensions(builder) # :nodoc: rake_extension = @specification.extensions.any? {|s| builder.builder_for(s) == Gem::Ext::RakeBuilder } rake_dependency = @specification.dependencies.any? {|d| d.name == "rake" } -- cgit v1.2.3