From: nobu.nakada@... Date: 2003-07-29T16:52:24+09:00 Subject: [ruby-dev:21000] Re: OS/2 EMX (was: ruby 1.8.0 preview5) なかだです。 At Tue, 29 Jul 2003 14:51:53 +0900, Siena. / SHINAGAWA, Norihide wrote: > (1) ext/socket/socket.c:sock_init() > > EMX 標準の sys/socket.h に sock_init() が存在し、競合してしまいます。 > ext/socket.c を s/sock_init/sock_initialize/ として 2ヶ所を変更しました。 > これだけで良いと思うのですが、他に変更が影響するところはあるでしょうか? staticなので問題ないはずです。 > (2) ext/socket/socket.c:unix_{send,recv}_io() これに関しては田中さんと同意見。 > (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 も存在するかもしれません。 configure.inでは os2?emx にしますか? > (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 ライブラリを静的リンクするオプション、らしい これは常に必要なんですよね。 > (5) Makefile:LIBRUBY_A > > ターゲット名に libruby-static.a が設定され、実際に生成されますが、 > リンク時には ld が ruby-static.a をリンクしようとしてエラーでこけます。 > やってないので不明ですが LIBRUBY_{SO,ALIAS} も同様かもしれません。 OS/2では--enable-sharedはできないんでしたっけ。 > (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環境ではそうしてます。 こんなところでどうでしょうか。 Index: configure.in =================================================================== RCS file: /cvs/ruby/src/ruby/configure.in,v retrieving revision 1.184 diff -u -2 -p -r1.184 configure.in --- configure.in 28 Jul 2003 07:31:49 -0000 1.184 +++ configure.in 29 Jul 2003 07:41:48 -0000 @@ -287,5 +287,5 @@ mingw*) LIBS="-lwsock32 $LIBS" ac_cv_lib_crypt_crypt=no ;; -os2_emx*) LIBS="-lm $LIBS" +os2?emx*) LIBS="-lm $LIBS" ac_cv_lib_dir_opendir=no;; msdosdjgpp*) LIBS="-lm $LIBS" @@ -867,4 +867,6 @@ if test "$with_dln_a_out" != yes; then atheos*) LDSHARED="$CC -shared" rb_cv_dlopen=yes ;; + os2?emx*) LDFLAGS="$LDFLAGS -Zbsd-signals" + ;; *) LDSHARED='ld' ;; esac @@ -914,5 +914,5 @@ else darwin*) DLEXT=bundle AC_DEFINE(DLEXT, ".bundle");; - os2_emx*) DLEXT=dll + os2?emx*) DLEXT=dll AC_DEFINE(DLEXT, ".dll");; cygwin*|mingw*) DLEXT=so @@ -1007,5 +1007,5 @@ rb_cv_missing_fconvert=yes, rb_cv_missin ;; dnl OS/2 environment w/ Autoconf 2.1x for EMX - os2_emx) + os2?emx) AC_LIBOBJ([os2]) setup=Setup.emx @@ -1047,5 +1047,5 @@ SOLIBS= case "$target_os" in - cygwin*|mingw*|beos*|openstep*|nextstep*|rhapsody*|darwin*|os2_emx*) + cygwin*|mingw*|beos*|openstep*|nextstep*|rhapsody*|darwin*|os2?emx*) DLDLIBS="" ;; @@ -1168,6 +1168,9 @@ case "$target_os" in CFLAGS="$CFLAGS -pipe" ;; - os2_emx) - CFLAGS="$CFLAGS -DOS2" + os2?emx) + CFLAGS="$CFLAGS -DOS2 -Zmts" + LIBRUBY_A=`echo $LIBRUBY_A | sed 's/^lib//'` + LIBRUBY_SO=`echo $LIBRUBY_SO | sed 's/^lib//'` + LIBRUBY_ALIASES=`for i in $LIBRUBY_ALIASES; do echo "$i"; done | sed 's/^lib//'` ;; osf*) @@ -1280,5 +1283,5 @@ case "$target_os" in esac case "$target_os" in - cygwin*|mingw*|*djgpp*|os2_emx*) + cygwin*|mingw*|*djgpp*|os2?emx*) RUBY_LIB_PREFIX="/lib/ruby" ;; @@ -1295,5 +1298,5 @@ AC_ARG_WITH(sitedir, SITE_DIR="`eval \"echo ${sitedir}\"`" case "$target_os" in - cygwin*|mingw*|*djgpp*|os2_emx*) + cygwin*|mingw*|*djgpp*|os2?emx*) RUBY_SITE_LIB_PATH="`expr "$SITE_DIR" : "$prefix\(/.*\)"`" || RUBY_SITE_LIB_PATH="$SITE_DIR";; Index: file.c =================================================================== RCS file: /cvs/ruby/src/ruby/file.c,v retrieving revision 1.154 diff -u -2 -p -r1.154 file.c --- file.c 28 Jul 2003 14:23:12 -0000 1.154 +++ file.c 29 Jul 2003 07:31:22 -0000 @@ -1334,11 +1334,21 @@ rb_file_s_rename(klass, from, to) VALUE klass, from, to; { + const char *src, *dst; SafeStringValue(from); SafeStringValue(to); - if (rename(StringValueCStr(from), StringValueCStr(to)) < 0) { + src = StringValueCStr(from); + dst = StringValueCStr(to); + if (rename(src, dst) < 0) { #if defined __CYGWIN__ extern unsigned long __attribute__((stdcall)) GetLastError(); errno = GetLastError(); /* This is a Cygwin bug */ +#elif defined DOSISH && !defined _WIN32 + if (errno == EEXIST) { + if (chmod(dst, 0666) == 0 && + unlink(dst) == 0 && + rename(src, dst) == 0) + rename INT2FIX(0); + } #endif sys_fail2(from, to); Index: ext/socket/extconf.rb =================================================================== RCS file: /cvs/ruby/src/ruby/ext/socket/extconf.rb,v retrieving revision 1.28 diff -u -2 -p -r1.28 extconf.rb --- ext/socket/extconf.rb 24 Jul 2003 05:18:44 -0000 1.28 +++ ext/socket/extconf.rb 29 Jul 2003 07:45:56 -0000 @@ -195,6 +195,8 @@ have_header("netinet/tcp.h") if not /cyg have_header("netinet/udp.h") -have_struct_member('struct msghdr', 'msg_control', header=['sys/types.h', 'sys/socket.h']) -have_struct_member('struct msghdr', 'msg_accrights', header=['sys/types.h', 'sys/socket.h']) +if have_func("sendmsg") or have_func("recvmsg") + have_struct_member('struct msghdr', 'msg_control', header=['sys/types.h', 'sys/socket.h']) + have_struct_member('struct msghdr', 'msg_accrights', header=['sys/types.h', 'sys/socket.h']) +end $getaddr_info_ok = false Index: ext/socket/socket.c =================================================================== RCS file: /cvs/ruby/src/ruby/ext/socket/socket.c,v retrieving revision 1.96 diff -u -2 -p -r1.96 socket.c --- ext/socket/socket.c 25 Jul 2003 05:36:51 -0000 1.96 +++ ext/socket/socket.c 29 Jul 2003 07:47:30 -0000 @@ -1509,5 +1509,5 @@ unix_send_io(sock, val) VALUE sock, val; { -#if defined(HAVE_ST_MSG_CONTROL) || defined(HAVE_ST_MSG_ACCRIGHTS) +#if defined(HAVE_SENDMSG) && (defined(HAVE_ST_MSG_CONTROL) || defined(HAVE_ST_MSG_ACCRIGHTS)) int fd; OpenFile *fptr; @@ -1575,5 +1575,5 @@ unix_recv_io(argc, argv, sock) VALUE sock; { -#if defined(HAVE_ST_MSG_CONTROL) || defined(HAVE_ST_MSG_ACCRIGHTS) +#if defined(HAVE_RECVMSG) && (defined(HAVE_ST_MSG_CONTROL) || defined(HAVE_ST_MSG_ACCRIGHTS)) VALUE klass, mode; OpenFile *fptr; @@ -1818,5 +1818,5 @@ setup_domain_and_type(domain, dv, type, static VALUE -sock_init(sock, domain, type, protocol) +sock_initialize(sock, domain, type, protocol) VALUE sock, domain, type, protocol; { @@ -2484,5 +2484,5 @@ Init_socket() rb_cSocket = rb_define_class("Socket", rb_cBasicSocket); - rb_define_method(rb_cSocket, "initialize", sock_init, 3); + rb_define_method(rb_cSocket, "initialize", sock_initialize, 3); rb_define_method(rb_cSocket, "connect", sock_connect, 1); rb_define_method(rb_cSocket, "bind", sock_bind, 1); -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦