著作一覧 |
MSVCRTのGetModuleFileNameやLoadLibraryを呼び出すコードがリンクされるため、一時はどうなるかと思ったが、ローカルでのテストは通過したので、Windowsストアへ提出してみた。
まだ審査があるみたいなので、どうなるかはちょっとわからないけど。 なお、(WinMIrbという名前にした)に関しては、ほとんどmirbなので無料で公開します。
最終的にx86のNOSTUDIO版(というか、Windows Store App用)のビルド記述は以下となりました。
ちょっとトライ&エラーしているうちに間違えてたので、書き直した
MRuby::CrossBuild.new('nostdio') do |conf| toolchain :vs2012 conf.cc.flags = %w(/c /nologo /W3 /MD /Zi /Od /DHAVE_STRING_H /DNO_GETTIMEOFDAY /D_CRT_SECURE_NO_WARNINGS /DDISABLE_STDIO /TP /ZW:nostdlib /DNDEBUG) conf.build_mrbtest_lib_only conf.bins = %w() conf.gem 'examples/mrbgems/c_and_ruby_extension_example' conf.archiver do |archiver| archiver.archive_options << ' /LTCG' end end
ミソは、/ZW:nostdlibと、lib用の/LTCG。あと、/TPでC++としてコンパイルしている。なお、デバッグ版ライブラリ(/MDd)はIOを含むので当然だめ。
/TPはやめても問題なさそう。0428#c02参照。あと、使う方もDISABLE_STDIOが必要ってのは忘れがち、というか忘れてそこでもはまった。
以下、何が必要か、何がまずいか。
/RTC1 ― これがまずい。cl /?では、高速チェックの有効という書き方しかしていないし、/RTC (ランタイム エラー チェック)を読んでも良くわからないのだが、/RTC1によってランタイムのWindows Store App非互換なコードの組み込みが指定されるようだ(推測)。
libの/LTCGによって非互換コードの組み込みが阻止されるのかと考えたのだが、それは間違いだった。これは不要。
で、/RTC1を外すと、それだけで良さそうで、/ZW (ライブラリには:nostdlibを付けたほうが良いと思われる)の要不要は不明(付けなくとも動くが、おそらく付けたほうが矛盾したコードに対する指摘が入ると思う)。
/DNDEBUGは不要。ただし、_DEBUGを外すことになるのでマーカとして入れたほうが良いかも知れない。
で、以下となった。
MRuby::CrossBuild.new('nostdio') do |conf| toolchain :vs2012 conf.cc.flags = %w(/c /nologo /W3 /Zi /Od /DHAVE_STRING_H /DNO_GETTIMEOFDAY /D_CRT_SECURE_NO_WARNINGS /DDISABLE_STDIO /TP /MD /ZW:nostdlib /DNDEBUG) conf.build_mrbtest_lib_only conf.bins = %w() conf.gem 'examples/mrbgems/c_and_ruby_extension_example' end
ジェズイットを見習え |