rb_sys 0.9.60 → 0.9.61
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/exe/rb-sys-dock +20 -25
- data/lib/rb_sys/cargo/metadata.rb +66 -0
- data/lib/rb_sys/cargo.rb +9 -0
- data/lib/rb_sys/cargo_builder/link_flag_converter.rb +1 -0
- data/lib/rb_sys/cargo_builder.rb +8 -24
- data/lib/rb_sys/error.rb +37 -0
- data/lib/rb_sys/extensiontask.rb +122 -0
- data/lib/rb_sys/mkmf/config.rb +18 -1
- data/lib/rb_sys/mkmf.rb +12 -23
- data/lib/rb_sys/toolchain_info/data.rb +1 -0
- data/lib/rb_sys/toolchain_info.rb +22 -0
- data/lib/rb_sys/version.rb +1 -1
- data/lib/rb_sys.rb +1 -2
- data.tar.gz.sig +0 -0
- metadata +7 -3
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 123a974ae1143185fe76488a7869cb2c388046c72c07ea774b9d6ef04d76ac3d
|
4
|
+
data.tar.gz: fbb7fe655195f3afac258f93df6a43ecb414faa1697140500afc09153872654d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 114714eacc8d7bd88e7fe2169d5b4356d39add07f44148650805af0e6212de154fddc5464ec7c23847b5632c1474513e83b4dfd30d15eb28ff1218c222c122aa
|
7
|
+
data.tar.gz: 0d6933769276e790671ab4717a756a874045c7a037eaac4220fb5a89c56798006461b3fd5d5cc99096eed05e56bfda9f553ca4fbfb71c946f986d20a13018b28
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/exe/rb-sys-dock
CHANGED
@@ -115,6 +115,18 @@ OptionParser.new do |opts|
|
|
115
115
|
exit(0)
|
116
116
|
end
|
117
117
|
|
118
|
+
opts.on("--ruby-versions LIST", "List all supported Ruby versions") do |arg|
|
119
|
+
log(:notice, "Requested Ruby versions: #{arg}")
|
120
|
+
|
121
|
+
vers = arg.split(/[^0-9.]/).map do |v|
|
122
|
+
parts = v.split(".")
|
123
|
+
parts[2] = "0" if parts[2].nil?
|
124
|
+
parts.join(".")
|
125
|
+
end
|
126
|
+
|
127
|
+
ENV["RUBY_CC_VERSION"] = vers.join(":")
|
128
|
+
end
|
129
|
+
|
118
130
|
opts.on("-h", "--help", "Prints this help") do
|
119
131
|
puts opts
|
120
132
|
exit
|
@@ -171,19 +183,12 @@ def volume(src, dest, mode: "rw")
|
|
171
183
|
end
|
172
184
|
|
173
185
|
def mount_bundle_cache(options)
|
174
|
-
unless File.exist?(File.join(Dir.pwd, "Gemfile"))
|
175
|
-
log(:trace, "Ignoring bundler config")
|
176
|
-
return
|
177
|
-
end
|
178
|
-
|
179
186
|
dir = File.join(cache_dir, options.fetch(:toolchain_info).platform, "bundle")
|
180
187
|
bundle_path = File.join(docker_tmp, "bundle")
|
181
188
|
FileUtils.mkdir_p(dir)
|
182
189
|
log(:trace, "Mounting bundle cache: #{dir}")
|
183
|
-
bundle_config = gen_bundle_config_file(bundle_path)
|
184
|
-
bundle_dir = File.dirname(bundle_config)
|
185
190
|
|
186
|
-
"#{volume(dir, bundle_path)} -
|
191
|
+
"#{volume(dir, bundle_path)} -e BUNDLE_PATH=#{bundle_path.inspect}"
|
187
192
|
end
|
188
193
|
|
189
194
|
def tmp_target_dir(options)
|
@@ -210,13 +215,11 @@ def default_command_to_run(input_args, options)
|
|
210
215
|
input_cmd = input_args.empty? ? "true" : input_args.join(" ")
|
211
216
|
|
212
217
|
if options[:build]
|
213
|
-
with_bundle = "test -f Gemfile && bundle install && #{input_cmd} && bundle exec rake native:$RUBY_TARGET gem"
|
218
|
+
with_bundle = +"test -f Gemfile && bundle install && #{input_cmd} && bundle exec rake native:$RUBY_TARGET gem"
|
214
219
|
without_bundle = "#{input_cmd} && rake native:$RUBY_TARGET gem"
|
215
|
-
|
216
220
|
log(:notice, "Running default build command:")
|
217
221
|
log(:notice, " $ rake native:#{options[:toolchain_info].platform} gem")
|
218
|
-
|
219
|
-
"bash -c '#{cargo_env}; (#{with_bundle}) || (#{without_bundle})'"
|
222
|
+
"bash -c '(#{with_bundle}) || (#{without_bundle})'"
|
220
223
|
else
|
221
224
|
input_args.empty? ? "bash" : "bash -c '#{input_args.join(" ")}'"
|
222
225
|
end
|
@@ -239,19 +242,6 @@ def interactive?(input_args)
|
|
239
242
|
$stdin.tty?
|
240
243
|
end
|
241
244
|
|
242
|
-
def gen_bundle_config_file(path)
|
243
|
-
dir = Dir.mktmpdir("rb-sys-dock")
|
244
|
-
file = File.join(dir, "config")
|
245
|
-
File.write(file, <<~YAML)
|
246
|
-
---
|
247
|
-
BUNDLE_JOBS: "4"
|
248
|
-
BUNDLE_RETRY: "4"
|
249
|
-
BUNDLE_PATH: #{path.inspect}
|
250
|
-
YAML
|
251
|
-
|
252
|
-
file
|
253
|
-
end
|
254
|
-
|
255
245
|
def mount_tmp_dir(options)
|
256
246
|
"--mount type=bind,source=#{Dir.mktmpdir},destination=#{Dir.pwd}/tmp/#{options.fetch(:toolchain_info).platform},readonly=false"
|
257
247
|
end
|
@@ -280,7 +270,12 @@ def rcd(input_args, options)
|
|
280
270
|
-e RCD_HOST_RUBY_PLATFORM=#{RbConfig::CONFIG["arch"]} \
|
281
271
|
-e RCD_HOST_RUBY_VERSION=#{RUBY_VERSION} \
|
282
272
|
-e RCD_IMAGE \
|
273
|
+
-e RB_SYS_DOCK_TMPDIR="/tmp/rb-sys-dock" \
|
274
|
+
-e RB_SYS_CARGO_TARGET_DIR=#{tmp_target_dir(options).inspect} \
|
275
|
+
#{ENV["RUBY_CC_VERSION"] ? "-e RUBY_CC_VERSION=#{ENV["RUBY_CC_VERSION"]}" : ""} \
|
276
|
+
-e RAKEOPT \
|
283
277
|
-e TERM \
|
278
|
+
-e LC_ALL=#{ENV.fetch("LC_ALL", "en_US.UTF-8")} \
|
284
279
|
-w #{Dir.pwd} \
|
285
280
|
--rm \
|
286
281
|
--interactive \
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "open3"
|
4
|
+
require "psych"
|
5
|
+
|
6
|
+
module RbSys
|
7
|
+
module Cargo
|
8
|
+
# Extracts metadata from a Cargo project using `cargo metadata`.
|
9
|
+
class Metadata
|
10
|
+
attr_reader :name
|
11
|
+
|
12
|
+
def initialize(name)
|
13
|
+
raise ArgumentError, "name must be a String" unless name.is_a?(String)
|
14
|
+
|
15
|
+
@name = name
|
16
|
+
end
|
17
|
+
|
18
|
+
# @api private
|
19
|
+
def self.delegates_to_cargo_metadata(*methods)
|
20
|
+
methods.each do |method|
|
21
|
+
define_method(method) { cargo_metadata.fetch(method.to_s) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# @api private
|
26
|
+
def self.delegates_to_package_metadata(*methods)
|
27
|
+
methods.each do |method|
|
28
|
+
define_method(method) { package_metadata.fetch(method.to_s) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
delegates_to_cargo_metadata :target_directory, :workspace_root, :packages
|
33
|
+
|
34
|
+
delegates_to_package_metadata :manifest_path, :version, :id, :edition, :targets, :features, :metadata
|
35
|
+
|
36
|
+
# Returns the path where the Cargo project's Cargo.toml is located.
|
37
|
+
#
|
38
|
+
# @return [String]
|
39
|
+
def manifest_directory
|
40
|
+
@manifest_directory ||= File.dirname(manifest_path)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def package_metadata
|
46
|
+
return @package_metadata if @package_metadata
|
47
|
+
|
48
|
+
found = cargo_metadata.fetch("packages").find { |p| p.fetch("name") == name }
|
49
|
+
raise PackageNotFoundError, @name unless found
|
50
|
+
@package_metadata = found
|
51
|
+
end
|
52
|
+
|
53
|
+
def cargo_metadata
|
54
|
+
return @cargo_metadata if @cargo_metadata
|
55
|
+
|
56
|
+
::Gem.load_yaml
|
57
|
+
cargo = ENV["CARGO"] || "cargo"
|
58
|
+
args = ["metadata", "--no-deps", "--format-version", "1"]
|
59
|
+
out, stderr, _status = Open3.capture3(cargo, *args)
|
60
|
+
@cargo_metadata = Gem::SafeYAML.safe_load(out)
|
61
|
+
rescue => err
|
62
|
+
raise CargoMetadataError.new(err, stderr, manifest_path)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/rb_sys/cargo.rb
ADDED
@@ -5,6 +5,7 @@ require "shellwords"
|
|
5
5
|
module RbSys
|
6
6
|
class CargoBuilder < Gem::Ext::Builder
|
7
7
|
# Converts Ruby link flags into something cargo understands
|
8
|
+
# @api private
|
8
9
|
class LinkFlagConverter
|
9
10
|
FILTERED_PATTERNS = [
|
10
11
|
/compress-debug-sections/, # Not supported by all linkers, and not required for Rust
|
data/lib/rb_sys/cargo_builder.rb
CHANGED
@@ -4,6 +4,7 @@ require_relative "cargo_builder/link_flag_converter"
|
|
4
4
|
|
5
5
|
module RbSys
|
6
6
|
# A class to build a Ruby gem Cargo. Extracted from `rubygems` gem, with some modifications.
|
7
|
+
# @api private
|
7
8
|
class CargoBuilder < Gem::Ext::Builder
|
8
9
|
attr_accessor :spec, :runner, :env, :features, :target, :extra_rustc_args, :dry_run, :ext_dir, :extra_rustflags,
|
9
10
|
:extra_cargo_args
|
@@ -22,7 +23,7 @@ module RbSys
|
|
22
23
|
@extra_rustc_args = []
|
23
24
|
@extra_cargo_args = []
|
24
25
|
@dry_run = true
|
25
|
-
@ext_dir =
|
26
|
+
@ext_dir = ""
|
26
27
|
@extra_rustflags = []
|
27
28
|
end
|
28
29
|
|
@@ -57,15 +58,16 @@ module RbSys
|
|
57
58
|
build_env.merge(env)
|
58
59
|
end
|
59
60
|
|
60
|
-
def
|
61
|
-
|
61
|
+
def manifest_dir
|
62
|
+
ext_dir
|
63
|
+
end
|
62
64
|
|
65
|
+
def cargo_command(dest_path, args = [])
|
63
66
|
cmd = []
|
64
67
|
cmd += ["cargo", "rustc"]
|
65
68
|
cmd += ["--target", target] if target
|
66
69
|
cmd += ["--target-dir", dest_path]
|
67
70
|
cmd += ["--features", features.join(",")] unless features.empty?
|
68
|
-
cmd += ["--manifest-path", manifest]
|
69
71
|
cmd += ["--lib"]
|
70
72
|
cmd += ["--profile", profile.to_s]
|
71
73
|
cmd += Gem::Command.build_args
|
@@ -234,7 +236,7 @@ module RbSys
|
|
234
236
|
!!Gem::WIN_PATTERNS.find { |r| target_platform =~ r }
|
235
237
|
end
|
236
238
|
|
237
|
-
# Interpolate substition vars in the arg
|
239
|
+
# Interpolate substition vars in the arg
|
238
240
|
def maybe_resolve_ldflag_variable(input_arg, dest_dir)
|
239
241
|
var_matches = input_arg.match(/\$\((\w+)\)/)
|
240
242
|
|
@@ -245,31 +247,13 @@ module RbSys
|
|
245
247
|
return input_arg if var_name.nil? || var_name.chomp.empty?
|
246
248
|
|
247
249
|
case var_name
|
248
|
-
# On windows, it is assumed that mkmf has setup an exports file for the
|
249
|
-
# extension, so we have to to create one ourselves.
|
250
250
|
when "DEFFILE"
|
251
|
-
|
251
|
+
# DEFFILE already generated by cargo
|
252
252
|
else
|
253
253
|
RbConfig::CONFIG[var_name]
|
254
254
|
end
|
255
255
|
end
|
256
256
|
|
257
|
-
def write_deffile(dest_path)
|
258
|
-
deffile_path = File.join(dest_path, "#{spec.name}-#{RbConfig::CONFIG["arch"]}.def")
|
259
|
-
|
260
|
-
unless dry_run
|
261
|
-
FileUtils.mkdir_p(dest_dir)
|
262
|
-
export_prefix = makefile_config("EXPORT_PREFIX") || ""
|
263
|
-
|
264
|
-
File.open(deffile_path, "w") do |f|
|
265
|
-
f.puts "EXPORTS"
|
266
|
-
f.puts "#{export_prefix.strip}Init_#{spec.name}"
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
deffile_path
|
271
|
-
end
|
272
|
-
|
273
257
|
# Corresponds to $(LIBPATH) in mkmf
|
274
258
|
def mkmf_libpath
|
275
259
|
["-L", "native=#{makefile_config("libdir")}"]
|
data/lib/rb_sys/error.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RbSys
|
4
|
+
# Error is the base class for all errors raised by rb_sys.
|
5
|
+
class Error < StandardError; end
|
6
|
+
|
7
|
+
# Raised when a package is not found from the Cargo metadata.
|
8
|
+
class PackageNotFoundError < Error
|
9
|
+
def initialize(name)
|
10
|
+
msg = <<~MSG.chomp.tr("\n", " ")
|
11
|
+
Could not find Cargo package metadata for #{@name.inspect}. Please
|
12
|
+
check that #{@name.inspect} matches the crate name in your
|
13
|
+
Cargo.toml."
|
14
|
+
MSG
|
15
|
+
|
16
|
+
super(msg)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Raised when Cargo metadata cannot be parsed.
|
21
|
+
class CargoMetadataError < Error
|
22
|
+
def initialize(err, stderr, manifest_path)
|
23
|
+
msg = <<~MSG.chomp.tr("\n", " ")
|
24
|
+
Could not parse Cargo metadata. Please check that your Cargo.toml
|
25
|
+
is valid. The error was: #{err}
|
26
|
+
|
27
|
+
Looking for this Cargo.toml: #{manifest_path.inspect}
|
28
|
+
|
29
|
+
Stderr
|
30
|
+
------
|
31
|
+
#{stderr}
|
32
|
+
MSG
|
33
|
+
|
34
|
+
super(msg)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require_relative "cargo/metadata"
|
2
|
+
require_relative "error"
|
3
|
+
|
4
|
+
begin
|
5
|
+
require "rake/extensiontask"
|
6
|
+
rescue LoadError
|
7
|
+
abort "Please install rake-compiler to use this gem"
|
8
|
+
end
|
9
|
+
|
10
|
+
module RbSys
|
11
|
+
# ExtensionTask is a Rake::ExtensionTask subclass that is used to tailored for
|
12
|
+
# Rust extensions. It has the same options a `Rake::ExtensionTask`.
|
13
|
+
#
|
14
|
+
# @see https://www.rubydoc.info/gems/rake-compiler/Rake/ExtensionTask
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
# RbSys::ExtensionTask.new("my-crate", my_gemspec) do |ext|
|
18
|
+
# ext.lib_dir = "lib/my-crate"
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# @param name [String] the crate name to build
|
22
|
+
# @param gem_spec [Gem::Specification] the gem specification to build (needed for cross-compiling)
|
23
|
+
# @return [Rake::ExtensionTask]
|
24
|
+
class ExtensionTask < Rake::ExtensionTask
|
25
|
+
def init(name = nil, gem_spec = nil)
|
26
|
+
super
|
27
|
+
@orginal_ext_dir = @ext_dir
|
28
|
+
@ext_dir = cargo_metadata.manifest_directory
|
29
|
+
@source_pattern = nil
|
30
|
+
@compiled_pattern = "*.{obj,so,bundle,dSYM}"
|
31
|
+
@cross_compile = ENV.key?("RUBY_TARGET")
|
32
|
+
@cross_platform = [ENV["RUBY_TARGET"]].compact
|
33
|
+
@cross_compiling_blocks = []
|
34
|
+
@cross_compiling_blocks << proc do |gemspec|
|
35
|
+
warn "Removing unneeded dependencies from native gemspec"
|
36
|
+
gemspec.dependencies.reject! { |d| d.name == "rb_sys" }
|
37
|
+
end
|
38
|
+
@cross_compiling_blocks << proc do |gemspec|
|
39
|
+
warn "Removing source files from native gemspec"
|
40
|
+
gemspec.files.reject! { |f| f.end_with?(".rs") }
|
41
|
+
gemspec.files.reject! { |f| f.match?(/Cargo.(toml|lock)$/) }
|
42
|
+
gemspec.files.reject! { |f| extconf.end_with?(f) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def define
|
47
|
+
super
|
48
|
+
define_env_tasks
|
49
|
+
end
|
50
|
+
|
51
|
+
def cargo_metadata
|
52
|
+
@cargo_metadata ||= Cargo::Metadata.new(@name)
|
53
|
+
end
|
54
|
+
|
55
|
+
def extconf
|
56
|
+
File.join(cargo_metadata.manifest_directory, "extconf.rb")
|
57
|
+
end
|
58
|
+
|
59
|
+
def binary(_platf)
|
60
|
+
super.tr("-", "_")
|
61
|
+
end
|
62
|
+
|
63
|
+
# I'm not sure why this is necessary, can it be removed?
|
64
|
+
def source_files
|
65
|
+
list = FileList[
|
66
|
+
"#{ext_dir}/**/*.{rs,rb,c,h,toml}",
|
67
|
+
"**/Cargo.{toml,lock}",
|
68
|
+
"**/.cargo/**/*",
|
69
|
+
"#{ext_dir}/lib/**/*"
|
70
|
+
]
|
71
|
+
list.include("#{ext_dir}/#{@source_pattern}") if @source_pattern
|
72
|
+
list.exclude(File.join(target_directory, "**/*"))
|
73
|
+
list
|
74
|
+
end
|
75
|
+
|
76
|
+
def cross_compiling(&block)
|
77
|
+
@cross_compiling_blocks << block if block
|
78
|
+
end
|
79
|
+
|
80
|
+
def target_directory
|
81
|
+
cargo_metadata.target_directory
|
82
|
+
end
|
83
|
+
|
84
|
+
def define_native_tasks(for_platform = nil, ruby_ver = RUBY_VERSION, callback = nil)
|
85
|
+
cb = proc do |gemspec|
|
86
|
+
callback&.call(gemspec)
|
87
|
+
|
88
|
+
@cross_compiling_blocks.each do |block|
|
89
|
+
block.call(gemspec)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
super(for_platform, ruby_ver, cb)
|
94
|
+
end
|
95
|
+
|
96
|
+
def define_env_tasks
|
97
|
+
task "rb_sys:env:default" do
|
98
|
+
ENV["RB_SYS_CARGO_TARGET_DIR"] ||= target_directory
|
99
|
+
ENV["RB_SYS_CARGO_MANIFEST_DIR"] ||= cargo_metadata.manifest_directory
|
100
|
+
ENV["RB_SYS_CARGO_PROFILE"] ||= "release"
|
101
|
+
end
|
102
|
+
|
103
|
+
desc "Use the debug profile for building native Rust extensions"
|
104
|
+
task "rb_sys:env:dev" do
|
105
|
+
ENV["RB_SYS_CARGO_PROFILE"] = "dev"
|
106
|
+
end
|
107
|
+
|
108
|
+
desc "Use the release profile for building native Rust extensions"
|
109
|
+
task "rb_sys:env:release" do
|
110
|
+
ENV["RB_SYS_CARGO_PROFILE"] = "release"
|
111
|
+
end
|
112
|
+
|
113
|
+
file extconf => "rb_sys:env:default"
|
114
|
+
|
115
|
+
desc 'Compile the native Rust extension with the "dev" profile'
|
116
|
+
task "compile:dev" => ["rb_sys:env:dev", "compile"]
|
117
|
+
|
118
|
+
desc 'Compile the native Rust extension with the "release" profile'
|
119
|
+
task "compile:release" => ["rb_sys:env:release", "compile"]
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
data/lib/rb_sys/mkmf/config.rb
CHANGED
@@ -4,7 +4,20 @@ module RbSys
|
|
4
4
|
module Mkmf
|
5
5
|
# Config that delegates to CargoBuilder if needded
|
6
6
|
class Config
|
7
|
-
|
7
|
+
# Force the installation of the Rust toolchain when building
|
8
|
+
attr_accessor :force_install_rust_toolchain
|
9
|
+
|
10
|
+
# Clean artifacts after install (default: true if invoked by Rubygems)
|
11
|
+
attr_accessor :clean_after_install
|
12
|
+
|
13
|
+
# Target directory for cargo artifacts
|
14
|
+
attr_accessor :target_dir
|
15
|
+
|
16
|
+
# Automatically install the Rust toolchain when building (default: true)
|
17
|
+
attr_accessor :auto_install_rust_toolchain
|
18
|
+
|
19
|
+
# Directories to clean after installing with Rubygems
|
20
|
+
attr_accessor :rubygems_clean_dirs
|
8
21
|
|
9
22
|
def initialize(builder)
|
10
23
|
@builder = builder
|
@@ -14,14 +27,17 @@ module RbSys
|
|
14
27
|
@rubygems_clean_dirs = ["./cargo-vendor"]
|
15
28
|
end
|
16
29
|
|
30
|
+
# @api private
|
17
31
|
def cross_compiling?
|
18
32
|
RbConfig::CONFIG["CROSS_COMPILING"] == "yes"
|
19
33
|
end
|
20
34
|
|
35
|
+
# @api private
|
21
36
|
def method_missing(name, *args, &blk)
|
22
37
|
@builder.send(name, *args, &blk)
|
23
38
|
end
|
24
39
|
|
40
|
+
# @api private
|
25
41
|
def respond_to_missing?(name, include_private = false)
|
26
42
|
@builder.respond_to?(name) || super
|
27
43
|
end
|
@@ -29,6 +45,7 @@ module RbSys
|
|
29
45
|
# Seems to be the only way to reliably know if we were invoked by Rubygems.
|
30
46
|
# We want to know this so we can cleanup the target directory after an
|
31
47
|
# install, to remove bloat.
|
48
|
+
# @api private
|
32
49
|
def rubygems_invoked?
|
33
50
|
ENV.key?("SOURCE_DATE_EPOCH")
|
34
51
|
end
|
data/lib/rb_sys/mkmf.rb
CHANGED
@@ -10,6 +10,7 @@ require_relative "mkmf/config"
|
|
10
10
|
module RbSys
|
11
11
|
# Helper class for creating Rust Makefiles
|
12
12
|
module Mkmf
|
13
|
+
# @api private
|
13
14
|
GLOBAL_RUSTFLAGS = ["--cfg=rb_sys_gem"]
|
14
15
|
|
15
16
|
# Helper for building Rust extensions by creating a Ruby compatible makefile
|
@@ -48,7 +49,7 @@ module RbSys
|
|
48
49
|
|
49
50
|
yield builder if blk
|
50
51
|
|
51
|
-
srcprefix = "$(srcdir)
|
52
|
+
srcprefix = File.join("$(srcdir)", builder.ext_dir.gsub(/\A\.\/?/, "")).chomp("/")
|
52
53
|
RbConfig.expand(srcdir = srcprefix.dup)
|
53
54
|
|
54
55
|
full_cargo_command = cargo_command(srcdir, builder)
|
@@ -69,6 +70,7 @@ module RbSys
|
|
69
70
|
#{conditional_assign("RB_SYS_GLOBAL_RUSTFLAGS", GLOBAL_RUSTFLAGS.join(" "))}
|
70
71
|
#{conditional_assign("RB_SYS_EXTRA_RUSTFLAGS", builder.extra_rustflags.join(" "))}
|
71
72
|
#{conditional_assign("RB_SYS_EXTRA_CARGO_ARGS", builder.extra_cargo_args.join(" "))}
|
73
|
+
#{conditional_assign("RB_SYS_CARGO_MANIFEST_DIR", builder.manifest_dir)}
|
72
74
|
|
73
75
|
# Set dirname for the profile, since the profiles do not directly map to target dir (i.e. dev -> debug)
|
74
76
|
#{if_eq_stmt("$(RB_SYS_CARGO_PROFILE)", "dev")}
|
@@ -100,10 +102,10 @@ module RbSys
|
|
100
102
|
DLLIB = $(TARGET).#{RbConfig::CONFIG["DLEXT"]}
|
101
103
|
RUSTLIBDIR = $(RB_SYS_FULL_TARGET_DIR)/$(RB_SYS_CARGO_PROFILE_DIR)
|
102
104
|
RUSTLIB = $(RUSTLIBDIR)/$(SOEXT_PREFIX)$(TARGET_NAME).$(SOEXT)
|
105
|
+
TIMESTAMP_DIR = .
|
103
106
|
|
104
107
|
CLEANOBJS = $(RUSTLIBDIR) $(RB_SYS_BUILD_DIR)
|
105
|
-
|
106
|
-
CLEANLIBS = $(DLLIB) $(RUSTLIB) $(DEFFILE)
|
108
|
+
CLEANLIBS = $(DLLIB) $(RUSTLIB)
|
107
109
|
RUBYGEMS_CLEAN_DIRS = $(CLEANOBJS) $(CLEANFILES) #{builder.rubygems_clean_dirs.join(" ")}
|
108
110
|
|
109
111
|
#{base_makefile(srcdir)}
|
@@ -119,18 +121,20 @@ module RbSys
|
|
119
121
|
|
120
122
|
FORCE: ;
|
121
123
|
|
122
|
-
#{deffile_definition}
|
123
|
-
|
124
124
|
#{optional_rust_toolchain(builder)}
|
125
125
|
|
126
|
-
|
126
|
+
#{timestamp_file("sitearchdir")}:
|
127
|
+
\t$(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR)
|
128
|
+
\t$(Q) $(TOUCH) $@
|
129
|
+
|
130
|
+
$(RUSTLIB): FORCE
|
127
131
|
\t$(ECHO) generating $(@) \\("$(RB_SYS_CARGO_PROFILE)"\\)
|
128
132
|
\t#{full_cargo_command}
|
129
133
|
|
130
134
|
$(DLLIB): $(RUSTLIB)
|
131
135
|
\t$(Q) $(COPY) "$(RUSTLIB)" $@
|
132
136
|
|
133
|
-
install-so: $(DLLIB)
|
137
|
+
install-so: $(DLLIB) #{timestamp_file("sitearchdir")}
|
134
138
|
\t$(ECHO) installing $(DLLIB) to $(RUBYARCHDIR)
|
135
139
|
\t$(Q) $(MAKEDIRS) $(RUBYARCHDIR)
|
136
140
|
\t$(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
|
@@ -166,7 +170,7 @@ module RbSys
|
|
166
170
|
cargo_cmd = builder.cargo_command(dest_path, args)
|
167
171
|
cmd = Shellwords.join(cargo_cmd)
|
168
172
|
cmd.gsub!("\\=", "=")
|
169
|
-
cmd.gsub!(/\Acargo rustc/, "$(CARGO) rustc $(RB_SYS_EXTRA_CARGO_ARGS)")
|
173
|
+
cmd.gsub!(/\Acargo rustc/, "$(CARGO) rustc $(RB_SYS_EXTRA_CARGO_ARGS) --manifest-path $(RB_SYS_CARGO_MANIFEST_DIR)/Cargo.toml")
|
170
174
|
cmd.gsub!(/-v=\d/, "")
|
171
175
|
cmd
|
172
176
|
end
|
@@ -200,21 +204,6 @@ module RbSys
|
|
200
204
|
cargo_command
|
201
205
|
end
|
202
206
|
|
203
|
-
def deffile_definition
|
204
|
-
warn("EXPORT_PREFIX is not defined, please require \"mkmf\" before requiring \"rb_sys/mkmf\"") unless defined?(EXPORT_PREFIX)
|
205
|
-
|
206
|
-
return unless defined?(EXPORT_PREFIX) && EXPORT_PREFIX
|
207
|
-
|
208
|
-
@deffile_definition ||= <<~MAKE
|
209
|
-
$(DEFFILE):
|
210
|
-
\t$(ECHO) creating target directory \\($(RUSTLIBDIR)\\)
|
211
|
-
\t$(Q) $(MAKEDIRS) $(RUSTLIBDIR)
|
212
|
-
\t$(ECHO) generating $(@)
|
213
|
-
\t$(ECHO) EXPORTS > $@
|
214
|
-
\t$(ECHO) $(TARGET_ENTRY) >> $@
|
215
|
-
MAKE
|
216
|
-
end
|
217
|
-
|
218
207
|
def rust_toolchain_env(builder)
|
219
208
|
<<~MAKE
|
220
209
|
#{conditional_assign("RB_SYS_RUSTUP_PROFILE", "minimal")}
|
@@ -4,6 +4,7 @@
|
|
4
4
|
|
5
5
|
module RbSys
|
6
6
|
class ToolchainInfo
|
7
|
+
# @private
|
7
8
|
DATA = {"arm-linux" => {"rust-target" => "arm-unknown-linux-gnueabihf", "rake-compiler-dock" => {"cc" => "arm-linux-gnueabihf-gcc"}, "docker-platform" => "linux/arm/v7", "supported" => true}, "aarch64-linux" => {"rust-target" => "aarch64-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "aarch64-linux-gnu-gcc"}, "docker-platform" => "linux/arm64/v8", "supported" => true}, "arm64-darwin" => {"rust-target" => "aarch64-apple-darwin", "rake-compiler-dock" => {"cc" => "aarch64-apple-darwin-clang"}, "docker-platform" => "linux/arm64/v8", "supported" => true}, "x64-mingw-ucrt" => {"rust-target" => "x86_64-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "x86_64-windows-gnu-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x64-mingw32" => {"rust-target" => "x86_64-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "x86_64-windows-gnu-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86-linux" => {"rust-target" => "i686-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "i686-redhat-linux-gcc"}, "docker-platform" => "linux/i386", "supported" => false}, "x86-mingw32" => {"rust-target" => "i686-pc-windows-gnu", "rake-compiler-dock" => {"cc" => "i686-w64-mingw32-gcc"}, "docker-platform" => "linux/i386", "supported" => false}, "x86_64-darwin" => {"rust-target" => "x86_64-apple-darwin", "rake-compiler-dock" => {"cc" => "x86_64-apple-darwin-clang"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86_64-linux" => {"rust-target" => "x86_64-unknown-linux-gnu", "rake-compiler-dock" => {"cc" => "x86_64-redhat-linux-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}, "x86_64-linux-musl" => {"rust-target" => "x86_64-unknown-linux-musl", "rake-compiler-dock" => {"cc" => "x86_64-unknown-linux-musl-gcc"}, "docker-platform" => "linux/amd64", "supported" => true}}
|
8
9
|
end
|
9
10
|
end
|
@@ -14,19 +14,31 @@ module RbSys
|
|
14
14
|
attr_reader :platform, :gem_platform, :rust_target, :rake_compiler_dock_cc, :supported, :rake_compiler_dock_image, :docker_platform
|
15
15
|
|
16
16
|
class << self
|
17
|
+
# Get all known toolchains.
|
18
|
+
#
|
19
|
+
# @return [Array<RbSys::ToolchainInfo>]
|
17
20
|
def all
|
18
21
|
@all ||= DATA.keys.map { |k| new(k) }
|
19
22
|
end
|
20
23
|
|
24
|
+
# Get all supported toolchains.
|
25
|
+
#
|
26
|
+
# @return [Array<RbSys::ToolchainInfo>]
|
21
27
|
def supported
|
22
28
|
@supported ||= all.select(&:supported?)
|
23
29
|
end
|
24
30
|
|
31
|
+
# Get the toolchain for the current platform.
|
32
|
+
#
|
33
|
+
# @return [RbSys::ToolchainInfo]
|
25
34
|
def local
|
26
35
|
@current ||= new(RbConfig::CONFIG["arch"])
|
27
36
|
end
|
28
37
|
end
|
29
38
|
|
39
|
+
# Create a new toolchain info object.
|
40
|
+
#
|
41
|
+
# @param platform [String] The platform to get information about.
|
30
42
|
def initialize(platform)
|
31
43
|
@platform = platform
|
32
44
|
@gem_platform = Gem::Platform.new(platform)
|
@@ -38,14 +50,24 @@ module RbSys
|
|
38
50
|
@docker_platform = data["docker-platform"]
|
39
51
|
end
|
40
52
|
|
53
|
+
# Whether this toolchain is supported.
|
54
|
+
#
|
55
|
+
# @return [Boolean]
|
41
56
|
def supported?
|
42
57
|
@supported
|
43
58
|
end
|
44
59
|
|
60
|
+
# String representation of the toolchain.
|
61
|
+
#
|
62
|
+
# @return [String]
|
45
63
|
def to_s
|
46
64
|
"#{gem_platform.cpu}-#{gem_platform.os}"
|
47
65
|
end
|
48
66
|
|
67
|
+
# Compare two toolchains.
|
68
|
+
#
|
69
|
+
# @param other [RbSys::ToolchainInfo]
|
70
|
+
# @return [Boolean]
|
49
71
|
def ==(other)
|
50
72
|
@gem_platform == other.gem_platform
|
51
73
|
end
|
data/lib/rb_sys/version.rb
CHANGED
data/lib/rb_sys.rb
CHANGED
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rb_sys
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.61
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian Ker-Seymer
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
Rl+ASkq2/1i07TkBpCf+2hq66+h/hx+/Y/KrUzXfe0jtvil0WESkJT2kqRqHWNhD
|
31
31
|
9GKBxaQlXokNDtWCm1/gl6cD8WRZ0N5S4ZGJT1FLLsA=
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date: 2023-02-
|
33
|
+
date: 2023-02-06 00:00:00.000000000 Z
|
34
34
|
dependencies: []
|
35
35
|
description:
|
36
36
|
email:
|
@@ -45,8 +45,12 @@ files:
|
|
45
45
|
- certs/ianks.pem
|
46
46
|
- exe/rb-sys-dock
|
47
47
|
- lib/rb_sys.rb
|
48
|
+
- lib/rb_sys/cargo.rb
|
49
|
+
- lib/rb_sys/cargo/metadata.rb
|
48
50
|
- lib/rb_sys/cargo_builder.rb
|
49
51
|
- lib/rb_sys/cargo_builder/link_flag_converter.rb
|
52
|
+
- lib/rb_sys/error.rb
|
53
|
+
- lib/rb_sys/extensiontask.rb
|
50
54
|
- lib/rb_sys/mkmf.rb
|
51
55
|
- lib/rb_sys/mkmf/config.rb
|
52
56
|
- lib/rb_sys/toolchain_info.rb
|
@@ -74,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
78
|
- !ruby/object:Gem::Version
|
75
79
|
version: '0'
|
76
80
|
requirements: []
|
77
|
-
rubygems_version: 3.4.
|
81
|
+
rubygems_version: 3.4.6
|
78
82
|
signing_key:
|
79
83
|
specification_version: 4
|
80
84
|
summary: Helpers for compiling Rust extensions for ruby
|
metadata.gz.sig
CHANGED
Binary file
|