NAKANO Kouichi
knuck****@f8*****
2002年 7月 23日 (火) 22:11:56 JST
なかのです。 ruby-win32 MLの方で わたなべ ひろふみ さんから非常に有益な情報を いただきましたので。展開します。 最適化コンパイルオプションについての話から転じて下記のような情報を いただきました。 ------- Forwarded Message わたなべです。 NAKANO Kouichi <knuck****@f8*****> writes: :>ところでexerbってmingwでもできるんでしたっけ? : :現在、それに向けて調査&作業中です。 :Yuyaさんが試した結果では、Exerbのコードに日本語が含まれているの :で失敗したということですが、私は一度の試行もしていません。 GCC 2.95.3ではSJISで書かれた char *p = "表示"; がエラーになります(C++の場合)。 % ruby -e 'print %(char *p = "\x95\x5c\x8e\a6";\n)' |\ gcc-2.95.3 -xc++ -c -o /dev/null -;echo $? :1: unknown escape sequence: `\' followed by char code 0x8e 1 % ruby -e 'print %(char *p = "\x95\x5c\x8e\a6";\n)' |\ gcc-2.95.3 -xc -c -o /dev/null -;echo $? :1: warning: unknown escape sequence: `\' followed by char code 0x8e 0 GCC 3.1ではどちらも <stdin>:1:11: warning: unknown escape sequence: '\216' で、エラーにならないので、2.95.3がバグっていたのかもしれません。 #もっとも2.95.3の場合は--enable-c-mbcharでGCCをconfigureす #ればSJISも扱えるんだけど、ま、そんなオプションをつけて #CygwinもMinGWもリリースするとは思えない。 exerb.cppでは「表示」の「表」と「可能性」の「能」が\x5cを含んでいます。 mingwで作るには 1. 「表示」と「可能性」をどうにかする。ふだんはEUCで暮してる し面倒なのでexerb.cppをEUCに変換した。 2. .ruby section対応(なくても動くようだ)。 3. exerb.defのdefinkeyとdln_argv0を削除。 4. export fileを作る。 5. coreを作る。 という流れになります。 % cd src/exerb % nkf -Se exerb.cpp > exerb-euc.cpp % patch -p1 < exerb-euc.cpp.diff % grep -v -e definekey -e dln_argv0 exerb.def > exerb-mingw.def % dllwrap --target=i386-mingw32 -mno-cygwin \ --output-exp=ruby.exp --def=exerb-mingw.def \ -Ld:/usr/local/lib/ruby/1.6/i386-mingw32 -lrubys -lcrypt \ -lwsock32 -lgdi32 -o dummy % gcc -mno-cygwin -DNT -D_CONSOLE -D__NO_ISOCEXT -c \ -Id:/usr/local/lib/ruby/1.6/i386-mingw32 -I../../res \ exerb-euc.cpp % gcc -s -mno-cygwin ruby.exp exerb-euc.o \ -o ../../bin/exerb-mingw.core \ -Ld:/usr/local/lib/ruby/1.6/i386-mingw32 -lrubys -lcrypt \ -lwsock32 -lgdi32 -lstdc++ 気になったこと: o rbxという拡張子はmod_rubyで使われているので、別にしたほうが いいかもしれない。 o exerb.cppにはなぜかところどころCRが含まれている。 o 先月試したときは-lstdc++は必要なかったが、今回は必須になっ てしまった。現在のCygwinではMinGW用のlibstdc++.aは用意され てないので(GCC 3.1.1-4用はある)、自分で用意する必要がある。 最初からMinGW用のGCCを使えばたぶん問題ない。 -- わたなべひろふみ --- exerb-euc.cpp.bak 2002-07-23 16:25:53.000000000 +0900 +++ exerb-euc.cpp 2002-07-23 16:44:13.000000000 +0900 @@ -16,3 +16,7 @@ #pragma data_seg(".ruby") - _declspec(dllexport) R2E_ARCHIVE_HEADER ArchiveHeader = { + _declspec(dllexport) R2E_ARCHIVE_HEADER ArchiveHeader +#if defined __GNUC__ + __attribute__ ((section (".ruby"))) +#endif + = { 0x59425552, // Signature ------- End of Forwarded Message ------------------------------------------------------------ NAKANO Kouichi Email knuck****@f8*****