def build_extensions(directory, spec)
return unless spec.extensions.size > 0
say "Building native extensions. This could take a while..."
start_dir = Dir.pwd
dest_path = File.join(directory, spec.require_paths[0])
ran_rake = false
spec.extensions.each do |extension|
break if ran_rake
results = []
case extension
when /extconf/ then
builder = ExtExtConfBuilder
when /configure/ then
builder = ExtConfigureBuilder
when /rakefile/i, /mkrf_conf/i then
builder = ExtRakeBuilder
ran_rake = true
else
builder = nil
results = ["No builder for extension '#{extension}'"]
end
begin
Dir.chdir File.join(directory, File.dirname(extension))
results = builder.build(extension, directory, dest_path, results)
rescue => ex
results = results.join "\n"
File.open('gem_make.out', 'wb') { |f| f.puts results }
message = "ERROR: Failed to build gem native extension.\n\n\#{results}\n\nGem files will remain installed in \#{directory} for inspection.\nResults logged to \#{File.join(Dir.pwd, 'gem_make.out')}\n"
raise ExtensionBuildError, message
ensure
Dir.chdir start_dir
end
end
end