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

ruby-changes:36844

From: nobu <ko1@a...>
Date: Tue, 23 Dec 2014 15:22:02 +0900 (JST)
Subject: [ruby-changes:36844] nobu:r48925 (trunk): extconf.rb: libffi on mswin

nobu	2014-12-23 15:21:49 +0900 (Tue, 23 Dec 2014)

  New Revision: 48925

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

  Log:
    extconf.rb: libffi on mswin
    
    * ext/fiddle/extconf.rb: try to compile libffi as mingw on mswin
      if possible.

  Modified files:
    trunk/ext/fiddle/extconf.rb
Index: ext/fiddle/extconf.rb
===================================================================
--- ext/fiddle/extconf.rb	(revision 48924)
+++ ext/fiddle/extconf.rb	(revision 48925)
@@ -23,6 +23,7 @@ begin https://github.com/ruby/ruby/blob/trunk/ext/fiddle/extconf.rb#L23
     raise "missing libffi. Please install libffi."
   end
 
+  srcdir = "#{$srcdir}/#{ver}"
   ffi_header = 'ffi.h'
   libffi = Struct.new(*%I[dir srcdir builddir include lib a cflags ldflags opt arch]).new
   libffi.dir = ver
@@ -31,31 +32,55 @@ begin https://github.com/ruby/ruby/blob/trunk/ext/fiddle/extconf.rb#L32
     libffi.srcdir = "."
   else
     libffi.builddir = libffi.dir
-    libffi.srcdir = relative_from("#{$srcdir}/#{ver}", "..")
+    libffi.srcdir = relative_from(srcdir, "..")
   end
   libffi.include = "#{libffi.builddir}/include"
   libffi.lib = "#{libffi.builddir}/.libs"
   libffi.a = "#{libffi.lib}/libffi.#{$LIBEXT}"
-  libffi.cflags = RbConfig.expand("$(CFLAGS)", CONFIG.merge("warnflags"=>""))
+  nowarn = CONFIG.merge("warnflags"=>"")
+  libffi.cflags = RbConfig.expand("$(CFLAGS)", nowarn)
   ver = ver[/libffi-(.*)/, 1]
 
   FileUtils.mkdir_p(libffi.dir)
   libffi.opt = CONFIG['configure_args'][/'(-C)'/, 1]
   libffi.ldflags = RbConfig.expand("$(LDFLAGS) #{libpathflag([relative_from($topdir, "..")])} #{$LIBRUBYARG}")
   libffi.arch = RbConfig::CONFIG['host']
+  if $mswin
+    $defs << "-DFFI_BUILDING"
+    libffi.opt = '-C'
+    cc = "#{libffi.srcdir}/msvcc.sh"
+    libffi.arch = libffi.arch.sub(/mswin\d+(_\d+)?\z/, 'mingw32')
+    cc << (libffi.arch.sub!(/^x64/, 'x86_64') ? " -m64" : " -m32")
+    libffi.ldflags = ''
+    cxx = cc
+    ld = "link"
+    cpp = "cl -nologo -EP"
+  else
+    cc = RbConfig::CONFIG['CC']
+    ld = RbConfig::CONFIG['LD']
+  end
   args = %W[
-    #{libffi.srcdir}/configure #{libffi.opt}
-    --disable-shared
-    --host=#{libffi.arch} --enable-builddir=#{RUBY_PLATFORM}
-      CC=#{RbConfig::CONFIG['CC']} CFLAGS=#{libffi.cflags}
-      LD=#{RbConfig::CONFIG['LD']} LDFLAGS=#{libffi.ldflags}
+    sh #{libffi.srcdir}/configure
+    --disable-shared --host=#{libffi.arch}
+    --enable-builddir=#{RUBY_PLATFORM}
+  ]
+  args << libffi.opt if libffi.opt
+  args.concat %W[
+      CC=#{cc} CFLAGS=#{libffi.cflags}
+      CXX=#{cxx} CXXFLAGS=#{RbConfig.expand("$(CXXFLAGS)", nowarn)}
+      LD=#{ld} LDFLAGS=#{libffi.ldflags}
+      CPP=#{cpp}
   ]
 
+  FileUtils.rm_f("#{libffi.include}/ffitarget.h")
   Logging::open do
     Logging.message("%p in %s\n", args, libffi.dir)
     system(*args, chdir: libffi.dir) or
       raise "failed to configure libffi. Please install libffi."
   end
+  unless File.file?("#{libffi.include}/ffitarget.h")
+    FileUtils.cp("#{srcdir}/src/x86/ffitarget.h", libffi.include, preserve: true)
+  end
   $INCFLAGS << " -I" << libffi.include
 end
 
@@ -103,7 +128,9 @@ if libffi https://github.com/ruby/ruby/blob/trunk/ext/fiddle/extconf.rb#L128
 end
 create_makefile 'fiddle' do |conf|
   next conf unless libffi
-  if $gnumake
+  if $mswin
+    submake = "make -C $(LIBFFI_DIR)\n"
+  elsif $gnumake
     submake = "$(MAKE) -C $(LIBFFI_DIR)\n"
   else
     submake = "cd $(LIBFFI_DIR) && \\\n\t\t" << "#{config_string("exec")} $(MAKE)".strip

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

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