1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/rubyspec/optional/capi/spec_helper.rb
usa 285f139076 Clear DESTDIR when running make
* 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
2017-06-15 14:04:29 +00:00

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