From 48267b199e8a6bd6bd8bcaec2822f3f2d6caad9d Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@ruby-lang.org>
Date: Wed, 27 Feb 2013 17:44:22 +0900
Subject: [PATCH] ext_conf_builder.rb: build in separate dir

* lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
  build in a separate temporary directory, and not mess up the source
  directory.  [Bug #7698]
---
 lib/rubygems/ext/builder.rb                    |  1 -
 lib/rubygems/ext/ext_conf_builder.rb           | 15 ++++++++++++---
 test/rubygems/test_gem_ext_ext_conf_builder.rb |  6 +++---
 test/rubygems/test_gem_installer.rb            |  5 +++--
 4 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/lib/rubygems/ext/builder.rb b/lib/rubygems/ext/builder.rb
index d7d953f..13cf64e 100644
--- a/lib/rubygems/ext/builder.rb
+++ b/lib/rubygems/ext/builder.rb
@@ -19,7 +19,6 @@ class Gem::Ext::Builder
     mf = Gem.read_binary 'Makefile'
     mf = mf.gsub(/^RUBYARCHDIR\s*=\s*\$[^$]*/, "RUBYARCHDIR = #{dest_path}")
     mf = mf.gsub(/^RUBYLIBDIR\s*=\s*\$[^$]*/, "RUBYLIBDIR = #{dest_path}")
-    mf = mf.gsub(/\s*\S+\.time$/, "")
 
     File.open('Makefile', 'wb') {|f| f.print mf}
 
diff --git a/lib/rubygems/ext/ext_conf_builder.rb b/lib/rubygems/ext/ext_conf_builder.rb
index 7ca322d..6f380d6 100644
--- a/lib/rubygems/ext/ext_conf_builder.rb
+++ b/lib/rubygems/ext/ext_conf_builder.rb
@@ -6,16 +6,25 @@
 
 require 'rubygems/ext/builder'
 require 'rubygems/command'
+require 'fileutils'
+require 'tmpdir'
 
 class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
 
   def self.build(extension, directory, dest_path, results, args=[])
-    cmd = "#{Gem.ruby} #{File.basename extension}"
+    pwd = Dir.pwd
+    cmd = "#{Gem.ruby} #{File.join pwd, File.basename(extension)}"
     cmd << " #{args.join ' '}" unless args.empty?
 
-    run cmd, results
+    Dir.chdir(Dir.mktmpdir("gem-install.")) do
+      begin
+        run cmd, results
 
-    make dest_path, results
+        make dest_path, results
+      ensure
+        FileUtils.mv("mkmf.log", pwd) if $! and File.exist?("mkmf.log")
+      end
+    end
 
     results
   end
diff --git a/test/rubygems/test_gem_ext_ext_conf_builder.rb b/test/rubygems/test_gem_ext_ext_conf_builder.rb
index 4a492c1..580dab2 100644
--- a/test/rubygems/test_gem_ext_ext_conf_builder.rb
+++ b/test/rubygems/test_gem_ext_ext_conf_builder.rb
@@ -30,7 +30,7 @@ class TestGemExtExtConfBuilder < Gem::TestCase
       Gem::Ext::ExtConfBuilder.build 'extconf.rb', nil, @dest_path, output
     end
 
-    assert_match(/^#{Gem.ruby} extconf.rb/, output[0])
+    assert_match(/^#{Gem.ruby} .*extconf.rb/, output[0])
     assert_equal "creating Makefile\n", output[1]
     case RUBY_PLATFORM
     when /mswin/ then
@@ -107,10 +107,10 @@ class TestGemExtExtConfBuilder < Gem::TestCase
 
     assert_match(/\Aextconf failed:
 
-#{Gem.ruby} extconf.rb.*
+#{Gem.ruby} .*extconf.rb.*
 checking for main\(\) in .*?nonexistent/m, error.message)
 
-    assert_match(/^#{Gem.ruby} extconf.rb/, output[0])
+    assert_match(/^#{Gem.ruby} .*extconf.rb/, output[0])
   end
 
   def test_class_make
diff --git a/test/rubygems/test_gem_installer.rb b/test/rubygems/test_gem_installer.rb
index bb48f35..bc17886 100644
--- a/test/rubygems/test_gem_installer.rb
+++ b/test/rubygems/test_gem_installer.rb
@@ -81,7 +81,7 @@ load Gem.bin_path('a', 'executable', version)
 
     gem_make_out = File.join @gemhome, 'gems', @spec.full_name, 'gem_make.out'
 
-    assert_match %r%#{Regexp.escape Gem.ruby} extconf\.rb%,
+    assert_match %r%#{Regexp.escape Gem.ruby} .*extconf\.rb%,
                  File.read(gem_make_out)
     assert_match %r%#{Regexp.escape Gem.ruby}: No such file%,
                  File.read(gem_make_out)
@@ -119,7 +119,8 @@ load Gem.bin_path('a', 'executable', version)
     File.open File.join(@spec.gem_dir, "extconf.rb"), "w" do |f|
       f.write <<-'RUBY'
         puts "IN EXTCONF"
-        File.open 'extconf_args', 'w' do |f|
+        extconf_args = File.join File.dirname(__FILE__), 'extconf_args'
+        File.open extconf_args, 'w' do |f|
           f.puts ARGV.inspect
         end
 
-- 
1.8.1.3

