MinGW Cross Compile on Ubuntu > Ruby Library
Ruby はクロス プラットフォームで動作する軽量言語です。 Ruby Library もクロス プラットフォームで動作するよう考慮されています。
しかしながら、一部のライブラリーでは対応が不充分で、 Windows で機能が制約されていたり、動作しないことがあります。ビルドできないこともあります。ビルドにパッチや工夫が必要になることもあります。
クロス プラットフォームの深奥を覗き込むには僕の知識と技術が足りません。それでも可能なことはあります。
Windows での Ruby Library の利用に関して、パッチや工夫を必要とせずビルドできること、およびバイナリーの提供を、実行/確認しやすくするために、 MinGW クロス ビルドを試みます。
レイアウトは次のようにしています。 rbconfig.rb の位置を変えてます。
クロス コンパイルで ruby を実行する場合に使用します。たとえば extconf.rb の実行で使います。
asr187 ディレクトリー直下に置いた sh ファイルです。 chmod u+x を忘れずに。
こちらを memo - MinGW Cross Compile on Ubuntu 参照してください。
使用に耐えないかもしれません。ビルドした Ruby BDB で SEGV しています。調査中です(todo)。
レイアウトは次のようにしています。 rbconfig.rb の位置を変えてます。
クロス コンパイルで ruby を実行する場合に使用します。たとえば extconf.rb の実行で使います。
asr192 ディレクトリー直下に置いた sh ファイルです。 chmod u+x を忘れずに。
こちらを memo - MinGW Cross Compile on Ubuntu 参照してください。
asr192/include/ruby-1.9.1/i386-mswin32_100/ruby/config.h を書き換えます。ファイル先頭の #error 行をコメントアウトします。
MinGW Cross Compile on Ubuntu の環境を前提しています。
extconf.rb を使う場合。 XLIBRARY はライブラリーを保存したディレクトリーの親ディレクトリーです。
win32.h には様々なマクロが定義されています。このマクロの一部は一般的な名前を使用しており、 C++ のコンパイルにおいてマクロと同名のメソッド呼び出しで発見しづらい問題を惹き起こします。
ほかにも、 C 標準ライブラリーを置き換えています。 fclose などを置き換えており、発見しづらい、意図しない問題を惹き起こす恐れがあります。
Ruby BDB ではこのようなマクロの一部を #undef しています。
Ruby はクロス プラットフォームで動作する軽量言語です。 Ruby Library もクロス プラットフォームで動作するよう考慮されています。
しかしながら、一部のライブラリーでは対応が不充分で、 Windows で機能が制約されていたり、動作しないことがあります。ビルドできないこともあります。ビルドにパッチや工夫が必要になることもあります。
クロス プラットフォームの深奥を覗き込むには僕の知識と技術が足りません。それでも可能なことはあります。
Windows での Ruby Library の利用に関して、パッチや工夫を必要とせずビルドできること、およびバイナリーの提供を、実行/確認しやすくするために、 MinGW クロス ビルドを試みます。
レイアウトは次のようにしています。 rbconfig.rb の位置を変えてます。
asr187 │ ruby │ └─lib │ *.a │ *.lib │ └─ruby └─1.8 │ mkmf.rb │ rbconfig.rb │ └─i386-mswin32 │ *.h │ └─win32 *.h
クロス コンパイルで 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}" "$@"
こちらを memo - MinGW Cross Compile on Ubuntu 参照してください。
pexports msvcrt-ruby18.dll | sed "s/^_//" > msvcrt-ruby18.def dlltool -d msvcrt-ruby18.def -l libmsvcrt-ruby18.a
--- 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
--- 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 +
使用に耐えないかもしれません。ビルドした 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 を実行する場合に使用します。たとえば 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}" "$@"
こちらを memo - MinGW Cross Compile on Ubuntu 参照してください。
pexports msvcr100-ruby191.dll | sed "s/^_//" > msvcr100-ruby191.def dlltool -d msvcr100-ruby191.def -l libmsvcr100-ruby191.a
asr192/include/ruby-1.9.1/i386-mswin32_100/ruby/config.h を書き換えます。ファイル先頭の #error 行をコメントアウトします。
--- 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
--- 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
win32.h には様々なマクロが定義されています。このマクロの一部は一般的な名前を使用しており、 C++ のコンパイルにおいてマクロと同名のメソッド呼び出しで発見しづらい問題を惹き起こします。
ほかにも、 C 標準ライブラリーを置き換えています。 fclose などを置き換えており、発見しづらい、意図しない問題を惹き起こす恐れがあります。
Ruby BDB ではこのようなマクロの一部を #undef しています。
-
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 関数が期待した結果を返さない場合がある。
タグ
コメントをかく