From 2531a1013b56a030f99ea4c2ee36e66dbf38a855 Mon Sep 17 00:00:00 2001 From: eregon Date: Sun, 28 May 2017 11:30:42 +0000 Subject: [PATCH] Update to ruby/spec@2a047c8 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58939 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- spec/rubyspec/optional/capi/module_spec.rb | 10 +- spec/rubyspec/optional/capi/spec_helper.rb | 142 +++++---------------- 2 files changed, 41 insertions(+), 111 deletions(-) diff --git a/spec/rubyspec/optional/capi/module_spec.rb b/spec/rubyspec/optional/capi/module_spec.rb index 1c21ad2e7c..23fb674f0e 100644 --- a/spec/rubyspec/optional/capi/module_spec.rb +++ b/spec/rubyspec/optional/capi/module_spec.rb @@ -62,16 +62,18 @@ describe "CApiModule" do mod = @m.rb_define_module_under(CApiModuleSpecs, "ModuleSpecsModuleUnder2") mod.name.should == "CApiModuleSpecs::ModuleSpecsModuleUnder2" end + end + + describe "rb_define_module_under" do + before :each do + compile_extension("module_under_autoload") + end it "defines a module for an existing Autoload with an extension" do - compile_extension("module_under_autoload") - CApiModuleSpecs::ModuleUnderAutoload.name.should == "CApiModuleSpecs::ModuleUnderAutoload" end it "defines a module for an existing Autoload with a ruby object" do - compile_extension("module_under_autoload") - CApiModuleSpecs::RubyUnderAutoload.name.should == "CApiModuleSpecs::RubyUnderAutoload" end end diff --git a/spec/rubyspec/optional/capi/spec_helper.rb b/spec/rubyspec/optional/capi/spec_helper.rb index 2a0c515306..7e043f80b5 100644 --- a/spec/rubyspec/optional/capi/spec_helper.rb +++ b/spec/rubyspec/optional/capi/spec_helper.rb @@ -1,5 +1,4 @@ require File.expand_path('../../../spec_helper', __FILE__) -$extmk = false require 'rbconfig' @@ -15,130 +14,59 @@ def object_path end def compile_extension(name) - preloadenv = RbConfig::CONFIG["PRELOADENV"] || "LD_PRELOAD" - preload, ENV[preloadenv] = ENV[preloadenv], nil if preloadenv + debug = false + run_mkmf_in_process = false - path = extension_path - objdir = object_path - - # TODO use rakelib/ext_helper.rb? - arch_hdrdir = nil - - if RUBY_NAME == 'rbx' - hdrdir = RbConfig::CONFIG["rubyhdrdir"] - elsif RUBY_NAME =~ /^ruby/ - hdrdir = RbConfig::CONFIG["rubyhdrdir"] - arch_hdrdir = RbConfig::CONFIG["rubyarchhdrdir"] - elsif RUBY_NAME == 'jruby' - require 'mkmf' - hdrdir = $hdrdir - elsif RUBY_NAME == "maglev" - require 'mkmf' - hdrdir = $hdrdir - elsif RUBY_NAME == 'truffleruby' - return compile_truffleruby_extconf_make(name, path, objdir) - else - raise "Don't know how to build C extensions with #{RUBY_NAME}" + if RUBY_NAME == 'truffleruby' + run_mkmf_in_process = true end - ext = "#{name}_spec" - source = File.join(path, "#{ext}.c") - obj = File.join(objdir, "#{ext}.#{RbConfig::CONFIG['OBJEXT']}") - lib = File.join(objdir, "#{ext}.#{RbConfig::CONFIG['DLEXT']}") - - ruby_header = File.join(hdrdir, "ruby.h") - rubyspec_header = File.join(path, "rubyspec.h") - - return lib if File.exist?(lib) and File.mtime(lib) > File.mtime(source) and - File.mtime(lib) > File.mtime(ruby_header) and - File.mtime(lib) > File.mtime(rubyspec_header) and - true # sentinel - - # avoid problems where compilation failed but previous shlib exists - File.delete lib if File.exist? lib - - cc = RbConfig::CONFIG["CC"] - cflags = (ENV["CFLAGS"] || RbConfig::CONFIG["CFLAGS"]).dup - cflags += " #{RbConfig::CONFIG["ARCH_FLAG"]}" if RbConfig::CONFIG["ARCH_FLAG"] - cflags += " #{RbConfig::CONFIG["CCDLFLAGS"]}" if RbConfig::CONFIG["CCDLFLAGS"] - cppflags = (ENV["CPPFLAGS"] || RbConfig::CONFIG["CPPFLAGS"]).dup - incflags = "-I#{path}" - incflags << " -I#{arch_hdrdir}" if arch_hdrdir - incflags << " -I#{hdrdir}" - csrcflag = RbConfig::CONFIG["CSRCFLAG"] - coutflag = RbConfig::CONFIG["COUTFLAG"] - - compile_cmd = "#{cc} #{incflags} #{cflags} #{cppflags} #{coutflag}#{obj} -c #{csrcflag}#{source}" - output = `#{compile_cmd}` - - unless $?.success? and File.exist?(obj) - puts "\nERROR:\n#{compile_cmd}\n#{output}" - puts "incflags=#{incflags}" - puts "cflags=#{cflags}" - puts "cppflags=#{cppflags}" - raise "Unable to compile \"#{source}\"" - end - - ldshared = RbConfig::CONFIG["LDSHARED"] - ldshared += " #{RbConfig::CONFIG["ARCH_FLAG"]}" if RbConfig::CONFIG["ARCH_FLAG"] - libs = RbConfig::CONFIG["LIBS"] - dldflags = "#{RbConfig::CONFIG["LDFLAGS"]} #{RbConfig::CONFIG["DLDFLAGS"]} #{RbConfig::CONFIG["EXTDLDFLAGS"]}" - dldflags.sub!(/-Wl,-soname,\S+/, '') - - if /mswin/ =~ RUBY_PLATFORM - dldflags.sub!("$(LIBPATH)", RbConfig::CONFIG["LIBPATHFLAG"] % path) - libs += RbConfig::CONFIG["LIBRUBY"] - outflag = RbConfig::CONFIG["OUTFLAG"] - - link_cmd = "#{ldshared} #{outflag}#{lib} #{obj} #{libs} -link #{dldflags} /export:Init_#{ext}" - else - libpath = "-L#{path}" - dldflags.sub!("$(TARGET_ENTRY)", "Init_#{ext}") - - link_cmd = "#{ldshared} #{obj} #{libpath} #{dldflags} #{libs} -o #{lib}" - end - output = `#{link_cmd}` - - unless $?.success? - puts "\nERROR:\n#{link_cmd}\n#{output}" - raise "Unable to link \"#{source}\"" - end - - lib -ensure - ENV[preloadenv] = preload if preloadenv -end - -def compile_truffleruby_extconf_make(name, path, objdir) ext = "#{name}_spec" - file = "#{ext}.c" - source = "#{path}/#{ext}.c" - lib = "#{objdir}/#{ext}.#{RbConfig::CONFIG['DLEXT']}" + source = "#{extension_path}/#{ext}.c" + lib = "#{object_path}/#{ext}.#{RbConfig::CONFIG['DLEXT']}" + ruby_header = "#{RbConfig::CONFIG['rubyhdrdir']}/ruby.h" + + return lib if File.exist?(lib) and + File.mtime(lib) > File.mtime(source) and + File.mtime(lib) > File.mtime(ruby_header) and + File.mtime(lib) > File.mtime("#{extension_path}/rubyspec.h") and + true # sentinel # Copy needed source files to tmpdir tmpdir = tmp("cext_#{name}") - Dir.mkdir tmpdir + Dir.mkdir(tmpdir) begin - ["rubyspec.h", "truffleruby.h", "#{ext}.c"].each do |file| - cp "#{path}/#{file}", "#{tmpdir}/#{file}" + ["jruby.h", "rubinius.h", "truffleruby.h", "rubyspec.h", "#{ext}.c"].each do |file| + cp "#{extension_path}/#{file}", "#{tmpdir}/#{file}" end Dir.chdir(tmpdir) do - required = require 'mkmf' - # Reinitialize mkmf if already required - init_mkmf unless required - create_makefile(ext, tmpdir) - system "make" + if run_mkmf_in_process + required = require 'mkmf' + # Reinitialize mkmf if already required + init_mkmf unless required + create_makefile(ext, tmpdir) + else + File.write("extconf.rb", "require 'mkmf'\n" + + "create_makefile(#{ext.inspect})\n") + output = ruby_exe("extconf.rb") + raise "extconf failed:\n#{output}" unless $?.success? + $stderr.puts output if debug + end - copy_exts = RbConfig::CONFIG.values_at('OBJEXT', 'DLEXT') - Dir.glob("*.{#{copy_exts.join(',')}}") do |file| - cp file, "#{objdir}/#{file}" + output = `make V=1 TARGET_SO_DIR=./` + raise "make failed:\n#{output}" unless $?.success? + $stderr.puts output if debug + + Dir.glob("*.#{RbConfig::CONFIG['DLEXT']}") do |file| + cp file, "#{object_path}/#{file}" end end ensure rm_r tmpdir end + File.chmod(0755, lib) lib end