In Files

  • rubygems/ext/builder.rb

Class/Module Index [+]

Quicksearch

Gem::Ext::Builder

Public Class Methods

class_name() click to toggle source
 
               # File rubygems/ext/builder.rb, line 24
def self.class_name
  name =~ /Ext::(.*)Builder/
  $1.downcase
end
            
make(dest_path, results) click to toggle source
 
               # File rubygems/ext/builder.rb, line 29
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) click to toggle source

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.

 
               # File rubygems/ext/builder.rb, line 98
def initialize spec, build_args = spec.build_args
  @spec       = spec
  @build_args = build_args
  @gem_dir    = spec.full_gem_path

  @ran_rake   = nil
end
            
redirector() click to toggle source
 
               # File rubygems/ext/builder.rb, line 58
def self.redirector
  '2>&1'
end
            
run(command, results, command_name = nil) click to toggle source
 
               # File rubygems/ext/builder.rb, line 62
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(command)
      system(command)
    else
      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
            

Public Instance Methods

build_extensions() click to toggle source

Builds extensions. Valid types of extensions are extconf.rb files, configure scripts and rakefiles or mkrf_conf files.

 
               # File rubygems/ext/builder.rb, line 179
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
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus