From: NISHIMATSU Takeshi Date: 2003-07-12T00:12:51+09:00 Subject: [ruby-dev:20634] Re: compiling Ruby on AIX (powerpc-ibm-aix4.3.3.0) and Alpha OSF/1 (alphaev67-dec-osf5.1) 西松です. お返事が遅くなり申し訳ありません. [ruby-dev:20623]でなかださん: > > ● AIX (powerpc-ibm-aix4.3.3.0) > > CC=ccでコンパイル, テストとも成功しました. > > CC=gccだと、どうでしょうか。たぶんこのパッチでいけるんじゃない > かと思うんですが。 当サイトのAIXへの gcc(version 2.95.2)のインストール のしかたが悪いのか -brtl オプションがあるとダメでした. また, ext/curses/, ext/digest/, ext/zlib/ がコンパイル できませんでした. 参考にならなくて申し訳ないです. たぶん一般的にはあててはいけないパッチ: --- ../ruby-1.8.0-2003-07-09-snapshot/configure.in Mon Jul 7 17:28:19 2003 +++ ./configure.in Fri Jul 11 13:40:34 2003 @@ -826,9 +826,9 @@ rb_cv_dlopen=yes ;; aix*) LDSHARED='/usr/ccs/bin/ld' XLDFLAGS='-Wl,-bE:ruby.imp' - DLDFLAGS='-brtl -eInit_$(TARGET) -bI:$(topdir)/ruby.imp -bM:SRE -T512 -H512 -lc' - LDFLAGS="-brtl" - test $GCC = yes || ARCHFILE="ruby.imp" + DLDFLAGS='-eInit_$(TARGET) -bI:$(topdir)/ruby.imp -bM:SRE -T512 -H512 -lc' + LDFLAGS="" + ARCHFILE="ruby.imp" rb_cv_dlopen=yes ;; human*) DLDFLAGS='' > > ● Alpha OSF/1 (alphaev67-dec-osf5.1) > > CC=gcc > > --disable-ipv6 で. > > % gcc --version > > 2.95.2 > > % uname -srvm > > OSF1 V5.1 1885 alpha > > 拡張ライブラリdbmとsocketでつまづきました. > > > > dbm.cの DBM * を引数としている関数(dbm_fetch(dbm, key)など) > > でことごとく > > ext/dbm/dbm.c:154: incompatible types in assignment > > などというコンパイルエラーになります. うまく直せなかったので, > > ext/dbm/を rm -r してコンパイルを続行しました. > > assignmentということは、戻り値がdatumと違うのかも知れません。 > ext/dbm/MakefileのCFLAGSで、DBM_HDRは何と設定されているでしょう > か。また、そのヘッダでdbm_fetch()などのプロトタイプはどうなって > いるでしょう。 /usr/include/ndbm.h: #if defined(_XOPEN_SOURCE_EXTENDED) && !defined(_LIBC_POLLUTION_H_) #ifdef __DECC #pragma extern_prefix "_E" #else #define dbm_fetch(__a,__b) _Edbm_fetch(__a,__b) #define dbm_firstkey(__a) _Edbm_firstkey(__a) #define dbm_nextkey(__a) _Edbm_nextkey(__a) #define dbm_do_nextkey(__a,__b) _Edbm_do_nextkey(__a,__b) #define dbm_forder(__a,__b) _Edbm_forder(__a,__b) #define dbm_delete(__a,__b) _Edbm_delete(__a,__b) #define dbm_store(__a,__b,__c,__d) _Edbm_store(__a,__b,__c,__d) #endif #endif /* _XOPEN_SOURCE_EXTENDED && !_LIBC_POLLUTION_H_ */ extern datum __R(dbm_fetch) __((DBM *, datum)); extern datum __R(dbm_firstkey) __((DBM *)); extern datum __R(dbm_nextkey) __((DBM *)); extern datum __R(dbm_do_nextkey) __((DBM*, datum)); /* Obsolete */ extern long __R(dbm_forder) __((DBM *, datum)); extern int __R(dbm_delete) __((DBM *, datum)); extern int __R(dbm_store) __((DBM *, datum, datum, int)); でしたので, わけもわからず -D_XOPEN_SOURCE_EXTENDED をつけて みましたところOKのようです. > > ext/socket/ のでもコンパイルが止まりました. 作られる > > ext/socket/Makefile の -Dss_familly=__ss_familly > > を削り, -DHAVE_SOCKADDR_STORAGE を付け加えるとコンパイル > > に成功しました. ext/socket/extconf.rb を直せばよいと思うの > > ですが... > > 前者は以前から話が出てますが、後者はどのようにチェックに失敗し > てるのでしょうか。詳細はmkmf.logを見れば分かるはずです。 ss_familly が原因のようです. mkmf.log の一部: gcc -o conftest -I/tmp_mnt/home/t-nissie/COMMON/work/ruby/ruby-1.8.0-2003-07-09-snapshot/alphaev67-dec -I/tmp_mnt/home/t-nissie/COMMON/work/ruby/ruby-1.8.0-2003-07-09-snapshot -Dss_family=__ss_family -Dss_len=__ss_len -mieee -g -O2 conftest.c -L/tmp_mnt/home/t-nissie/COMMON/work/ruby/ruby-1.8.0-2003-07-09-snapshot/alphaev67-dec -L/home/t-nissie/OSF1/lib -lruby-static -lm -lc conftest.c: In function `main': conftest.c:15: structure has no member named `ss_family' checked program was: /* begin */ #ifdef _WIN32 # include # include #else # include # include # include # include #endif int main() { struct sockaddr_storage ss; ss.ss_family; return 0; } /* end */ パッチです: ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー --- ext/socket/extconf.rb.orig Fri Jul 11 22:39:42 2003 +++ ext/socket/extconf.rb Fri Jul 11 22:42:42 2003 @@ -1,6 +1,11 @@ require 'mkmf' -$CPPFLAGS += " -Dss_family=__ss_family -Dss_len=__ss_len" +case RUBY_PLATFORM +when /alpha.*-osf.*/ + # Keep ss_family itself. ss_len is not in use. +else + $CPPFLAGS += " -Dss_family=__ss_family -Dss_len=__ss_len" +end case RUBY_PLATFORM when /bccwin32/ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 長くなりますが, alphaev67-dec-osf5.1:/usr/include/sys/socket.h の struct sockaddr の部分と, 上のパッチをあてたときのプリプロ セス後のその部分です. /* BSD4.3 */ のほうが有効になっていました. #if defined(_SOCKADDR_LEN) || \ defined(_KERNEL) || \ defined(_XOPEN_SOURCE_EXTENDED) || \ defined(_POSIX_PII_SOCKET) /* * Structure used by kernel to store most * addresses. */ struct sockaddr { unsigned char sa_len; /* total length */ sa_family_t sa_family; /* address family */ char sa_data[14]; /* actually longer; address value */ }; #ifdef _OSF_SOURCE /* * 4.3 compat sockaddr, move to compat file later */ struct osockaddr { unsigned short sa_family; /* address family */ char sa_data[14]; /* up to 14 bytes of direct address */ }; #define _SS_PAD1SIZE (_SS_ALIGNSIZE - (sizeof (uchar_t) + sizeof(sa_family_t))) #define _SS_PAD2SIZE (_SS_MAXSIZE - ( 2 * _SS_ALIGNSIZE)) struct sockaddr_storage { unsigned char ss_len; /* address length */ sa_family_t ss_family; /* address family */ #define __ss_len ss_len #define __ss_family ss_family char __ss_pad1[_SS_PAD1SIZE]; /* pad to allignment field */ ulong_t __ss_align; /* force structure allignment */ char __ss_pad2[_SS_PAD2SIZE]; /* pad to desired size */ }; #endif /* _OSF_SOURCE */ #else /* BSD4.3 */ struct sockaddr { unsigned short sa_family; /* address family */ char sa_data[14]; /* up to 14 bytes of direct address */ }; #define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (ushort_t)) #define _SS_PAD2SIZE (_SS_MAXSIZE - ( 2 * _SS_ALIGNSIZE)) struct sockaddr_storage { unsigned short ss_family; /* address family 4.3 BSD */ #define __ss_family ss_family char __ss_pad1[_SS_PAD1SIZE]; /* pad to allignment field */ ulong_t __ss_align; /* force structure allignment */ char __ss_pad2[_SS_PAD2SIZE]; /* pad to desired size */ }; #endif /* BSD4.3 */ プリプロセス後: % gcc -E -fPIC -Dsocklen_t=int -I. -DHAVE_SOCKADDR_STORAGE -mieee -g -O2 -I. -I/tmp_mnt/home/t-nissie/COMMON/work/ruby/ruby-1.8.0-2003-07-10-snapshot/alphaev67-dec-osf5.1 -I/tmp_mnt/home/t-nissie/COMMON/work/ruby/ruby-1.8.0-2003-07-10-snapshot -I/tmp_mnt/home/t-nissie/COMMON/work/ruby/ruby-1.8.0-2003-07-10-snapshot/ext/socket -DHAVE_NETINET_TCP_H -DHAVE_NETINET_UDP_H -DHAVE_ST_MSG_ACCRIGHTS -DHAVE_INET_NTOP -DHAVE_INET_PTON -DHAVE_GETSERVBYPORT -DHAVE_ARPA_INET_H -DHAVE_ARPA_NAMESER_H -DHAVE_RESOLV_H -DHAVE_SYS_UN_H -DHAVE_SYS_UIO_H -DHAVE_SOCKET -DHAVE_GETHOSTNAME -c /tmp_mnt/home/t-nissie/COMMON/work/ruby/ruby-1.8.0-2003-07-10-snapshot/ext/socket/socket.c . . . # 243 "/usr/include/sys/socket.h" 3 struct sockaddr { unsigned short sa_family; char sa_data[14]; }; struct sockaddr_storage { unsigned short ss_family; char __ss_pad1[((sizeof (long)) - sizeof (ushort_t)) ]; ulong_t __ss_align; char __ss_pad2[(128 - ( 2 * (sizeof (long)) )) ]; }; . . .