Methods
- B
- C
- M
- N
- R
Included Modules
Constants
| CHDIR_MUTEX | = | Mutex.new # :nodoc: |
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 Public methods
class_name()
Link
make(dest_path, results)
Link
# File lib/rubygems/ext/builder.rb, line 30 def self.make(dest_path, results) unless File.exist? 'Makefile' then 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 then make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make' end destdir = '"DESTDIR=%s"' % ENV['DESTDIR'] if RUBY_VERSION > '2.0' ['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
new(spec, build_args = spec.build_args)
Link
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.
redirector()
Link
run(command, results, command_name = nil)
Link
# File lib/rubygems/ext/builder.rb, line 63 def self.run(command, results, command_name = nil) verbose = Gem.configuration.really_verbose begin # TODO use Process.spawn when ruby 1.8 support is dropped. rubygems_gemdeps, ENV['RUBYGEMS_GEMDEPS'] = ENV['RUBYGEMS_GEMDEPS'], nil if verbose puts("current directory: #{Dir.pwd}") puts(command) system(command) else results << "current directory: #{Dir.pwd}" results << command results << %x`#{command} #{redirector}` end ensure ENV['RUBYGEMS_GEMDEPS'] = rubygems_gemdeps end unless $?.success? then results << "Building has failed. See above output for more information on the failure." if verbose exit_reason = if $?.exited? then ", exit code #{$?.exitstatus}" elsif $?.signaled? then ", uncaught signal #{$?.termsig}" end raise Gem::InstallError, "#{command_name || class_name} failed#{exit_reason}" end end
Instance Public methods
build_extensions()
Link
Builds extensions. Valid types of extensions are extconf.rb files, configure scripts and rakefiles or mkrf_conf files.
# File lib/rubygems/ext/builder.rb, line 182 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 @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