From dd0148007f66f6b44419501bc053914f8cb98392 Mon Sep 17 00:00:00 2001 From: naruse Date: Sun, 28 May 2017 16:40:12 +0000 Subject: Revert "Update to ruby/spec@2a047c8" This reverts commit 2531a1013b56a030f99ea4c2ee36e66dbf38a855. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58947 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- spec/rubyspec/optional/capi/spec_helper.rb | 138 ++++++++++++++++++++++------- 1 file changed, 105 insertions(+), 33 deletions(-) (limited to 'spec/rubyspec/optional/capi/spec_helper.rb') diff --git a/spec/rubyspec/optional/capi/spec_helper.rb b/spec/rubyspec/optional/capi/spec_helper.rb index 7e043f80b5..2a0c515306 100644 --- a/spec/rubyspec/optional/capi/spec_helper.rb +++ b/spec/rubyspec/optional/capi/spec_helper.rb @@ -1,4 +1,5 @@ require File.expand_path('../../../spec_helper', __FILE__) +$extmk = false require 'rbconfig' @@ -14,59 +15,130 @@ def object_path end def compile_extension(name) - debug = false - run_mkmf_in_process = false + preloadenv = RbConfig::CONFIG["PRELOADENV"] || "LD_PRELOAD" + preload, ENV[preloadenv] = ENV[preloadenv], nil if preloadenv - if RUBY_NAME == 'truffleruby' - run_mkmf_in_process = true + 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}" end - ext = "#{name}_spec" - source = "#{extension_path}/#{ext}.c" - lib = "#{object_path}/#{ext}.#{RbConfig::CONFIG['DLEXT']}" - ruby_header = "#{RbConfig::CONFIG['rubyhdrdir']}/ruby.h" + 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']}") - return lib if File.exist?(lib) and - File.mtime(lib) > File.mtime(source) and + 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("#{extension_path}/rubyspec.h") 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']}" + # Copy needed source files to tmpdir tmpdir = tmp("cext_#{name}") - Dir.mkdir(tmpdir) + Dir.mkdir tmpdir begin - ["jruby.h", "rubinius.h", "truffleruby.h", "rubyspec.h", "#{ext}.c"].each do |file| - cp "#{extension_path}/#{file}", "#{tmpdir}/#{file}" + ["rubyspec.h", "truffleruby.h", "#{ext}.c"].each do |file| + cp "#{path}/#{file}", "#{tmpdir}/#{file}" end Dir.chdir(tmpdir) do - 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 - - output = `make V=1 TARGET_SO_DIR=./` - raise "make failed:\n#{output}" unless $?.success? - $stderr.puts output if debug + required = require 'mkmf' + # Reinitialize mkmf if already required + init_mkmf unless required + create_makefile(ext, tmpdir) + system "make" - Dir.glob("*.#{RbConfig::CONFIG['DLEXT']}") do |file| - cp file, "#{object_path}/#{file}" + copy_exts = RbConfig::CONFIG.values_at('OBJEXT', 'DLEXT') + Dir.glob("*.{#{copy_exts.join(',')}}") do |file| + cp file, "#{objdir}/#{file}" end end ensure rm_r tmpdir end - File.chmod(0755, lib) lib end -- cgit v1.2.3