MinGW Cross Compile on Ubuntu > Ruby Library

Ruby Library のクロス ビルド


Continuous Integration のために Ruby Library を MinGW クロス ビルドします。

はじめに


Ruby はクロス プラットフォームで動作する軽量言語です。 Ruby Library もクロス プラットフォームで動作するよう考慮されています。

しかしながら、一部のライブラリーでは対応が不充分で、 Windows で機能が制約されていたり、動作しないことがあります。ビルドできないこともあります。ビルドにパッチや工夫が必要になることもあります。

クロス プラットフォームの深奥を覗き込むには僕の知識と技術が足りません。それでも可能なことはあります。

Windows での Ruby Library の利用に関して、パッチや工夫を必要とせずビルドできること、およびバイナリーの提供を、実行/確認しやすくするために、 MinGW クロス ビルドを試みます。

Ruby Header


クロス コンパイルに使用するヘッダー等を用意します。ここでは Active Script Ruby 同梱のヘッダーを使用します。 1.8.7 と 1.9.2 について説明します。

Active Script Ruby 1.8.7-p330-1.8.7.35


レイアウトは次のようにしています。 rbconfig.rb の位置を変えてます。

asr187
│  ruby
│
└─lib
    │  *.a
    │  *.lib
    │
    └─ruby
        └─1.8
            │  mkmf.rb
            │  rbconfig.rb
            │
            └─i386-mswin32
                │  *.h
                │
                └─win32
                        *.h
ruby

クロス コンパイルで ruby を実行する場合に使用します。たとえば extconf.rb の実行で使います。

asr187 ディレクトリー直下に置いた sh ファイルです。 chmod u+x を忘れずに。

#!/bin/sh
__ruby=`which ruby`
__ruby_load=`dirname $0`/lib/ruby/1.8
"${__ruby}" -v -I "${__ruby_load}" "$@"
libmsvcrt-ruby18.a

こちらを memo - MinGW Cross Compile on Ubuntu 参照してください。

pexports msvcrt-ruby18.dll | sed "s/^_//" > msvcrt-ruby18.def
dlltool -d msvcrt-ruby18.def -l libmsvcrt-ruby18.a
config.h

asr187/lib/ruby/1.8/i386-mswin32/config.h を書き換えます。ファイル先頭の #error 行をコメントアウトします。
mkmf.rb.patch

--- asr187.orig/lib/ruby/1.8.mkmf.rb
+++ asr187/lib/ruby/1.8.mkmf.rb
@@ -1,7 +1,7 @@
 # module to create Makefile for extension modules
 # invoke like: ruby -r mkmf extconf.rb
 
-require 'rbconfig'
+require File.join(File.dirname(__FILE__), 'rbconfig')
 require 'fileutils'
 require 'shellwords'
 
@@ -319,7 +319,8 @@
                               'LDFLAGS' => "#$LDFLAGS #{ldflags}",
                               'LIBPATH' => libpathflag(libpath),
                               'LOCAL_LIBS' => "#$LOCAL_LIBS #$libs",
-                              'LIBS' => "#$LIBRUBYARG_STATIC #{opt} #$LIBS")
+#                              'LIBS' => "#$LIBRUBYARG_STATIC #{opt} #$LIBS")
+                              'LIBS' => "#$LIBRUBYARG_SHARED #{opt} #$LIBS")
   Config::expand(TRY_LINK.dup, conf)
 end
 
rbconfig.rb.patch

--- asr187.orig/lib/ruby/1.8/rbconfig.rb
+++ asr187/lib/ruby/1.8/rbconfig.rb
@@ -4,9 +4,10 @@
 
 module Config
   RUBY_VERSION == "1.8.7" or
-    raise "ruby lib version (1.8.7) doesn't match executable version (#{RUBY_VERSION})"
+    STDERR.puts "ruby lib version (1.8.7) doesn't match executable version (#{RUBY_VERSION})"
 
-  TOPDIR = File.dirname(__FILE__).chomp!("/lib/ruby/1.8/i386-mswin32")
+#  TOPDIR = File.dirname(__FILE__).chomp!("/lib/ruby/1.8/i386-mswin32")
+  TOPDIR = File.dirname(__FILE__).chomp!("/lib/ruby/1.8")
   DESTDIR = TOPDIR && TOPDIR[/\A[a-z]:/i] || '' unless defined? DESTDIR
   CONFIG = {}
   CONFIG["DESTDIR"] = DESTDIR
@@ -16,18 +17,24 @@
   CONFIG["PATCHLEVEL"] = "330"
   CONFIG["prefix"] = (TOPDIR || DESTDIR + "")
   CONFIG["EXEEXT"] = ".exe"
-  CONFIG["ruby_install_name"] = "ruby"
-  CONFIG["RUBY_INSTALL_NAME"] = "ruby"
+#  CONFIG["ruby_install_name"] = "ruby"
+#  CONFIG["RUBY_INSTALL_NAME"] = "ruby"
+  CONFIG["ruby_install_name"] = File.join(CONFIG["prefix"], "ruby")
+  CONFIG["RUBY_INSTALL_NAME"] = CONFIG["ruby_install_name"]
   CONFIG["RUBY_SO_NAME"] = "msvcrt-ruby18"
   CONFIG["SHELL"] = "$(COMSPEC)"
-  CONFIG["BUILD_FILE_SEPARATOR"] = "\\"
-  CONFIG["PATH_SEPARATOR"] = ";"
-  CONFIG["CFLAGS"] = "-MD -Zi  -O2b2xg- -G6"
+#  CONFIG["BUILD_FILE_SEPARATOR"] = "\\"
+  CONFIG["BUILD_FILE_SEPARATOR"] = "/"
+#  CONFIG["PATH_SEPARATOR"] = ";"
+  CONFIG["PATH_SEPARATOR"] = ":"
+#  CONFIG["CFLAGS"] = "-MD -Zi  -O2b2xg- -G6"
+  CONFIG["CFLAGS"] = "-g  -O2 -pipe -mtune=pentium3 -fomit-frame-pointer"
   CONFIG["CPPFLAGS"] = "   "
   CONFIG["CXXFLAGS"] = ""
   CONFIG["FFLAGS"] = ""
   CONFIG["LDFLAGS"] = ""
-  CONFIG["LIBS"] = "oldnames.lib user32.lib advapi32.lib shell32.lib ws2_32.lib "
+#  CONFIG["LIBS"] = "oldnames.lib user32.lib advapi32.lib shell32.lib ws2_32.lib "
+  CONFIG["LIBS"] = "-luser32 -ladvapi32 -lshell32 -lws2_32 "
   CONFIG["exec_prefix"] = "$(prefix)"
   CONFIG["bindir"] = "$(exec_prefix)/bin"
   CONFIG["sbindir"] = "$(exec_prefix)/sbin"
@@ -56,26 +63,36 @@
   CONFIG["target_cpu"] = "i386"
   CONFIG["target_vendor"] = "pc"
   CONFIG["target_os"] = "mswin32"
-  CONFIG["CC"] = "cl -nologo"
-  CONFIG["CPP"] = "cl -nologo -E"
+#  CONFIG["CC"] = "cl -nologo"
+  CONFIG["CC"] = "gcc"
+#  CONFIG["CPP"] = "cl -nologo -E"
+  CONFIG["CPP"] = "gcc -E"
   CONFIG["YACC"] = "byacc"
   CONFIG["RANLIB"] = ""
-  CONFIG["AR"] = "lib -nologo"
-  CONFIG["ARFLAGS"] = "-machine:x86 -out:"
+#  CONFIG["AR"] = "lib -nologo"
+  CONFIG["AR"] = "ar"
+#  CONFIG["ARFLAGS"] = "-machine:x86 -out:"
+  CONFIG["ARFLAGS"] = "-o "
   CONFIG["LN_S"] = ""
   CONFIG["SET_MAKE"] = "MFLAGS = -$(MAKEFLAGS)"
   CONFIG["CP"] = "copy > nul"
   CONFIG["ALLOCA"] = ""
   CONFIG["DEFAULT_KCODE"] = ""
-  CONFIG["OBJEXT"] = "obj"
-  CONFIG["DLDFLAGS"] = "-link -incremental:no -debug -opt:ref -opt:icf -dll $(LIBPATH)"
+  CONFIG["OBJEXT"] = "o"
+#  CONFIG["DLDFLAGS"] = "-link -incremental:no -debug -opt:ref -opt:icf -dll $(LIBPATH)"
+  CONFIG["DLDFLAGS"] = "-g -shared $(LIBPATH)"
   CONFIG["ARCH_FLAG"] = ""
+  CONFIG["MAKEDIRS"] = "mkdir -p"
+  CONFIG["CP"] = "cp"
+  CONFIG["RM"] = "rm -f"
   CONFIG["STATIC"] = ""
   CONFIG["CCDLFLAGS"] = ""
-  CONFIG["LDSHARED"] = "cl -nologo -LD"
+#  CONFIG["LDSHARED"] = "cl -nologo -LD"
+  CONFIG["LDSHARED"] = "gcc -shared"
   CONFIG["DLEXT"] = "so"
   CONFIG["DLEXT2"] = "dll"
-  CONFIG["LIBEXT"] = "lib"
+#  CONFIG["LIBEXT"] = "lib"
+  CONFIG["LIBEXT"] = "a"
   CONFIG["STRIP"] = ""
   CONFIG["EXTSTATIC"] = ""
   CONFIG["setup"] = "Setup"
@@ -90,24 +107,31 @@
   CONFIG["LIBRUBY_A"] = "$(RUBY_SO_NAME)-static.lib"
   CONFIG["LIBRUBY_SO"] = "$(RUBY_SO_NAME).dll"
   CONFIG["LIBRUBY_ALIASES"] = ""
-  CONFIG["LIBRUBY"] = "$(RUBY_SO_NAME).lib"
+#  CONFIG["LIBRUBY"] = "$(RUBY_SO_NAME).lib"
+  CONFIG["LIBRUBY"] = "-l$(RUBY_SO_NAME)"
   CONFIG["LIBRUBYARG"] = "$(LIBRUBYARG_SHARED)"
   CONFIG["LIBRUBYARG_STATIC"] = "$(LIBRUBY_A)"
   CONFIG["LIBRUBYARG_SHARED"] = "$(LIBRUBY)"
   CONFIG["SOLIBS"] = ""
   CONFIG["DLDLIBS"] = ""
   CONFIG["ENABLE_SHARED"] = "yes"
-  CONFIG["OUTFLAG"] = "-Fe"
+#  CONFIG["OUTFLAG"] = "-Fe"
+  CONFIG["OUTFLAG"] = "-o"
   CONFIG["CPPOUTFILE"] = "-P"
-  CONFIG["LIBPATHFLAG"] = " -libpath:\"%s\""
+#  CONFIG["LIBPATHFLAG"] = " -libpath:\"%s\""
+  CONFIG["LIBPATHFLAG"] = " -L\"%s\""
   CONFIG["RPATHFLAG"] = ""
-  CONFIG["LIBARG"] = "%s.lib"
-  CONFIG["LINK_SO"] = "$(LDSHARED) -Fe$(@) $(OBJS) $(LIBS) $(LOCAL_LIBS) $(DLDFLAGS) -implib:$(*F:.so=)-$(arch).lib -pdb:$(*F:.so=)-$(arch).pdb -def:$(DEFFILE)"
-  CONFIG["COMPILE_C"] = "$(CC) $(INCFLAGS) $(CFLAGS) $(CPPFLAGS) -c -Tc$(<:\\=/)"
-  CONFIG["COMPILE_CXX"] = "$(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\\=/)"
-  CONFIG["COMPILE_RULES"] = "{$(hdrdir)}.%s{}.%s: {$(topdir)}.%s{}.%s: {$(srcdir)}.%s{}.%s: .%s.%s:"
-  CONFIG["RULE_SUBST"] = "{.;$(VPATH)}%s"
-  CONFIG["TRY_LINK"] = "$(CC) -Feconftest $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS) $(CFLAGS) $(src) $(LOCAL_LIBS) $(LIBS) -link $(LDFLAGS) $(LIBPATH) $(XLDFLAGS)"
+#  CONFIG["LIBARG"] = "%s.lib"
+#  CONFIG["LINK_SO"] = "$(LDSHARED) -Fe$(@) $(OBJS) $(LIBS) $(LOCAL_LIBS) $(DLDFLAGS) -implib:$(*F:.so=)-$(arch).lib -pdb:$(*F:.so=)-$(arch).pdb -def:$(DEFFILE)"
+  CONFIG["LINK_SO"] = "$(LDSHARED) --out-implib=\"$(@:.so=)-$(arch).a\" --output-def=\"$(DEFFILE)\" -o \"$(@)\" $(OBJS) $(LIBS) $(LOCAL_LIBS) $(DLDFLAGS) $(LDFLAGS)"
+#  CONFIG["COMPILE_C"] = "$(CC) $(INCFLAGS) $(CFLAGS) $(CPPFLAGS) -c -Tc$(<:\\=/)"
+  CONFIG["COMPILE_C"] = "$(CC) $(INCFLAGS) $(CFLAGS) $(CPPFLAGS) -c -x c $(<:\\=/)"
+#  CONFIG["COMPILE_CXX"] = "$(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -Tp$(<:\\=/)"
+  CONFIG["COMPILE_CXX"] = "$(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -x c++ $(<:\\=/)"
+#  CONFIG["COMPILE_RULES"] = "{$(hdrdir)}.%s{}.%s: {$(topdir)}.%s{}.%s: {$(srcdir)}.%s{}.%s: .%s.%s:"
+#  CONFIG["RULE_SUBST"] = "{.;$(VPATH)}%s"
+#  CONFIG["TRY_LINK"] = "$(CC) -Feconftest $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS) $(CFLAGS) $(src) $(LOCAL_LIBS) $(LIBS) -link $(LDFLAGS) $(LIBPATH) $(XLDFLAGS)"
+  CONFIG["TRY_LINK"] = "$(CC) -o conftest.exe $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS) $(CFLAGS) $(src) $(LOCAL_LIBS) $(LIBS) $(LDFLAGS) $(LIBPATH) $(XLDFLAGS)"
   CONFIG["COMMON_LIBS"] = "m"
   CONFIG["COMMON_MACROS"] = "WIN32_LEAN_AND_MEAN WIN32"
   CONFIG["COMMON_HEADERS"] = "winsock2.h ws2tcpip.h windows.h"
@@ -150,4 +174,6 @@
   end
 end
 RbConfig = Config # compatibility for ruby-1.9
-CROSS_COMPILING = nil unless defined? CROSS_COMPILING
+#CROSS_COMPILING = nil unless defined? CROSS_COMPILING
+CROSS_COMPILING = true
+

Active Script Ruby 1.9.2-p136-2010-12-25


使用に耐えないかもしれません。ビルドした Ruby BDB で SEGV しています。調査中です(todo)。

レイアウトは次のようにしています。 rbconfig.rb の位置を変えてます。

asr192
│  ruby
│  
├─include
│  └─ruby-1.9.1
│      │  *.h
│      │  
│      ├─i386-mswin32_100
│      │  └─ruby
│      │          *.h
│      │          
│      └─ruby
│          │  *.h
│          │  
│          └─backward
│                  *.h
│                  
└─lib
    │  *.a
    │  *.lib
    │  
    └─ruby
        └─1.9.1
                mkmf.rb
                rbconfig.rb
                

ruby

クロス コンパイルで ruby を実行する場合に使用します。たとえば extconf.rb の実行で使います。

asr192 ディレクトリー直下に置いた sh ファイルです。 chmod u+x を忘れずに。

#!/bin/sh
__ruby=`which ruby`
__ruby_load=`dirname $0`/lib/ruby/1.9.1
"${__ruby}" -v -I "${__ruby_load}" "$@"
libmsvcr100-ruby191.a

こちらを memo - MinGW Cross Compile on Ubuntu 参照してください。

pexports msvcr100-ruby191.dll | sed "s/^_//" > msvcr100-ruby191.def
dlltool -d msvcr100-ruby191.def -l libmsvcr100-ruby191.a
config.h

asr192/include/ruby-1.9.1/i386-mswin32_100/ruby/config.h を書き換えます。ファイル先頭の #error 行をコメントアウトします。
mkmf.rb.patch

--- asr192.orig/lib/ruby/1.9.1/mkmf.rb
+++ asr192/lib/ruby/1.9.1/mkmf.rb
@@ -2,7 +2,7 @@
 # module to create Makefile for extension modules
 # invoke like: ruby -r mkmf extconf.rb
 
-require 'rbconfig'
+require File.join(File.dirname(__FILE__), 'rbconfig')
 require 'fileutils'
 require 'shellwords'
 
@@ -388,7 +388,8 @@
                                 'LDFLAGS' => "#$LDFLAGS #{ldflags}",
                                 'LIBPATH' => libpathflag(libpath),
                                 'LOCAL_LIBS' => "#$LOCAL_LIBS #$libs",
-                                'LIBS' => "#$LIBRUBYARG_STATIC #{opt} #$LIBS")
+#                                'LIBS' => "#$LIBRUBYARG_STATIC #{opt} #$LIBS")
+                                'LIBS' => "#$LIBRUBYARG_SHARED #{opt} #$LIBS")
   RbConfig::expand(TRY_LINK.dup, conf)
 end
 
@@ -2016,7 +2017,8 @@
   RbConfig::CONFIG["topdir"] = curdir
 end
 $configure_args["--topdir"] ||= $curdir
-$ruby = arg_config("--ruby", File.join(RbConfig::CONFIG["bindir"], CONFIG["ruby_install_name"]))
+#$ruby = arg_config("--ruby", File.join(RbConfig::CONFIG["bindir"], CONFIG["ruby_install_name"]))
+$ruby = arg_config("--ruby", CONFIG["ruby_install_name"])
 
 split = Shellwords.method(:shellwords).to_proc
 
rbconfig.rb.patch

--- asr192.orig/lib/ruby/1.9.1/rbconfig.rb
+++ asr192/lib/ruby/1.9.1/rbconfig.rb
@@ -4,9 +4,10 @@
 
 module RbConfig
   RUBY_VERSION == "1.9.2" or
-    raise "ruby lib version (1.9.2) doesn't match executable version (#{RUBY_VERSION})"
+    STDERR.puts  "ruby lib version (1.9.2) doesn't match executable version (#{RUBY_VERSION})"
 
-  TOPDIR = File.dirname(__FILE__).chomp!("/lib/ruby/1.9.1/i386-mswin32_100")
+#  TOPDIR = File.dirname(__FILE__).chomp!("/lib/ruby/1.9.1/i386-mswin32_100")
+  TOPDIR = File.dirname(__FILE__).chomp!("/lib/ruby/1.9.1")
   DESTDIR = TOPDIR && TOPDIR[/\A[a-z]:/i] || '' unless defined? DESTDIR
   CONFIG = {}
   CONFIG["DESTDIR"] = DESTDIR
@@ -16,19 +17,28 @@
   CONFIG["PATCHLEVEL"] = "136"
   CONFIG["prefix"] = (TOPDIR || DESTDIR + "/usr")
   CONFIG["EXEEXT"] = ".exe"
-  CONFIG["ruby_install_name"] = "ruby"
-  CONFIG["RUBY_INSTALL_NAME"] = "ruby"
+#  CONFIG["ruby_install_name"] = "ruby"
+#  CONFIG["RUBY_INSTALL_NAME"] = "ruby"
+  CONFIG["ruby_install_name"] = File.join(CONFIG["prefix"], "ruby")
+  CONFIG["RUBY_INSTALL_NAME"] = CONFIG["ruby_install_name"]
   CONFIG["RUBY_SO_NAME"] = "msvcr100-ruby191"
-  CONFIG["SHELL"] = "$(COMSPEC)"
-  CONFIG["BUILD_FILE_SEPARATOR"] = "\\"
-  CONFIG["PATH_SEPARATOR"] = ";"
-  CONFIG["CFLAGS"] = "-MD -Zi -W2 -wd4996 -O2sy-  -Zm600"
+#  CONFIG["SHELL"] = "$(COMSPEC)"
+  CONFIG["SHELL"] = "sh"
+#  CONFIG["BUILD_FILE_SEPARATOR"] = "\\"
+  CONFIG["BUILD_FILE_SEPARATOR"] = "/"
+#  CONFIG["PATH_SEPARATOR"] = ";"
+  CONFIG["PATH_SEPARATOR"] = ":"
+#  CONFIG["CFLAGS"] = "-MD -Zi -W2 -wd4996 -O2sy-  -Zm600"
+  CONFIG["CFLAGS"] = "-g -pipe -O2 -mtune=pentium3 -msse -mno-sse2 -fomit-frame-pointer"
   CONFIG["DEFS"] = ""
   CONFIG["CPPFLAGS"] = "  "
-  CONFIG["CXXFLAGS"] = "-MD -Zi -W2 -wd4996 -O2sy-  -Zm600"
+#  CONFIG["CXXFLAGS"] = "-MD -Zi -W2 -wd4996 -O2sy-  -Zm600"
+  CONFIG["CXXFLAGS"] = "-g -pipe -O2 -mtune=pentium3 -msse -mno-sse2 -fomit-frame-pointer"
   CONFIG["FFLAGS"] = ""
-  CONFIG["LDFLAGS"] = "-incremental:no -debug -opt:ref -opt:icf"
-  CONFIG["LIBS"] = "unicows.lib oldnames.lib user32.lib advapi32.lib shell32.lib ws2_32.lib "
+#  CONFIG["LDFLAGS"] = "-incremental:no -debug -opt:ref -opt:icf"
+  CONFIG["LDFLAGS"] = ""
+#  CONFIG["LIBS"] = "unicows.lib oldnames.lib user32.lib advapi32.lib shell32.lib ws2_32.lib "
+  CONFIG["LIBS"] = "-luser32 -ladvapi32 -lshell32 -lws2_32 "
   CONFIG["exec_prefix"] = "$(prefix)"
   CONFIG["program_transform_name"] = "s,.*,&,"
   CONFIG["bindir"] = "$(exec_prefix)/bin"
@@ -60,30 +70,43 @@
   CONFIG["target_cpu"] = "i386"
   CONFIG["target_vendor"] = "pc"
   CONFIG["target_os"] = "mswin32_100"
-  CONFIG["CC"] = "cl -nologo"
-  CONFIG["CPP"] = "cl -nologo -E"
+#  CONFIG["CC"] = "cl -nologo"
+  CONFIG["CC"] = "gcc"
+#  CONFIG["CPP"] = "cl -nologo -E"
+  CONFIG["CPP"] = "gcc -E"
   CONFIG["CXX"] = "$(CC)"
   CONFIG["LD"] = "$(CC)"
   CONFIG["YACC"] = "bison"
   CONFIG["RANLIB"] = ""
-  CONFIG["AR"] = "lib -nologo"
-  CONFIG["ARFLAGS"] = "-machine:x86 -out:"
+#  CONFIG["AR"] = "lib -nologo"
+  CONFIG["AR"] = "ar"
+#  CONFIG["ARFLAGS"] = "-machine:x86 -out:"
+  CONFIG["ARFLAGS"] = "-o "
   CONFIG["LN_S"] = ""
   CONFIG["SET_MAKE"] = "MFLAGS = -$(MAKEFLAGS)"
-  CONFIG["RM"] = "$(COMSPEC) /C $(top_srcdir:/=\\)\\win32\\rm.bat"
-  CONFIG["RMDIRS"] = "$(COMSPEC) /C $(top_srcdir:/=\\)\\win32\\rmdirs.bat"
-  CONFIG["RMALL"] = "$(COMSPEC) /C rmdir /s /q"
+#  CONFIG["RM"] = "$(COMSPEC) /C $(top_srcdir:/=\\)\\win32\\rm.bat"
+  CONFIG["RM"] = "rm -f"
+#  CONFIG["RMDIRS"] = "$(COMSPEC) /C $(top_srcdir:/=\\)\\win32\\rmdirs.bat"
+  CONFIG["RMDIRS"] = "rmdir"
+#  CONFIG["RMALL"] = "$(COMSPEC) /C rmdir /s /q"
+  CONFIG["RMALL"] = "rm -f -r"
   CONFIG["ALLOCA"] = ""
   CONFIG["DEFAULT_KCODE"] = ""
   CONFIG["EXECUTABLE_EXTS"] = ".exe .com .cmd .bat"
-  CONFIG["OBJEXT"] = "obj"
-  CONFIG["DLDFLAGS"] = "-incremental:no -debug -opt:ref -opt:icf -dll $(LIBPATH)"
+#  CONFIG["OBJEXT"] = "obj"
+  CONFIG["OBJEXT"] = "o"
+#  CONFIG["DLDFLAGS"] = "-incremental:no -debug -opt:ref -opt:icf -dll $(LIBPATH)"
+  CONFIG["DLDFLAGS"] = "-g -shared $(LIBPATH)"
   CONFIG["ARCH_FLAG"] = ""
+  CONFIG["MAKEDIRS"] = "mkdir -p"
+  CONFIG["CP"] = "cp"
   CONFIG["STATIC"] = ""
   CONFIG["CCDLFLAGS"] = ""
-  CONFIG["LDSHARED"] = "cl -nologo -LD"
+#  CONFIG["LDSHARED"] = "cl -nologo -LD"
+  CONFIG["LDSHARED"] = "gcc -shared"
   CONFIG["DLEXT"] = "so"
-  CONFIG["LIBEXT"] = "lib"
+#  CONFIG["LIBEXT"] = "lib"
+  CONFIG["LIBEXT"] = "a"
   CONFIG["STRIP"] = ""
   CONFIG["EXTSTATIC"] = ""
   CONFIG["setup"] = "Setup"
@@ -99,7 +122,8 @@
   CONFIG["LIBRUBY_A"] = "$(RUBY_SO_NAME)-static.lib"
   CONFIG["LIBRUBY_SO"] = "$(RUBY_SO_NAME).dll"
   CONFIG["LIBRUBY_ALIASES"] = ""
-  CONFIG["LIBRUBY"] = "$(RUBY_SO_NAME).lib"
+#  CONFIG["LIBRUBY"] = "$(RUBY_SO_NAME).lib"
+  CONFIG["LIBRUBY"] = "-l$(RUBY_SO_NAME)"
   CONFIG["LIBRUBYARG"] = "$(LIBRUBYARG_SHARED)"
   CONFIG["LIBRUBYARG_STATIC"] = "$(LIBRUBY_A)"
   CONFIG["LIBRUBYARG_SHARED"] = "$(LIBRUBY)"
@@ -107,25 +131,34 @@
   CONFIG["DLDLIBS"] = ""
   CONFIG["ENABLE_SHARED"] = "yes"
   CONFIG["BASERUBY"] = "c:\\Users\\arton\\bin\\ruby.exe"
-  CONFIG["OUTFLAG"] = "-Fe"
-  CONFIG["COUTFLAG"] = "-Fo"
-  CONFIG["CPPOUTFILE"] = "-P"
-  CONFIG["LIBPATHFLAG"] = " -libpath:%s"
+#  CONFIG["OUTFLAG"] = "-Fe"
+  CONFIG["OUTFLAG"] = "-o"
+#  CONFIG["COUTFLAG"] = "-Fo"
+  CONFIG["COUTFLAG"] = "-o"
+#  CONFIG["CPPOUTFILE"] = "-P"
+  CONFIG["CPPOUTFILE"] = "-E -o"
+#  CONFIG["LIBPATHFLAG"] = " -libpath:%s"
+  CONFIG["LIBPATHFLAG"] = " -L\"%s\""
   CONFIG["RPATHFLAG"] = ""
-  CONFIG["LIBARG"] = "%s.lib"
-  CONFIG["LINK_SO"] = "$(LDSHARED) -Fe$(@) $(OBJS) $(LIBS) $(LOCAL_LIBS) -link $(DLDFLAGS) -implib:$(*F:.so=)-$(arch).lib -pdb:$(*F:.so=)-$(arch).pdb -def:$(DEFFILE)"
-  CONFIG["LINK_SO"] << "\n" "@if exist $(@).manifest $(RUBY) -run -e wait_writable -- -n 10 $(@)"
-  CONFIG["LINK_SO"] << "\n" "@if exist $(@).manifest mt -nologo -manifest $(@).manifest -outputresource:$(@);2"
-  CONFIG["LINK_SO"] << "\n" "@if exist $(@).manifest $(RM) $(@:/=\\).manifest"
-  CONFIG["COMPILE_C"] = "$(CC) $(INCFLAGS) $(CFLAGS) $(CPPFLAGS) $(COUTFLAG)$(@) -c -Tc$(<:\\=/)"
-  CONFIG["COMPILE_CXX"] = "$(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(COUTFLAG)$(@) -c -Tp$(<:\\=/)"
-  CONFIG["COMPILE_RULES"] = "{$(hdrdir)}.%s.%s: {$(topdir)}.%s.%s: {$(srcdir)}.%s.%s: .%s.%s:"
-  CONFIG["RULE_SUBST"] = "{.;$(VPATH)}%s"
-  CONFIG["TRY_LINK"] = "$(CC) -Feconftest $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS) $(CFLAGS) $(src) $(LOCAL_LIBS) $(LIBS) -link $(LDFLAGS) $(LIBPATH) $(XLDFLAGS)"
+#  CONFIG["LIBARG"] = "%s.lib"
+#  CONFIG["LINK_SO"] = "$(LDSHARED) -Fe$(@) $(OBJS) $(LIBS) $(LOCAL_LIBS) -link $(DLDFLAGS) -implib:$(*F:.so=)-$(arch).lib -pdb:$(*F:.so=)-$(arch).pdb -def:$(DEFFILE)"
+#  CONFIG["LINK_SO"] << "\n" "@if exist $(@).manifest $(RUBY) -run -e wait_writable -- -n 10 $(@)"
+#  CONFIG["LINK_SO"] << "\n" "@if exist $(@).manifest mt -nologo -manifest $(@).manifest -outputresource:$(@);2"
+#  CONFIG["LINK_SO"] << "\n" "@if exist $(@).manifest $(RM) $(@:/=\\).manifest"
+  CONFIG["LINK_SO"] = "$(LDSHARED) --out-implib=\"$(@:.so=)-$(arch).a\" --output-def=\"$(DEFFILE)\" -o \"$(@)\" $(OBJS) $(LIBS) $(LOCAL_LIBS) $(DLDFLAGS) $(LDFLAGS)"
+#  CONFIG["COMPILE_C"] = "$(CC) $(INCFLAGS) $(CFLAGS) $(CPPFLAGS) $(COUTFLAG)$(@) -c -Tc$(<:\\=/)"
+  CONFIG["COMPILE_C"] = "$(CC) $(INCFLAGS) $(CFLAGS) $(CPPFLAGS) -c -x c $(<:\\=/)"
+#  CONFIG["COMPILE_CXX"] = "$(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(COUTFLAG)$(@) -c -Tp$(<:\\=/)"
+  CONFIG["COMPILE_CXX"] = "$(CXX) $(INCFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -x c++ $(<:\\=/)"
+#  CONFIG["COMPILE_RULES"] = "{$(hdrdir)}.%s.%s: {$(topdir)}.%s.%s: {$(srcdir)}.%s.%s: .%s.%s:"
+#  CONFIG["RULE_SUBST"] = "{.;$(VPATH)}%s"
+#  CONFIG["TRY_LINK"] = "$(CC) -Feconftest $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS) $(CFLAGS) $(src) $(LOCAL_LIBS) $(LIBS) -link $(LDFLAGS) $(LIBPATH) $(XLDFLAGS)"
+  CONFIG["TRY_LINK"] = "$(CC) -o conftest.exe $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS) $(CFLAGS) $(src) $(LOCAL_LIBS) $(LIBS) $(LDFLAGS) $(LIBPATH) $(XLDFLAGS)"
   CONFIG["COMMON_LIBS"] = "m"
   CONFIG["COMMON_MACROS"] = "WIN32_LEAN_AND_MEAN WIN32"
   CONFIG["COMMON_HEADERS"] = "winsock2.h ws2tcpip.h windows.h"
-  CONFIG["cleanobjs"] = "$*.exp $*.lib $*.pdb"
+#  CONFIG["cleanobjs"] = "$*.exp $*.lib $*.pdb"
+  CONFIG["cleanobjs"] = "$*.exp $*.a $*.pdb"
   CONFIG["DISTCLEANFILES"] = "vc*.pdb"
   CONFIG["EXPORT_PREFIX"] = " "
   CONFIG["arch"] = "i386-mswin32_100"
@@ -179,4 +212,5 @@
   end
 end
 Config = RbConfig # compatibility for ruby-1.8.4 and older.
-CROSS_COMPILING = nil unless defined? CROSS_COMPILING
+#CROSS_COMPILING = nil unless defined? CROSS_COMPILING
+CROSS_COMPILING = true

使い方。


MinGW Cross Compile on Ubuntu の環境を前提しています。

extconf.rb を使う場合。 XLIBRARY はライブラリーを保存したディレクトリーの親ディレクトリーです。
${XMINGW}/cross ${XLIBRARY}/asr187/ruby extconf.rb

memo

win32.h


win32.h には様々なマクロが定義されています。このマクロの一部は一般的な名前を使用しており、 C++ のコンパイルにおいてマクロと同名のメソッド呼び出しで発見しづらい問題を惹き起こします。

ほかにも、 C 標準ライブラリーを置き換えています。 fclose などを置き換えており、発見しづらい、意図しない問題を惹き起こす恐れがあります。

Ruby BDB ではこのようなマクロの一部を #undef しています。

links



[ASR] ActiveScriptRuby and Other packages
http://www.artonx.org/data/asr/

todo

  • Active Script Ruby 1.9.2-p136-2010-12-25 での ruby bdb のビルド
  • vc2010ee では" C4020: 'ポインターによる関数の呼び出し' : 実引数が多すぎます。"がエラーにならない。警告ですまされる。このため mkmf.rb の try_compile 関数が期待した結果を返さない場合がある。また同様に win32 版 ruby には win32/win32.h の問題が存在し、これが悪さをして try_compile 関数が期待した結果を返さない場合がある。

更新履歴



2011/6/27mon つまらないが致命的な記述漏れを補った。
2011/1/23sun ページ作成。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

編集にはIDが必要です