[#39671] Ruby 1.8.1 on SX-6 — Masaki Hasegawa <masaki-h@...4u.or.jp>

はじめまして、長谷川 と申します。

16 messages 2004/05/19
[#39673] Re: Ruby 1.8.1 on SX-6 — Tanaka Akira <akr@...17n.org> 2004/05/19

In article <20040519.205107.102564296.suuchi29@naps.kishou.go.jp>,

[ruby-list:39679] Re: Ruby 1.8.1 on SX-6

From: Masaki Hasegawa <masaki-h@...4u.or.jp>
Date: 2004-05-19 16:14:05 UTC
List: ruby-list #39679
長谷川 です。

> > なので、正しくは
> 
> どちらも検出されないようにすることでしょう。mkmf.logの該当部分
> を見せてもらえませんか。

そのままですと、mkmf.log の該当部分は以下のようになります。

--------------------

have_struct_member: checking for struct msghdr.msg_control... -------------------- yes

"cc -c -I/home/XXXX/ruby-1.8.1 -I/home/XXXX/ruby-1.8.1
-Dss_family=__ss_family -Dss_len=__ss_len -g   conftest.c"
checked program was:
/* begin */

#include <sys/types.h>
#include <sys/socket.h>

/*top*/
int main() { return 0; }
int s = (char *)&((struct msghdr*)0)->msg_control - (char *)0;
/* end */

--------------------

have_struct_member: checking for struct msghdr.msg_accrights... -------------------- no

"cc -c -I/home/XXXX/ruby-1.8.1 -I/home/XXXX/ruby-1.8.1
-Dss_family=__ss_family -Dss_len=__ss_len -g   conftest.c"
"conftest.c", line 7: fatal(136): struct "msghdr" has no field "msg_accrights"
  int s = (char *)&((struct msghdr*)0)->msg_accrights - (char *)0;
                                        ^

"conftest.c", line 7: fatal(41): expression must have arithmetic or pointer
          type
  int s = (char *)&((struct msghdr*)0)->msg_accrights - (char *)0;
                  ^

checked program was:
/* begin */

#include <sys/types.h>
#include <sys/socket.h>

/*top*/
int main() { return 0; }
int s = (char *)&((struct msghdr*)0)->msg_accrights - (char *)0;
/* end */

--------------------

マニュアルには

>   SUPER-UX  does  not  support  msg_control.

とあるくせに、困ったことに msghdr のメンバに msg_control が
ちゃんと? 入っているのでした。かくして HAVE_ST_MSG_CONTROL が
define されてしまいます。ext/socket/socket.c は
HAVE_ST_MSG_CONTROL なときには struct cmsghdr があるものと
して書かれているのですが、SX にはこの構造体がなく、コンパイル
エラーとなります。

ちょっと汚いですが、extconf.rb の問題の箇所をとりあえず

!  have_struct_member('struct msghdr', 'msg_control', ['sys/types.h', 'sys/socket.h']) if not /sx6-superux/ =~ RUBY_PLATFORM

として回避し、コンパイルできるようになりましたが、
いかがでしょうか?

In This Thread