From: siena@... (Siena. / SHINAGAWA, Norihide) Date: 2003-07-29T14:51:53+09:00 Subject: [ruby-dev:20993] OS/2 EMX (was: ruby 1.8.0 preview5) Siena. です。 手元の OS/2 の開発環境がこれまでまともに動作しなくなっていたのですが、 先日ようやく再整備でき、ruby 1.8.0 preview4, preview5 [i386-os2-emx] の インストールを試みていました。 # 今までは仕方無く、ずーっと ruby 1.6.4 ^^; README.ja の手順だけでインストールできるようにするためには 次の点について修正が必要でしたので、報告致します。 対応していただけると、インストールが楽になるので助かります。 (1) ext/socket/socket.c:sock_init() (2) ext/socket/socket.c:unix_{send,recv}_io() (3) configure.in の OS 識別子 (4) Makefile:{C,CXX,LD}FLAGS (5) Makefile:LIBRUBY_A (6) mkconfig.rb 以下、少し長くなりますがご容赦ください。 (1) ext/socket/socket.c:sock_init() EMX 標準の sys/socket.h に sock_init() が存在し、競合してしまいます。 ext/socket.c を s/sock_init/sock_initialize/ として 2ヶ所を変更しました。 これだけで良いと思うのですが、他に変更が影響するところはあるでしょうか? $ cd ext/socket $ mv socket.c socket.c.org $ sed 's/sock_init/sock_initialize/g' socket.c.org > socket.c (2) ext/socket/socket.c:unix_{send,recv}_io() {send,recv}msg() のリンクエラーが発生します。調べたところ、EMX の sys/socket.h には {send,recv}msg() のプロトタイプ宣言が存在するにも かかわらず、nm で確認するとなんと実体が socket.a に含まれていません。 他の、send(), recv(), sendto(), recvfrom}() は実装が存在します。 ぐぐってみると、"The UNIX and OS/2 EMX Porting Companion FAQ" にも 未実装と書かれていて、現在もそのままのようです。 とりあえずの手当として、ext/socket/socket.c:unix_{send,recv}_io() の 両関数の先頭にある条件文を次のように変更して凌ぎました。 -#if defined(HAVE_ST_MSG_CONTROL) || defined(HAVE_ST_MSG_ACCRIGHTS) +#if ( defined(HAVE_ST_MSG_CONTROL) || defined(HAVE_ST_MSG_ACCRIGHTS) ) && !defined(__EMX__) これで、UNIXSocket#{send,recv}_io だけが無効になる (呼び出すと 例外が上がる?) のだと思いますが、十分なのか理解していません。 どのくらいのライブラリ/スクリプトが UNIXSocket に、あるいは UNIXSocket#{send,recv}_io に依存しているのでしょうか? UNIXSocket を使うほとんどのものが #{send,recv}_io に依存しないならば、 上記の変更だけでも (安全ではないけれど) 足りそうですが、そうでなければ UNIXSocket (と UNIXServer) クラスそのものを無効にすべきかもしれません。 (3) configure.in の OS 識別子 OS/2 の EMX 環境下 (うちの環境だけかもしれません) ではソース展開後の ./configure は正常に動作しないようなので、autoconf を回す必要があります。 OS/2 用の autoconf 2.5 を導入して使いましたが、いつの間にか、 OS/2 の識別子が os2_emx から os2-emx に変更されたようです。 $ autoconf --version | autoconf (GNU Autoconf) 2.50 (release 3 for OS/2) | Written by David J. MacKenzie. 今回は、configure.in 中の OS 識別子を単純に置換して対応しましたが、 もしかすると os2_emx のままの autoconf も存在するかもしれません。 $ mv configure.in configure.in.org $ sed 's/os2_emx/os2-emx/g' configure.in.org > configure.in なかなかこれに気付かず、make; make test; make install が通るのに、 動かすと変な $: が設定されて動作しないという状況に悩まされていました ^^; (4) Makefile:{C,CXX,LD}FLAGS 適切なオプションが分からないので、今まで使っていた ruby 1.6.4 の rbconfig.rb を参考に次のように設定しました。 configure で自動的に設定されるようになると良いのですが、 configure.in が分かっていないので、手を入れられずにいます。 $ CFLAGS='-O2 -Zmts' CXXFLAGS='-O2 -Zmts' LDFLAGS='-Zbsd-signals' \ | CONFIG_SHELL='sh' ./configure --prefix=$MYRUBYDIR (*) -Zmts はマルチスレッド対応 C ライブラリを静的リンクするオプション、らしい 余談ですが、CONFIG_SHELL を '/bin/sh' でなくすのは、/bin が存在せず、 常用シェルにしている bash が #!sh で PATH を参照してくれるからです。 # make 時にはこけるので、作業ドライブに /bin/sh.exe を用意してますが ^^; もちろん、PATH の参照は一般的には余計なお世話ですので、 このオプションは configure.in には反映されない方が良いと思っています。 (5) Makefile:LIBRUBY_A ターゲット名に libruby-static.a が設定され、実際に生成されますが、 リンク時には ld が ruby-static.a をリンクしようとしてエラーでこけます。 やってないので不明ですが LIBRUBY_{SO,ALIAS} も同様かもしれません。 $ make (中略) | gcc -O2 -Zmt -Zmts -DOS2 -Zbsd-signals -L. main.o -lruby-static -lm-o ruby.exe | T:\BIN\ld.exe: No such file or directory for ruby-static.a | make: *** [ruby.exe] Error 1 ターゲット名を ruby-static.a に変更し、整合するように他も変更する 必要がありそうですが、とりあえずは力任せにコピーしてごまかしています。 これも configure.in か Makefile.in 辺りを修正する必要がありそうです。 $ make ; cp -p libruby-static.a ruby-static.a ; make (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 次のように修正を加えたところ、エラーで止まらなくなったようです。 $ diff -u2 mkconfig.rb.org mkconfig.rb Tue --- mkconfig.rb.org Sun Jul 27 22:03:40 2003 +++ mkconfig.rb Tue Jul 29 11:36:32 2003 @@ -15,4 +15,5 @@ version = RUBY_VERSION rbconfig_rb_tmp = rbconfig_rb + '.tmp' +rbconfig_rb_old = rbconfig_rb + '.old' config = open(rbconfig_rb_tmp, "w") $orgout = $stdout.dup @@ -138,4 +139,6 @@ $stdout.reopen($orgout) config.close +File.delete(rbconfig_rb_old) if( File.exist? rbconfig_rb_old ) +File.rename(rbconfig_rb, rbconfig_rb_old) File.rename(rbconfig_rb_tmp, rbconfig_rb) 以上、長々と要領を得ない説明ですみません。 ご検討いただけますと幸いです。よろしくお願い致します。 --- Siena.