mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			229 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			229 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| require_relative "helper"
 | |
| require "rubygems/ext"
 | |
| 
 | |
| class TestGemExtExtConfBuilder < Gem::TestCase
 | |
|   def setup
 | |
|     super
 | |
| 
 | |
|     @ext = File.join @tempdir, "ext"
 | |
|     @dest_path = File.join @tempdir, "prefix"
 | |
| 
 | |
|     FileUtils.mkdir_p @ext
 | |
|     FileUtils.mkdir_p @dest_path
 | |
|   end
 | |
| 
 | |
|   def test_class_build
 | |
|     if java_platform?
 | |
|       pend("failing on jruby")
 | |
|     end
 | |
| 
 | |
|     if vc_windows? && !nmake_found?
 | |
|       pend("test_class_build skipped - nmake not found")
 | |
|     end
 | |
| 
 | |
|     File.open File.join(@ext, "extconf.rb"), "w" do |extconf|
 | |
|       extconf.puts "require 'mkmf'\ncreate_makefile 'foo'"
 | |
|     end
 | |
| 
 | |
|     output = []
 | |
| 
 | |
|     result = Gem::Ext::ExtConfBuilder.build "extconf.rb", @dest_path, output, [], nil, @ext
 | |
| 
 | |
|     assert_same result, output
 | |
| 
 | |
|     assert_match(/^current directory:/, output[0])
 | |
|     assert_match(/^#{Gem.ruby}.* extconf.rb/, output[1])
 | |
|     assert_equal "creating Makefile\n", output[2]
 | |
|     assert_match(/^current directory:/, output[3])
 | |
|     assert_contains_make_command "clean", output[4]
 | |
|     assert_contains_make_command "", output[7]
 | |
|     assert_contains_make_command "install", output[10]
 | |
|     assert_empty Dir.glob(File.join(@ext, "siteconf*.rb"))
 | |
|     assert_empty Dir.glob(File.join(@ext, ".gem.*"))
 | |
|   end
 | |
| 
 | |
|   def test_class_build_rbconfig_make_prog
 | |
|     if java_platform?
 | |
|       pend("failing on jruby")
 | |
|     end
 | |
| 
 | |
|     configure_args do
 | |
|       File.open File.join(@ext, "extconf.rb"), "w" do |extconf|
 | |
|         extconf.puts "require 'mkmf'\ncreate_makefile 'foo'"
 | |
|       end
 | |
| 
 | |
|       output = []
 | |
| 
 | |
|       Gem::Ext::ExtConfBuilder.build "extconf.rb", @dest_path, output, [], nil, @ext
 | |
| 
 | |
|       assert_equal "creating Makefile\n", output[2]
 | |
|       assert_contains_make_command "clean", output[4]
 | |
|       assert_contains_make_command "", output[7]
 | |
|       assert_contains_make_command "install", output[10]
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def test_class_build_env_MAKE
 | |
|     env_make = ENV.delete "make"
 | |
|     ENV["make"] = nil
 | |
| 
 | |
|     env_MAKE = ENV.delete "MAKE"
 | |
|     ENV["MAKE"] = "anothermake"
 | |
| 
 | |
|     if java_platform?
 | |
|       pend("failing on jruby")
 | |
|     end
 | |
| 
 | |
|     configure_args "" do
 | |
|       File.open File.join(@ext, "extconf.rb"), "w" do |extconf|
 | |
|         extconf.puts "require 'mkmf'\ncreate_makefile 'foo'"
 | |
|       end
 | |
| 
 | |
|       output = []
 | |
| 
 | |
|       assert_raise Gem::InstallError do
 | |
|         Gem::Ext::ExtConfBuilder.build "extconf.rb", @dest_path, output, [], nil, @ext
 | |
|       end
 | |
| 
 | |
|       assert_equal "creating Makefile\n",   output[2]
 | |
|       assert_contains_make_command "clean", output[4]
 | |
|     end
 | |
|   ensure
 | |
|     ENV["MAKE"] = env_MAKE
 | |
|     ENV["make"] = env_make
 | |
|   end
 | |
| 
 | |
|   def test_class_build_extconf_fail
 | |
|     if vc_windows? && !nmake_found?
 | |
|       pend("test_class_build_extconf_fail skipped - nmake not found")
 | |
|     end
 | |
| 
 | |
|     File.open File.join(@ext, "extconf.rb"), "w" do |extconf|
 | |
|       extconf.puts "require 'mkmf'"
 | |
|       extconf.puts "have_library 'nonexistent' or abort 'need libnonexistent'"
 | |
|       extconf.puts "create_makefile 'foo'"
 | |
|     end
 | |
| 
 | |
|     output = []
 | |
| 
 | |
|     error = assert_raise Gem::InstallError do
 | |
|       Gem::Ext::ExtConfBuilder.build "extconf.rb", @dest_path, output, [], nil, @ext
 | |
|     end
 | |
| 
 | |
|     assert_equal "extconf failed, exit code 1", error.message
 | |
| 
 | |
|     assert_match(/^#{Gem.ruby}.* extconf.rb/, output[1])
 | |
|     assert_match(File.join(@dest_path, "mkmf.log"), output[4])
 | |
|     assert_includes(output, "To see why this extension failed to compile, please check the mkmf.log which can be found here:\n")
 | |
| 
 | |
|     assert_path_exist File.join @dest_path, "mkmf.log"
 | |
|   end
 | |
| 
 | |
|   def test_class_build_extconf_success_without_warning
 | |
|     if vc_windows? && !nmake_found?
 | |
|       pend("test_class_build_extconf_fail skipped - nmake not found")
 | |
|     end
 | |
| 
 | |
|     File.open File.join(@ext, "extconf.rb"), "w" do |extconf|
 | |
|       extconf.puts "require 'mkmf'"
 | |
|       extconf.puts "File.open('mkmf.log', 'w'){|f| f.write('a')}"
 | |
|       extconf.puts "create_makefile 'foo'"
 | |
|     end
 | |
| 
 | |
|     output = []
 | |
| 
 | |
|     Gem::Ext::ExtConfBuilder.build "extconf.rb", @dest_path, output, [], nil, @ext
 | |
| 
 | |
|     refute_includes(output, "To see why this extension failed to compile, please check the mkmf.log which can be found here:\n")
 | |
| 
 | |
|     assert_path_exist File.join @dest_path, "mkmf.log"
 | |
|   end
 | |
| 
 | |
|   def test_class_build_unconventional
 | |
|     if vc_windows? && !nmake_found?
 | |
|       pend("test_class_build skipped - nmake not found")
 | |
|     end
 | |
| 
 | |
|     File.open File.join(@ext, "extconf.rb"), "w" do |extconf|
 | |
|       extconf.puts <<-'EXTCONF'
 | |
| include RbConfig
 | |
| 
 | |
| ruby =
 | |
|   if ENV['RUBY'] then
 | |
|     ENV['RUBY']
 | |
|   else
 | |
|     ruby_exe = "#{CONFIG['RUBY_INSTALL_NAME']}#{CONFIG['EXEEXT']}"
 | |
|     File.join CONFIG['bindir'], ruby_exe
 | |
|   end
 | |
| 
 | |
| open 'Makefile', 'w' do |io|
 | |
|   io.write <<-Makefile
 | |
| clean: ruby
 | |
| all: ruby
 | |
| install: ruby
 | |
| 
 | |
| ruby:
 | |
| \t#{ruby} -e0
 | |
| 
 | |
|   Makefile
 | |
| end
 | |
|       EXTCONF
 | |
|     end
 | |
| 
 | |
|     output = []
 | |
| 
 | |
|     Gem::Ext::ExtConfBuilder.build "extconf.rb", @dest_path, output, [], nil, @ext
 | |
| 
 | |
|     assert_contains_make_command "clean", output[4]
 | |
|     assert_contains_make_command "", output[7]
 | |
|     assert_contains_make_command "install", output[10]
 | |
|     assert_empty Dir.glob(File.join(@ext, "siteconf*.rb"))
 | |
|   end
 | |
| 
 | |
|   def test_class_make
 | |
|     if vc_windows? && !nmake_found?
 | |
|       pend("test_class_make skipped - nmake not found")
 | |
|     end
 | |
| 
 | |
|     output = []
 | |
|     makefile_path = File.join(@ext, "Makefile")
 | |
|     File.open makefile_path, "w" do |makefile|
 | |
|       makefile.puts "# π"
 | |
|       makefile.puts "RUBYARCHDIR = $(foo)$(target_prefix)"
 | |
|       makefile.puts "RUBYLIBDIR = $(bar)$(target_prefix)"
 | |
|       makefile.puts "clean:"
 | |
|       makefile.puts "all:"
 | |
|       makefile.puts "install:"
 | |
|     end
 | |
| 
 | |
|     Gem::Ext::ExtConfBuilder.make @ext, output, @ext
 | |
| 
 | |
|     assert_contains_make_command "clean", output[1]
 | |
|     assert_contains_make_command "", output[4]
 | |
|     assert_contains_make_command "install", output[7]
 | |
|   end
 | |
| 
 | |
|   def test_class_make_no_Makefile
 | |
|     error = assert_raise Gem::InstallError do
 | |
|       Gem::Ext::ExtConfBuilder.make @ext, ["output"], @ext
 | |
|     end
 | |
| 
 | |
|     assert_equal "Makefile not found", error.message
 | |
|   end
 | |
| 
 | |
|   def configure_args(args = nil)
 | |
|     configure_args = RbConfig::CONFIG["configure_args"]
 | |
|     RbConfig::CONFIG["configure_args"] = args if args
 | |
| 
 | |
|     yield
 | |
| 
 | |
|   ensure
 | |
|     if configure_args
 | |
|       RbConfig::CONFIG["configure_args"] = configure_args
 | |
|     else
 | |
|       RbConfig::CONFIG.delete "configure_args"
 | |
|     end
 | |
|   end
 | |
| end
 | 
