From: siena@... (Siena. / SHINAGAWA, Norihide) Date: 2003-07-30T01:55:51+09:00 Subject: [ruby-dev:21007] Re: OS/2 EMX (was: ruby 1.8.0 preview5) Siena. です。 パッチを作っていただいてありがとうございます。 file.c のパッチを除いて、問題なく make できました。 preview5 + [ruby-dev:21000] に対する差分を最後に付けておきます。 》> (3) configure.in の OS 識別子 》> OS/2 用の autoconf 2.5 を導入して使いましたが、いつの間にか、 》> OS/2 の識別子が os2_emx から os2-emx に変更されたようです。 》> 今回は、configure.in 中の OS 識別子を単純に置換して対応しましたが、 》> もしかすると os2_emx のままの autoconf も存在するかもしれません。 》 》configure.inでは os2?emx にしますか? すっかり誤解していましたが、まつもとさんから [ruby-dev:21003] で 指摘していただいたように config.guess で os2-emx としているようです。 なので、os2-emx に固定してしまっても問題なさそうです。 》> (4) Makefile:{C,CXX,LD}FLAGS 》> 》> 適切なオプションが分からないので、今まで使っていた 》> ruby 1.6.4 の rbconfig.rb を参考に次のように設定しました。 》> $ CFLAGS='-O2 -Zmts' CXXFLAGS='-O2 -Zmts' LDFLAGS='-Zbsd-signals' \ 》> | CONFIG_SHELL='sh' ./configure --prefix=$MYRUBYDIR 》> 》> (*) -Zmts はマルチスレッド対応 C ライブラリを静的リンクするオプション、らしい 》 》これは常に必要なんですよね。 無くても大丈夫な気もしますが、ちょっと分かりません。 -Zmts 無しだとシングルスレッド版の C ライブラリがリンクされます。 試したところ、make test は通り、幾つかのスクリプトも動作確認できました。 ruby がネイティブスレッドを使うようになるまでは不要なのかもしれません。 もしくは、拡張ライブラリでマルチスレッドしていたりする時とかでしょうか。 自信がないので、とりあえず以前の版に合わせて -Zmts を付けておきます。 しばらくの間、-Zmts 無しでコンパイルした ruby を使ってみて、 これに起因すると思われる問題が出たら改めて報告したいと思います。 》> (5) Makefile:LIBRUBY_A 》> 》> ターゲット名に libruby-static.a が設定され、実際に生成されますが、 》> リンク時には ld が ruby-static.a をリンクしようとしてエラーでこけます。 》> やってないので不明ですが LIBRUBY_{SO,ALIAS} も同様かもしれません。 》 》OS/2では--enable-sharedはできないんでしたっけ。 送っていただいたパッチを当てた後に試してみたところ、リンク時に _GLOBAL_OFFSET_TABLE_ を見つけられずに SEGV ってしまいました。 $ make clean $ CONFIG_SHELL='sh' ./configure --enable-shared --prefix=$MYRUBYDIR $ make (略) | main.c:40 (main.o): Undefined symbol _GLOBAL_OFFSET_TABLE_ referenced from text segment | eval.c:134 (ruby-static.a(eval.o)): Undefined symbol _GLOBAL_OFFSET_TABLE_ referenced from text segment (略) | eval.c:144 (ruby-static.a(eval.o)): Undefined symbol _GLOBAL_OFFSET_TABLE_ referenced from text segment | eval.c:0 (ruby-static.a(eval.o)): More undefined symbol _GLOBAL_OFFSET_TABLE_ refs follow | | Process terminated by SIGSEGV | core dumped | gcc: Internal compiler error: program ld got fatal signal 11 | make: *** [miniruby.exe] Error 1 》> (6) mkconfig.rb 》> 》> と、(1)〜(5) が分かるまで、直しては make しを繰り返していたのですが、 》> 場合によって、mkconfig.rb がエラーで止まってしまう事があります。 》> 他の環境では発生しない問題でしょうか? 》> 》> | ./mkconfig.rb:135:in `rename': Permission denied 》> - rbconfig.rb.tmp or rbconfig.rb (Errno::EACCES) 》> | from ./mkconfig.rb:135 》> | make: *** [rbconfig.rb] Error 1 》rename()で変更先のファイルが存在すると削除せずにエラーになると 》いうことでしょうか。あ、DOSISHはそうかも。 》 》とするとFile.rename自体を変更したほうがよさそうです。少なくとも 》_WIN32環境ではそうしてます。 なるほど。と思ったのですが、パッチを当てても現象は変わらずでした。 file.c というヒントをいただいたので試しつつ調べてみたところ、 EMX の rename() には次のような落とし穴がある事が分かりました。 rename(): | Restrictions: | rename() may set errno to EACCES instead of EEXIST if a file or | directory with the name pointed to by new_name already exists. | (Why does OS/2 return ERROR_ACCESS_DENIED instead of ERROR_FILE_EXISTS?) というわけで。preview5 + [ruby-dev:21000] の file.c に対する次の変更で問題を回避できそうです。 $ diff -u ../ruby-1.8.0p5.1/file.c file.c --- ../ruby-1.8.0p5.1/file.c Wed Jul 30 00:05:44 2003 +++ file.c Wed Jul 30 00:08:08 2003 @@ -1344,11 +1344,15 @@ extern unsigned long __attribute__((stdcall)) GetLastError(); errno = GetLastError(); /* This is a Cygwin bug */ #elif defined DOSISH && !defined _WIN32 - if (errno == EEXIST) { + if (errno == EEXIST +#if defined (__EMX__) + || errno == EACCES +#endif + ) { if (chmod(dst, 0666) == 0 && unlink(dst) == 0 && rename(src, dst) == 0) - rename INT2FIX(0); + return INT2FIX(0); } #endif sys_fail2(from, to); --- Siena.