summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-28 16:40:12 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-28 16:40:12 +0000
commitdd0148007f66f6b44419501bc053914f8cb98392 (patch)
tree71ee9e730c86d2974fb4e430554b39a45d7a34a2 /spec
parent5fcbdd3d9eba4911d1754747503575dd3f5fb084 (diff)
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
Diffstat (limited to 'spec')
-rw-r--r--spec/rubyspec/optional/capi/module_spec.rb8
-rw-r--r--spec/rubyspec/optional/capi/spec_helper.rb138
2 files changed, 108 insertions, 38 deletions
diff --git a/spec/rubyspec/optional/capi/module_spec.rb b/spec/rubyspec/optional/capi/module_spec.rb
index 23fb674f0e..1c21ad2e7c 100644
--- a/spec/rubyspec/optional/capi/module_spec.rb
+++ b/spec/rubyspec/optional/capi/module_spec.rb
@@ -62,18 +62,16 @@ 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
+ it "defines a module for an existing Autoload with an extension" do
compile_extension("module_under_autoload")
- end
- it "defines a module for an existing Autoload with an extension" do
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 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