rb_sys 0.9.41 → 0.9.43

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8b9a04958062964619c9e9baaf9c88869cd61120cd548a8e1380753ff01397c3
4
- data.tar.gz: 325671f0009fedba3f542dcfc72c773c794fdf7f75b5dfba0a1c7b67fdd9ff40
3
+ metadata.gz: abede1c651510cc3d4995a424e634a9ce4afcccf1a83f85151c737ad7b578463
4
+ data.tar.gz: 17d3ea227ca871ae8fb1fc19a6964d57101747a8de0564b95caeda4b042ee8df
5
5
  SHA512:
6
- metadata.gz: cf525485f77731be93525e7d4ff418bc8fbb89b8d921e508868604d65f77feee59c42afc927e2f8c36a4de815196e327cb04f603e66fa75b2e7eb576ab286732
7
- data.tar.gz: cd52ca8c09a63580d0a294a9f1bdf0b8eb5a4b7c9b9d178729118b6c677cc204445ab0f445ba44caef8b654d6d82104387bfef00cbf0540f1ced071280af0c26
6
+ metadata.gz: fbbc55012efc13e0eb0ba2c3c578a96e1cca965cc8a8691e8c3e48b008c5603df73d80fbe493b6653582a0461fb7d9b3fbeb4fa8bcbe711c33468714631883de
7
+ data.tar.gz: e12945fed0147192dfdc4c8cbbaa01a34a734c358c3766970e285b563bf4b866216bb489a3075e89ab4f3860d5dce078db0ab291df126006de7718c156a7a280
checksums.yaml.gz.sig CHANGED
@@ -1 +1 @@
1
- 7
1
+ �9��㼫:
@@ -1,6 +1,8 @@
1
1
  module RbSys
2
+ # A class to build a Ruby gem Cargo. Extracted from `rubygems` gem, with some modifications.
2
3
  class CargoBuilder < Gem::Ext::Builder
3
- attr_accessor :spec, :runner, :profile, :env, :features, :target, :extra_rustc_args, :dry_run, :ext_dir, :extra_rustflags
4
+ attr_accessor :spec, :runner, :env, :features, :target, :extra_rustc_args, :dry_run, :ext_dir, :extra_rustflags
5
+ attr_writer :profile
4
6
 
5
7
  def initialize(spec)
6
8
  require "rubygems/command"
@@ -18,6 +20,12 @@ module RbSys
18
20
  @extra_rustflags = []
19
21
  end
20
22
 
23
+ def profile
24
+ return :release if rubygems_invoked?
25
+
26
+ @profile
27
+ end
28
+
21
29
  def build(_extension, dest_path, results, args = [], lib_dir = nil, cargo_dir = Dir.pwd)
22
30
  require "fileutils"
23
31
  require "shellwords"
@@ -323,6 +331,10 @@ module RbSys
323
331
  end
324
332
  end
325
333
 
334
+ def rubygems_invoked?
335
+ ENV.key?("SOURCE_DATE_EPOCH")
336
+ end
337
+
326
338
  # Error raised when no cdylib artifact was created
327
339
  class DylibNotFoundError < StandardError
328
340
  def initialize(dir)
@@ -4,14 +4,19 @@ module RbSys
4
4
  module Mkmf
5
5
  # Config that delegates to CargoBuilder if needded
6
6
  class Config
7
- attr_accessor :force_install_rust_toolchain, :clean_after_install
7
+ attr_accessor :force_install_rust_toolchain, :clean_after_install, :target_dir, :auto_install_rust_toolchain
8
8
 
9
9
  def initialize(builder)
10
10
  @builder = builder
11
11
  @force_install_rust_toolchain = false
12
+ @auto_install_rust_toolchain = true
12
13
  @clean_after_install = rubygems_invoked?
13
14
  end
14
15
 
16
+ def cross_compiling?
17
+ RbConfig::CONFIG["CROSS_COMPILING"] == "yes"
18
+ end
19
+
15
20
  def method_missing(name, *args, &blk)
16
21
  @builder.send(name, *args, &blk)
17
22
  end
@@ -20,8 +25,6 @@ module RbSys
20
25
  @builder.respond_to?(name) || super
21
26
  end
22
27
 
23
- private
24
-
25
28
  # Seems to be the only way to reliably know if we were invoked by Rubygems.
26
29
  # We want to know this so we can cleanup the target directory after an
27
30
  # install, to remove bloat.
data/lib/rb_sys/mkmf.rb CHANGED
@@ -18,20 +18,22 @@ module RbSys
18
18
  #
19
19
  # @example Basic
20
20
  # require 'mkmf'
21
- # . require 'rb_sys/mkmf'
21
+ # require 'rb_sys/mkmf'
22
22
  #
23
- # . create_rust_makefile("my_extension") #=> Generate a Makefile in the current directory
23
+ # create_rust_makefile("my_extension") #=> Generate a Makefile in the current directory
24
24
  #
25
25
  # @example Configure a custom build profile
26
26
  # require 'mkmf'
27
- # . require 'rb_sys/mkmf'
27
+ # require 'rb_sys/mkmf'
28
28
  #
29
- # . create_rust_makefile("my_extension") do |r|
30
- # . # All of these are optional
31
- # . r.env = { 'FOO' => 'bar' }
32
- # . r.profile = ENV.fetch('RB_SYS_CARGO_PROFILE', :dev).to_sym
33
- # . r.features = %w[some_cargo_feature]
34
- # . end
29
+ # create_rust_makefile("my_extension") do |r|
30
+ # # All of these are optional
31
+ # r.env = { 'FOO' => 'bar' }
32
+ # r.profile = ENV.fetch('RB_SYS_CARGO_PROFILE', :dev).to_sym
33
+ # r.features = %w[some_cargo_feature]
34
+ # r.rustflags = %w[--cfg=foo]
35
+ # r.target_dir = "some/target/dir"
36
+ # end
35
37
  def create_rust_makefile(target, &blk)
36
38
  if target.include?("/")
37
39
  target_prefix, target = File.split(target)
@@ -62,7 +64,7 @@ module RbSys
62
64
  #{conditional_assign("SOEXT_PREFIX", "lib", indent: 1)}
63
65
  #{endif_stmt}
64
66
 
65
- #{conditional_assign("RB_SYS_CARGO_PROFILE", builder.profile)}
67
+ #{set_cargo_profile(builder)}
66
68
  #{conditional_assign("RB_SYS_CARGO_FEATURES", builder.features.join(","))}
67
69
  #{conditional_assign("RB_SYS_GLOBAL_RUSTFLAGS", GLOBAL_RUSTFLAGS.join(" "))}
68
70
  #{conditional_assign("RB_SYS_EXTRA_RUSTFLAGS", builder.extra_rustflags.join(" "))}
@@ -82,27 +84,30 @@ module RbSys
82
84
  #{endif_stmt}
83
85
 
84
86
  # Account for sub-directories when using `--target` argument with Cargo
87
+ #{conditional_assign("RB_SYS_CARGO_TARGET_DIR", "target")}
85
88
  #{if_neq_stmt("$(CARGO_BUILD_TARGET)", "")}
86
- #{assign_stmt("RB_SYS_CARGO_BUILD_TARGET_DIR", "target/$(CARGO_BUILD_TARGET)", indent: 1)}
89
+ #{assign_stmt("RB_SYS_FULL_TARGET_DIR", "$(RB_SYS_CARGO_TARGET_DIR)/$(CARGO_BUILD_TARGET)", indent: 1)}
87
90
  #{else_stmt}
88
- #{assign_stmt("RB_SYS_CARGO_BUILD_TARGET_DIR", "target", indent: 1)}
91
+ #{assign_stmt("RB_SYS_FULL_TARGET_DIR", "$(RB_SYS_CARGO_TARGET_DIR)", indent: 1)}
89
92
  #{endif_stmt}
90
93
 
91
94
  target_prefix = #{target_prefix}
92
95
  TARGET_NAME = #{target[/\A\w+/]}
93
96
  TARGET_ENTRY = #{RbConfig::CONFIG["EXPORT_PREFIX"]}Init_$(TARGET_NAME)
94
- RUBYARCHDIR = $(sitearchdir)$(target_prefix)
97
+ RUBYARCHDIR = $(sitearchdir)$(target_prefix)
95
98
  TARGET = #{target}
96
99
  DLLIB = $(TARGET).#{RbConfig::CONFIG["DLEXT"]}
97
- TARGET_DIR = #{Dir.pwd}/$(RB_SYS_CARGO_BUILD_TARGET_DIR)/$(RB_SYS_CARGO_PROFILE_DIR)
98
- RUSTLIB = $(TARGET_DIR)/$(SOEXT_PREFIX)$(TARGET_NAME).$(SOEXT)
100
+ RUSTLIBDIR = $(RB_SYS_FULL_TARGET_DIR)/$(RB_SYS_CARGO_PROFILE_DIR)
101
+ RUSTLIB = $(RUSTLIBDIR)/$(SOEXT_PREFIX)$(TARGET_NAME).$(SOEXT)
99
102
 
100
- CLEANOBJS = $(TARGET_DIR)/.fingerprint $(TARGET_DIR)/incremental $(TARGET_DIR)/examples $(TARGET_DIR)/deps $(TARGET_DIR)/build $(TARGET_DIR)/.cargo-lock $(TARGET_DIR)/*.d $(TARGET_DIR)/*.rlib $(RB_SYS_BUILD_DIR)
101
- DEFFILE = $(TARGET_DIR)/$(TARGET)-$(arch).def
103
+ CLEANOBJS = $(RUSTLIBDIR) $(RB_SYS_BUILD_DIR)
104
+ DEFFILE = $(RUSTLIBDIR)/$(TARGET)-$(arch).def
102
105
  CLEANLIBS = $(DLLIB) $(RUSTLIB) $(DEFFILE)
103
106
 
104
107
  #{base_makefile(srcdir)}
105
108
 
109
+ .PHONY: gemclean
110
+
106
111
  #{if_neq_stmt("$(RB_SYS_VERBOSE)", "")}
107
112
  #{assign_stmt("Q", "$(0=@)", indent: 1)}
108
113
  #{endif_stmt}
@@ -112,9 +117,9 @@ module RbSys
112
117
 
113
118
  FORCE: ;
114
119
 
115
- $(TARGET_DIR):
120
+ $(RUSTLIBDIR):
116
121
  \t$(ECHO) creating target directory \\($(@)\\)
117
- \t$(Q) $(MAKEDIRS) $(TARGET_DIR)
122
+ \t$(Q) $(MAKEDIRS) $(RUSTLIBDIR)
118
123
 
119
124
  #{deffile_definition}
120
125
 
@@ -122,7 +127,7 @@ module RbSys
122
127
 
123
128
  $(RUSTLIB): #{deffile_definition ? "$(DEFFILE) " : nil}FORCE
124
129
  \t$(ECHO) generating $(@) \\("$(RB_SYS_CARGO_PROFILE)"\\)
125
- \t$(Q) #{full_cargo_command}
130
+ \t#{full_cargo_command}
126
131
 
127
132
  $(DLLIB): $(RUSTLIB)
128
133
  \t$(Q) $(COPY) "$(RUSTLIB)" $@
@@ -132,7 +137,10 @@ module RbSys
132
137
  \t$(Q) $(MAKEDIRS) $(RUBYARCHDIR)
133
138
  \t$(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
134
139
 
135
- install: #{builder.clean_after_install ? "install-so realclean" : "install-so"}
140
+ gemclean:
141
+ \t-$(Q)$(RM_RF) $(CLEANOBJS) $(CLEANFILES) 2> /dev/null || true
142
+
143
+ install: #{builder.clean_after_install ? "install-so gemclean" : "install-so"}
136
144
 
137
145
  all: #{$extout ? "install" : "$(DLLIB)"}
138
146
  MAKE
@@ -153,7 +161,7 @@ module RbSys
153
161
 
154
162
  def cargo_command(cargo_dir, builder)
155
163
  builder.ext_dir = cargo_dir
156
- dest_path = File.join(Dir.pwd, "target")
164
+ dest_path = builder.target_dir || File.join(Dir.pwd, "target")
157
165
  args = ARGV.dup
158
166
  args.shift if args.first == "--"
159
167
  cargo_cmd = builder.cargo_command(dest_path, args)
@@ -181,8 +189,7 @@ module RbSys
181
189
  cargo_command.gsub!(/--profile \w+/, "$(RB_SYS_CARGO_PROFILE_FLAG)")
182
190
  cargo_command.gsub!(%r{--features \S+}, "--features $(RB_SYS_CARGO_FEATURES)")
183
191
  cargo_command.gsub!(%r{--target \S+}, "--target $(CARGO_BUILD_TARGET)")
184
- target_dir = "target/#{builder.target}".chomp("/")
185
- cargo_command.gsub!(%r{/#{target_dir}/[^/]+}, "/$(RB_SYS_CARGO_BUILD_TARGET_DIR)/$(RB_SYS_CARGO_PROFILE_DIR)")
192
+ cargo_command.gsub!(/--target-dir (?:(?!--).)+/, "--target-dir $(RB_SYS_CARGO_TARGET_DIR) ")
186
193
  cargo_command
187
194
  end
188
195
 
@@ -192,18 +199,14 @@ module RbSys
192
199
  return unless defined?(EXPORT_PREFIX) && EXPORT_PREFIX
193
200
 
194
201
  @deffile_definition ||= <<~MAKE
195
- $(DEFFILE): $(TARGET_DIR)
202
+ $(DEFFILE): $(RUSTLIBDIR)
196
203
  \t$(ECHO) generating $(@)
197
204
  \t$(Q) ($(COPY) $(srcdir)/$(TARGET).def $@ 2> /dev/null) || (echo EXPORTS && echo $(TARGET_ENTRY)) > $@
198
205
  MAKE
199
206
  end
200
207
 
201
- def optional_rust_toolchain(builder)
208
+ def rust_toolchain_env(builder)
202
209
  <<~MAKE
203
- #{conditional_assign("RB_SYS_FORCE_INSTALL_RUST_TOOLCHAIN", builder.force_install_rust_toolchain)}
204
-
205
- # Only run if the we are told to explicitly install the Rust toolchain
206
- #{if_neq_stmt("$(RB_SYS_FORCE_INSTALL_RUST_TOOLCHAIN)", "false")}
207
210
  #{conditional_assign("RB_SYS_RUSTUP_PROFILE", "minimal")}
208
211
 
209
212
  # If the user passed true, we assume stable Rust. Otherwise, use what
@@ -227,18 +230,36 @@ module RbSys
227
230
  #{export_env("PATH", "$(CARGO_HOME)/bin:$(RUSTUP_HOME)/bin:$(PATH)")}
228
231
  #{export_env("RUSTUP_TOOLCHAIN", "$(RB_SYS_DEFAULT_TOOLCHAIN)")}
229
232
  #{export_env("CARGO", "$(CARGO_HOME)/bin/cargo")}
233
+ MAKE
234
+ end
235
+
236
+ def optional_rust_toolchain(builder)
237
+ <<~MAKE
238
+ #{conditional_assign("RB_SYS_FORCE_INSTALL_RUST_TOOLCHAIN", force_install_rust_toolchain?(builder))}
239
+
240
+ # Only run if the we are told to explicitly install the Rust toolchain
241
+ #{if_neq_stmt("$(RB_SYS_FORCE_INSTALL_RUST_TOOLCHAIN)", "false")}
242
+ #{rust_toolchain_env(builder)}
230
243
 
231
244
  $(CARGO):
232
245
  \t$(Q) $(MAKEDIRS) $(CARGO_HOME) $(RUSTUP_HOME)
233
- \tcurl --proto '=https' --tlsv1.2 --retry 10 --retry-connrefused -fsSL "https://sh.rustup.rs" | sh -s -- --no-modify-path --profile $(RB_SYS_RUSTUP_PROFILE) --default-toolchain none -y
234
- \trustup toolchain install $(RB_SYS_DEFAULT_TOOLCHAIN) --profile $(RB_SYS_RUSTUP_PROFILE)
235
- \trustup default $(RB_SYS_DEFAULT_TOOLCHAIN)
246
+ \t$(Q) curl --proto '=https' --tlsv1.2 --retry 10 --retry-connrefused -fsSL "https://sh.rustup.rs" | sh -s -- --no-modify-path --profile $(RB_SYS_RUSTUP_PROFILE) --default-toolchain none -y
247
+ \t$(Q) rustup toolchain install $(RB_SYS_DEFAULT_TOOLCHAIN) --profile $(RB_SYS_RUSTUP_PROFILE)
248
+ \t$(Q) rustup default $(RB_SYS_DEFAULT_TOOLCHAIN)
249
+ \t$(Q) rustup component add rustfmt
236
250
 
237
251
  $(RUSTLIB): $(CARGO)
238
252
  #{endif_stmt}
239
253
  MAKE
240
254
  end
241
255
 
256
+ def force_install_rust_toolchain?(builder)
257
+ return builder.force_install_rust_toolchain if builder.force_install_rust_toolchain
258
+ return false unless builder.rubygems_invoked? && builder.auto_install_rust_toolchain
259
+
260
+ find_executable("cargo").nil?
261
+ end
262
+
242
263
  def if_eq_stmt(a, b)
243
264
  if $nmake
244
265
  "!IF #{a.inspect} == #{b.inspect}"
@@ -296,6 +317,12 @@ module RbSys
296
317
  "export #{k} := #{v}"
297
318
  end
298
319
  end
320
+
321
+ def set_cargo_profile(builder)
322
+ return assign_stmt("RB_SYS_CARGO_PROFILE", "release") if builder.rubygems_invoked?
323
+
324
+ conditional_assign("RB_SYS_CARGO_PROFILE", builder.profile)
325
+ end
299
326
  end
300
327
  end
301
328
  # rubocop:enable Style/GlobalVars
@@ -3,6 +3,13 @@
3
3
  require_relative "toolchain_info/data"
4
4
 
5
5
  module RbSys
6
+ # A class to get information about the Rust toolchains, and how they map to
7
+ # Ruby platforms.
8
+ #
9
+ # @example
10
+ # RbSys::ToolchainInfo.new("x86_64-unknown-linux-gnu").ruby_platform # => "x86_64-linux"
11
+ # RbSys::ToolchainInfo.new("x86_64-unknown-linux-gnu").supported? # => true
12
+ # RbSys::ToolchainInfo.new("x86_64-unknown-linux-gnu")
6
13
  class ToolchainInfo
7
14
  attr_reader :platform, :gem_platform, :rust_target, :rake_compiler_dock_cc, :supported, :rake_compiler_dock_image, :docker_platform
8
15
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RbSys
4
- VERSION = "0.9.41"
4
+ VERSION = "0.9.43"
5
5
  end
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.41
4
+ version: 0.9.43
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: 2022-11-13 00:00:00.000000000 Z
33
+ date: 2022-11-16 00:00:00.000000000 Z
34
34
  dependencies: []
35
35
  description:
36
36
  email:
@@ -72,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
72
  - !ruby/object:Gem::Version
73
73
  version: '0'
74
74
  requirements: []
75
- rubygems_version: 3.3.7
75
+ rubygems_version: 3.3.22
76
76
  signing_key:
77
77
  specification_version: 4
78
78
  summary: Helpers for compiling Rust extensions for ruby
metadata.gz.sig CHANGED
Binary file