[前][次][番号順一覧][スレッド一覧]

ruby-changes:29577

From: knu <ko1@a...>
Date: Tue, 25 Jun 2013 22:29:13 +0900 (JST)
Subject: [ruby-changes:29577] knu:r41629 (trunk): * lib/rubygems/ext/builder.rb (Gem::Ext::Builder.make): Pass

knu	2013-06-25 22:28:57 +0900 (Tue, 25 Jun 2013)

  New Revision: 41629

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=41629

  Log:
    * lib/rubygems/ext/builder.rb (Gem::Ext::Builder.make): Pass
      DESTDIR via command line to override what's in MAKEFLAGS.  This
      fixes an installation problem under a package building
      environment where DESTDIR is specified in the (parent) command
      line. [Fixes GH-327]

  Modified files:
    trunk/ChangeLog
    trunk/lib/rubygems/ext/builder.rb
    trunk/lib/rubygems/test_case.rb
    trunk/test/rubygems/test_gem_ext_cmake_builder.rb
    trunk/test/rubygems/test_gem_ext_configure_builder.rb
    trunk/test/rubygems/test_gem_ext_ext_conf_builder.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 41628)
+++ ChangeLog	(revision 41629)
@@ -1,3 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Tue Jun 25 22:28:07 2013  Akinori MUSHA  <knu@i...>
+
+	* lib/rubygems/ext/builder.rb (Gem::Ext::Builder.make): Pass
+	  DESTDIR via command line to override what's in MAKEFLAGS.  This
+	  fixes an installation problem under a package building
+	  environment where DESTDIR is specified in the (parent) command
+	  line. [Fixes GH-327]
+
 Tue Jun 25 21:43:13 2013  Tanaka Akira  <akr@f...>
 
 	* bignum.c (big2dbl): Use (BDIGIT)1 instead of 1UL.
Index: lib/rubygems/ext/builder.rb
===================================================================
--- lib/rubygems/ext/builder.rb	(revision 41628)
+++ lib/rubygems/ext/builder.rb	(revision 41629)
@@ -23,9 +23,14 @@ class Gem::Ext::Builder https://github.com/ruby/ruby/blob/trunk/lib/rubygems/ext/builder.rb#L23
       make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make'
     end
 
-    ['', ' install'].each do |target|
-      cmd = "#{make_program}#{target}"
-      run(cmd, results, "make#{target}")
+    ['', 'install'].each do |target|
+      # Pass DESTDIR via command line to override what's in MAKEFLAGS
+      cmd = [
+        make_program,
+        '"DESTDIR=%s"' % ENV['DESTDIR'],
+        target
+      ].join(' ').rstrip
+      run(cmd, results, "make #{target}".rstrip)
     end
   end
 
Index: lib/rubygems/test_case.rb
===================================================================
--- lib/rubygems/test_case.rb	(revision 41628)
+++ lib/rubygems/test_case.rb	(revision 41629)
@@ -28,6 +28,7 @@ require 'rubygems/test_utilities' https://github.com/ruby/ruby/blob/trunk/lib/rubygems/test_case.rb#L28
 require 'pp'
 require 'zlib'
 require 'pathname'
+require 'shellwords'
 Gem.load_yaml
 
 require 'rubygems/mock_gem_ui'
@@ -89,6 +90,63 @@ class Gem::TestCase < MiniTest::Unit::Te https://github.com/ruby/ruby/blob/trunk/lib/rubygems/test_case.rb#L90
     refute File.exist?(path), msg
   end
 
+  def scan_make_command_lines(output)
+    output.scan(/^#{Regexp.escape make_command}(?:[[:blank:]].*)?$/)
+  end
+
+  def parse_make_command_line(line)
+    command, *args = line.shellsplit
+
+    targets = []
+    macros = {}
+
+    args.each do |arg|
+      case arg
+      when /\A(\w+)=/
+        macros[$1] = $'
+      else
+        targets << arg
+      end
+    end
+
+    targets << '' if targets.empty?
+
+    {
+      :command => command,
+      :targets => targets,
+      :macros => macros,
+    }
+  end
+
+  def assert_contains_make_command(target, output, msg = nil)
+    if output.match(/\n/)
+      msg = message(msg) {
+        'Expected output containing make command "%s": %s' % [
+          ('%s %s' % [make_command, target]).rstrip,
+          output.inspect
+        ]
+      }
+    else
+      msg = message(msg) {
+        'Expected make command "%s": %s' % [
+          ('%s %s' % [make_command, target]).rstrip,
+          output.inspect
+        ]
+      }
+    end
+
+    assert scan_make_command_lines(output).any? { |line|
+      make = parse_make_command_line(line)
+
+      if make[:targets].include?(target)
+        yield make, line if block_given?
+        true
+      else
+        false
+      end
+    }, msg
+  end
+
   include Gem::DefaultUserInteraction
 
   undef_method :default_test if instance_methods.include? 'default_test' or
Index: test/rubygems/test_gem_ext_configure_builder.rb
===================================================================
--- test/rubygems/test_gem_ext_configure_builder.rb	(revision 41628)
+++ test/rubygems/test_gem_ext_configure_builder.rb	(revision 41629)
@@ -30,9 +30,9 @@ class TestGemExtConfigureBuilder < Gem:: https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_ext_configure_builder.rb#L30
 
     assert_equal "sh ./configure --prefix=#{@dest_path}", output.shift
     assert_equal "", output.shift
-    assert_equal make_command, output.shift
+    assert_contains_make_command '', output.shift
     assert_match(/^ok$/m, output.shift)
-    assert_equal make_command + " install", output.shift
+    assert_contains_make_command 'install', output.shift
     assert_match(/^ok$/m, output.shift)
   end
 
@@ -76,8 +76,8 @@ class TestGemExtConfigureBuilder < Gem:: https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_ext_configure_builder.rb#L76
       Gem::Ext::ConfigureBuilder.build nil, nil, @dest_path, output
     end
 
-    assert_equal make_command, output[0]
-    assert_equal "#{make_command} install", output[2]
+    assert_contains_make_command '', output[0]
+    assert_contains_make_command 'install', output[2]
   end
 
 end
Index: test/rubygems/test_gem_ext_ext_conf_builder.rb
===================================================================
--- test/rubygems/test_gem_ext_ext_conf_builder.rb	(revision 41628)
+++ test/rubygems/test_gem_ext_ext_conf_builder.rb	(revision 41629)
@@ -32,14 +32,8 @@ class TestGemExtExtConfBuilder < Gem::Te https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_ext_ext_conf_builder.rb#L32
 
     assert_match(/^#{Gem.ruby} extconf.rb/, output[0])
     assert_equal "creating Makefile\n", output[1]
-    case RUBY_PLATFORM
-    when /mswin/ then
-      assert_equal "nmake", output[2]
-      assert_equal "nmake install", output[4]
-    else
-      assert_equal "make", output[2]
-      assert_equal "make install", output[4]
-    end
+    assert_contains_make_command '', output[2]
+    assert_contains_make_command 'install', output[4]
   end
 
   def test_class_build_rbconfig_make_prog
@@ -56,8 +50,8 @@ class TestGemExtExtConfBuilder < Gem::Te https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_ext_ext_conf_builder.rb#L50
     end
 
     assert_equal "creating Makefile\n", output[1]
-    assert_equal make_command, output[2]
-    assert_equal "#{make_command} install", output[4]
+    assert_contains_make_command '', output[2]
+    assert_contains_make_command 'install', output[4]
   ensure
     RbConfig::CONFIG['configure_args'] = configure_args
   end
@@ -80,7 +74,7 @@ class TestGemExtExtConfBuilder < Gem::Te https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_ext_ext_conf_builder.rb#L74
     end
 
     assert_equal "creating Makefile\n", output[1]
-    assert_equal "anothermake", output[2]
+    assert_contains_make_command '', output[2]
   ensure
     RbConfig::CONFIG['configure_args'] = configure_args
     ENV['make'] = env_make
@@ -132,8 +126,8 @@ checking for main\(\) in .*?nonexistent/ https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_ext_ext_conf_builder.rb#L126
       Gem::Ext::ExtConfBuilder.make @ext, output
     end
 
-    assert_equal make_command, output[0]
-    assert_equal "#{make_command} install", output[2]
+    assert_contains_make_command '', output[0]
+    assert_contains_make_command 'install', output[2]
   end
 
   def test_class_make_no_Makefile
Index: test/rubygems/test_gem_ext_cmake_builder.rb
===================================================================
--- test/rubygems/test_gem_ext_cmake_builder.rb	(revision 41628)
+++ test/rubygems/test_gem_ext_cmake_builder.rb	(revision 41629)
@@ -38,8 +38,8 @@ install (FILES test.txt DESTINATION bin) https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_ext_cmake_builder.rb#L38
     assert_match \
       %r%^cmake \. -DCMAKE_INSTALL_PREFIX=#{Regexp.escape @dest_path}%, output
     assert_match %r%#{Regexp.escape @ext}%, output
-    assert_match %r%^#{Regexp.escape make_command}$%, output
-    assert_match %r%^#{Regexp.escape make_command} install$%, output
+    assert_contains_make_command '', output
+    assert_contains_make_command 'install', output
     assert_match %r%test\.txt%, output
   end
 
@@ -82,8 +82,8 @@ install (FILES test.txt DESTINATION bin) https://github.com/ruby/ruby/blob/trunk/test/rubygems/test_gem_ext_cmake_builder.rb#L82
 
     output = output.join "\n"
 
-    assert_match %r%^#{make_command}%,         output
-    assert_match %r%^#{make_command} install%, output
+    assert_contains_make_command '', output
+    assert_contains_make_command 'install', output
   end
 
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]