Class: Gem::Ext::ExtConfBuilder
- Defined in:
- lib/rubygems/ext/ext_conf_builder.rb
Constant Summary collapse
- FileEntry =
:nodoc:
FileUtils::Entry_
Constants inherited from Builder
Instance Attribute Summary
Attributes inherited from Builder
Class Method Summary collapse
Methods inherited from Builder
#build_error, #build_extension, #build_extensions, #builder_for, class_name, #initialize, make, run, #write_gem_make_out
Methods included from UserInteraction
#alert, #alert_error, #alert_warning, #ask, #ask_for_password, #ask_yes_no, #choose_from_list, #say, #terminate_interaction, #verbose
Methods included from DefaultUserInteraction
ui, #ui, ui=, #ui=, use_ui, #use_ui
Methods included from Text
#clean_text, #format_text, #levenshtein_distance, #min3, #truncate_text
Constructor Details
This class inherits a constructor from Gem::Ext::Builder
Class Method Details
.build(extension, dest_path, results, args = [], lib_dir = nil) ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/rubygems/ext/ext_conf_builder.rb', line 16 def self.build(extension, dest_path, results, args=[], lib_dir=nil) tmp_dest = Dir.mktmpdir(".gem.", ".") # Some versions of `mktmpdir` return absolute paths, which will break make # if the paths contain spaces. However, on Ruby 1.9.x on Windows, relative # paths cause all C extension builds to fail. # # As such, we convert to a relative path unless we are using Ruby 1.9.x on # Windows. This means that when using Ruby 1.9.x on Windows, paths with # spaces do not work. # # Details: https://github.com/rubygems/rubygems/issues/977#issuecomment-171544940 tmp_dest = get_relative_path(tmp_dest) Tempfile.open %w"siteconf .rb", "." do |siteconf| siteconf.puts "require 'rbconfig'" siteconf.puts "dest_path = #{tmp_dest.dump}" %w[sitearchdir sitelibdir].each do |dir| siteconf.puts "RbConfig::MAKEFILE_CONFIG['#{dir}'] = dest_path" siteconf.puts "RbConfig::CONFIG['#{dir}'] = dest_path" end siteconf.close destdir = ENV["DESTDIR"] begin cmd = Gem.ruby.shellsplit << "-I" << File.("../../..", __FILE__) << "-r" << get_relative_path(siteconf.path) << File.basename(extension) cmd.push(*args) begin run(cmd, results) do |s, r| if File.exist? 'mkmf.log' unless s.success? r << "To see why this extension failed to compile, please check" \ " the mkmf.log which can be found here:\n" r << " " + File.join(dest_path, 'mkmf.log') + "\n" end FileUtils.mv 'mkmf.log', dest_path end end siteconf.unlink end ENV["DESTDIR"] = nil make dest_path, results if tmp_dest # TODO remove in RubyGems 3 if Gem.install_extension_in_lib and lib_dir FileUtils.mkdir_p lib_dir entries = Dir.entries(tmp_dest) - %w[. ..] entries = entries.map { |entry| File.join tmp_dest, entry } FileUtils.cp_r entries, lib_dir, :remove_destination => true end FileEntry.new(tmp_dest).traverse do |ent| destent = ent.class.new(dest_path, ent.rel) destent.exist? or FileUtils.mv(ent.path, destent.path) end end ensure ENV["DESTDIR"] = destdir siteconf.close! end end results ensure FileUtils.rm_rf tmp_dest if tmp_dest end |