# File lib/rubygems/installer.rb, line 294
    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 # only run rake once

      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