[前][次][番号順一覧][スレッド一覧]

ruby-changes:46832

From: naruse <ko1@a...>
Date: Mon, 29 May 2017 01:40:17 +0900 (JST)
Subject: [ruby-changes:46832] naruse:r58947 (trunk): Revert "Update to ruby/spec@2a047c8"

naruse	2017-05-29 01:40:12 +0900 (Mon, 29 May 2017)

  New Revision: 58947

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=58947

  Log:
    Revert "Update to ruby/spec@2a047c8"
    
    This reverts commit 2531a1013b56a030f99ea4c2ee36e66dbf38a855.

  Modified files:
    trunk/spec/rubyspec/optional/capi/module_spec.rb
    trunk/spec/rubyspec/optional/capi/spec_helper.rb
Index: spec/rubyspec/optional/capi/module_spec.rb
===================================================================
--- spec/rubyspec/optional/capi/module_spec.rb	(revision 58946)
+++ spec/rubyspec/optional/capi/module_spec.rb	(revision 58947)
@@ -62,18 +62,16 @@ describe "CApiModule" do https://github.com/ruby/ruby/blob/trunk/spec/rubyspec/optional/capi/module_spec.rb#L62
       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
Index: spec/rubyspec/optional/capi/spec_helper.rb
===================================================================
--- spec/rubyspec/optional/capi/spec_helper.rb	(revision 58946)
+++ spec/rubyspec/optional/capi/spec_helper.rb	(revision 58947)
@@ -1,4 +1,5 @@ https://github.com/ruby/ruby/blob/trunk/spec/rubyspec/optional/capi/spec_helper.rb#L1
 require File.expand_path('../../../spec_helper', __FILE__)
+$extmk = false
 
 require 'rbconfig'
 
@@ -14,59 +15,130 @@ def object_path https://github.com/ruby/ruby/blob/trunk/spec/rubyspec/optional/capi/spec_helper.rb#L15
 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
-
-      Dir.glob("*.#{RbConfig::CONFIG['DLEXT']}") do |file|
-        cp file, "#{object_path}/#{file}"
+      required = require 'mkmf'
+      # Reinitialize mkmf if already required
+      init_mkmf unless required
+      create_makefile(ext, tmpdir)
+      system "make"
+
+      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
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]