From fb82ba2f1c706c4e4a7ab9e359d084704d745f1a Mon Sep 17 00:00:00 2001 From: nagachika Date: Tue, 25 Jun 2013 17:55:32 +0000 Subject: merge revision(s) 41629: [Backport #8533] * 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] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@41635 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 ++++ lib/rubygems/ext/builder.rb | 11 +++-- lib/rubygems/test_case.rb | 58 +++++++++++++++++++++++++ test/rubygems/test_gem_ext_cmake_builder.rb | 8 ++-- test/rubygems/test_gem_ext_configure_builder.rb | 8 ++-- test/rubygems/test_gem_ext_ext_conf_builder.rb | 20 +++------ version.h | 6 +-- 7 files changed, 92 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index 576044e0b2..2f651897cd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Wed Jun 26 02:25:52 2013 Akinori MUSHA + + * 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 00:12:19 2013 Zachary Scott * array.c: Return value in Array overview example found by @PragTob diff --git a/lib/rubygems/ext/builder.rb b/lib/rubygems/ext/builder.rb index 9b6ad304a2..ab454b4ba1 100644 --- a/lib/rubygems/ext/builder.rb +++ b/lib/rubygems/ext/builder.rb @@ -23,9 +23,14 @@ class Gem::Ext::Builder 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 diff --git a/lib/rubygems/test_case.rb b/lib/rubygems/test_case.rb index 3da3173285..e92e5d868a 100644 --- a/lib/rubygems/test_case.rb +++ b/lib/rubygems/test_case.rb @@ -28,6 +28,7 @@ require 'rubygems/test_utilities' 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::TestCase 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 diff --git a/test/rubygems/test_gem_ext_cmake_builder.rb b/test/rubygems/test_gem_ext_cmake_builder.rb index 0e4f8fe0ff..24960144d7 100644 --- a/test/rubygems/test_gem_ext_cmake_builder.rb +++ b/test/rubygems/test_gem_ext_cmake_builder.rb @@ -38,8 +38,8 @@ install (FILES test.txt DESTINATION bin) 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) 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 diff --git a/test/rubygems/test_gem_ext_configure_builder.rb b/test/rubygems/test_gem_ext_configure_builder.rb index 65d31f61af..6137795111 100644 --- a/test/rubygems/test_gem_ext_configure_builder.rb +++ b/test/rubygems/test_gem_ext_configure_builder.rb @@ -30,9 +30,9 @@ class TestGemExtConfigureBuilder < Gem::TestCase 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::TestCase 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 diff --git a/test/rubygems/test_gem_ext_ext_conf_builder.rb b/test/rubygems/test_gem_ext_ext_conf_builder.rb index 734569583a..7c55626248 100644 --- a/test/rubygems/test_gem_ext_ext_conf_builder.rb +++ b/test/rubygems/test_gem_ext_ext_conf_builder.rb @@ -32,14 +32,8 @@ class TestGemExtExtConfBuilder < Gem::TestCase 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::TestCase 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::TestCase 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/m, error.message) 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 diff --git a/version.h b/version.h index 237f545e4a..5f91816d00 100644 --- a/version.h +++ b/version.h @@ -1,10 +1,10 @@ #define RUBY_VERSION "2.0.0" -#define RUBY_RELEASE_DATE "2013-06-25" -#define RUBY_PATCHLEVEL 241 +#define RUBY_RELEASE_DATE "2013-06-26" +#define RUBY_PATCHLEVEL 242 #define RUBY_RELEASE_YEAR 2013 #define RUBY_RELEASE_MONTH 6 -#define RUBY_RELEASE_DAY 25 +#define RUBY_RELEASE_DAY 26 #include "ruby/version.h" -- cgit v1.2.3