mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00

* spec/rubyspec/optional/capi/spec_helper.rb (compile_extension): `DESTDIR` is the drive letter of the ruby installed path as default on mswin, but not builddir of the ruby. this causes spec errors if the drive letter is different in the installed path and builddir. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59096 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
86 lines
2.5 KiB
Ruby
86 lines
2.5 KiB
Ruby
require File.expand_path('../../../spec_helper', __FILE__)
|
|
|
|
# MRI magic to use built but not installed ruby
|
|
$extmk = false
|
|
|
|
require 'rbconfig'
|
|
|
|
OBJDIR ||= File.expand_path("../../../ext/#{RUBY_ENGINE}/#{RUBY_VERSION}", __FILE__)
|
|
mkdir_p(OBJDIR)
|
|
|
|
def extension_path
|
|
File.expand_path("../ext", __FILE__)
|
|
end
|
|
|
|
def object_path
|
|
OBJDIR
|
|
end
|
|
|
|
def compile_extension(name)
|
|
debug = false
|
|
run_mkmf_in_process = RUBY_ENGINE == 'truffleruby'
|
|
|
|
ext = "#{name}_spec"
|
|
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("#{extension_path}/rubyspec.h") and
|
|
File.mtime(lib) > File.mtime("#{extension_path}/#{ext}.c") and
|
|
File.mtime(lib) > File.mtime(ruby_header) and
|
|
true # sentinel
|
|
|
|
# Copy needed source files to tmpdir
|
|
tmpdir = tmp("cext_#{name}")
|
|
Dir.mkdir(tmpdir)
|
|
begin
|
|
["rubyspec.h", "#{ext}.c"].each do |file|
|
|
cp "#{extension_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" +
|
|
"$ruby = ENV.values_at('RUBY_EXE', 'RUBY_FLAGS').join(' ')\n" +
|
|
# MRI magic to consider building non-bundled extensions
|
|
"$extout = nil\n" +
|
|
"create_makefile(#{ext.inspect})\n")
|
|
output = ruby_exe("extconf.rb")
|
|
raise "extconf failed:\n#{output}" unless $?.success?
|
|
$stderr.puts output if debug
|
|
end
|
|
|
|
make = RbConfig::CONFIG['host_os'].include?("mswin") ? "nmake" : "make"
|
|
ENV.delete "MAKEFLAGS" # Fix make warning when invoked with -j in MRI
|
|
|
|
# Do not capture stderr as we want to show compiler warnings
|
|
output = `#{make} V=1 DESTDIR=`
|
|
raise "#{make} failed:\n#{output}" unless $?.success?
|
|
$stderr.puts output if debug
|
|
|
|
cp File.basename(lib), lib
|
|
end
|
|
ensure
|
|
rm_r tmpdir
|
|
end
|
|
|
|
File.chmod(0755, lib)
|
|
lib
|
|
end
|
|
|
|
def load_extension(name)
|
|
require compile_extension(name)
|
|
rescue LoadError
|
|
if %r{/usr/sbin/execerror ruby "\(ld 3 1 main ([/a-zA-Z0-9_\-.]+_spec\.so)"} =~ $!.message
|
|
system('/usr/sbin/execerror', "#{RbConfig::CONFIG["bindir"]}/ruby", "(ld 3 1 main #{$1}")
|
|
end
|
|
raise
|
|
end
|
|
|
|
# Constants
|
|
CAPI_SIZEOF_LONG = [0].pack('l!').size
|