Class
Constants
The builder shells-out to run various commands after changing the directory. This means multiple installations cannot be allowed to build extensions in parallel as they may change each other’s directories leading to broken extensions or failed installations.
Class Methods
::
lib/rubygems/ext/builder.rb
View on GitHub
# File tmp/rubies/ruby-2.6.10/lib/rubygems/ext/builder.rb, line 24
def self.class_name
name =~ /Ext::(.*)Builder/
$1.downcase
end
No documentation available
lib/rubygems/ext/builder.rb
View on GitHub
# File tmp/rubies/ruby-2.6.10/lib/rubygems/ext/builder.rb, line 29
def self.make(dest_path, results)
unless File.exist? 'Makefile'
raise Gem::InstallError, 'Makefile not found'
end
# try to find make program from Ruby configure arguments first
RbConfig::CONFIG['configure_args'] =~ /with-make-prog\=(\w+)/
make_program = ENV['MAKE'] || ENV['make'] || $1
unless make_program
make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make'
end
destdir = '"DESTDIR=%s"' % ENV['DESTDIR']
['clean', '', 'install'].each do |target|
# Pass DESTDIR via command line to override what's in MAKEFLAGS
cmd = [
make_program,
destdir,
target
].join(' ').rstrip
begin
run(cmd, results, "make #{target}".rstrip)
rescue Gem::InstallError
raise unless target == 'clean' # ignore clean failure
end
end
end
No documentation available
lib/rubygems/ext/builder.rb
View on GitHub
# File tmp/rubies/ruby-2.6.10/lib/rubygems/ext/builder.rb, line 108
def initialize(spec, build_args = spec.build_args)
@spec = spec
@build_args = build_args
@gem_dir = spec.full_gem_path
@ran_rake = nil
end
Creates a new extension builder for spec
. If the spec
does not yet have build arguments, saved, set build_args
which is an ARGV-style array.
::
lib/rubygems/ext/builder.rb
View on GitHub
# File tmp/rubies/ruby-2.6.10/lib/rubygems/ext/builder.rb, line 58
def self.redirector
warn "#{caller[0]}: Use IO.popen(..., err: [:child, :out])"
'2>&1'
end
No documentation available
lib/rubygems/ext/builder.rb
View on GitHub
# File tmp/rubies/ruby-2.6.10/lib/rubygems/ext/builder.rb, line 63
def self.run(command, results, command_name = nil)
verbose = Gem.configuration.really_verbose
begin
rubygems_gemdeps, ENV['RUBYGEMS_GEMDEPS'] = ENV['RUBYGEMS_GEMDEPS'], nil
if verbose
puts("current directory: #{Dir.pwd}")
p(command)
end
results << "current directory: #{Dir.pwd}"
results << (command.respond_to?(:shelljoin) ? command.shelljoin : command)
redirections = verbose ? {} : {err: [:child, :out]}
IO.popen(command, "r", redirections) do |io|
if verbose
IO.copy_stream(io, $stdout)
else
results << io.read
end
end
rescue => error
raise Gem::InstallError, "#{command_name || class_name} failed#{error.message}"
ensure
ENV['RUBYGEMS_GEMDEPS'] = rubygems_gemdeps
end
unless $?.success?
results << "Building has failed. See above output for more information on the failure." if verbose
exit_reason =
if $?.exited?
", exit code #{$?.exitstatus}"
elsif $?.signaled?
", uncaught signal #{$?.termsig}"
end
raise Gem::InstallError, "#{command_name || class_name} failed#{exit_reason}"
end
end
No documentation available
Instance Methods
lib/rubygems/ext/builder.rb
View on GitHub
# File tmp/rubies/ruby-2.6.10/lib/rubygems/ext/builder.rb, line 209
def build_extensions
return if @spec.extensions.empty?
if @build_args.empty?
say "Building native extensions. This could take a while..."
else
say "Building native extensions with: '#{@build_args.join ' '}'"
say "This could take a while..."
end
dest_path = @spec.extension_dir
FileUtils.rm_f @spec.gem_build_complete_path
# FIXME: action at a distance: @ran_rake modified deep in build_extension(). - @duckinator
@ran_rake = false # only run rake once
@spec.extensions.each do |extension|
break if @ran_rake
build_extension extension, dest_path
end
FileUtils.touch @spec.gem_build_complete_path
end
Builds extensions. Valid types of extensions are extconf.rb files, configure scripts and rakefiles or mkrf_conf files.