なかだです。

At Fri, 30 Aug 2002 08:23:53 +0900,
U.Nakamura <usa / osb.att.ne.jp> wrote:
> CVSにあるShimをVC++5でmakeしようとしたところ、いくつか問題に
> 遭遇したので、パッチです。これでいいのかなぁ。
> 
> (1) ext/features/ruby18/fileで、リンクに失敗する。
>     → user32.libの有無をチェックし、あればリンクするように

これはCONFIG["LIBS"]もリンクするようにしたほうがいいんじゃない
でしょうか。現にtry_linkなどではリンクしてます。

> (2) ext/stringioで、コンパイルエラー。
>     → VC++5が悪い気がしますが、括弧を追加

参考演算子よりも代入のほうが優先度が高いはずですが、どんなエラー
になるんでしょうか。ちなみにVC6ではエラーにならないようです。

stringioに関しては、他にも不具合がありました。

(a) new NORETURNがnoになる。
    egrep_cppでパイプを使っているために、command.comのせいで結
    果が分からない。

(b) VCだとrb_io_addstrなどのhave_funcが軒並noになる。
    これはextconf.rbチェック前にCONFIG["LIBRUBYARG"]を$libsに追
    加してやるべきなのでしょうが、逆になぜgccでyesになるかとい
    うと、t()の中で関数ポインタをローカル変数に代入しているだけ
    なので、最適化で消されてしまうようです。


Index: mkmf.rb =================================================================== RCS file: /cvs/ruby/src/ruby/lib/mkmf.rb,v retrieving revision 1.89 diff -u -2 -p -r1.89 mkmf.rb --- mkmf.rb 23 Aug 2002 08:18:19 -0000 1.89 +++ mkmf.rb 30 Aug 2002 01:00:08 -0000 @@ -109,9 +109,11 @@ def xsystem command $stderr.reopen($log) $stdout.reopen($log) - puts command - r = system(command) - $stderr.reopen($orgerr) - $stdout.reopen($orgout) - return r + begin + puts command + system(command) + ensure + $stderr.reopen($orgerr) + $stdout.reopen($orgout) + end end @@ -161,6 +163,15 @@ def egrep_cpp(pat, src, opt="") cfile.print src cfile.close + if Regexp === pat + src = pat.source + else + pat = Regexp.new(src = pat) + end begin - xsystem(Config.expand(format(CPP, $CPPFLAGS, $CFLAGS, opt))+"|egrep #{pat}") + xsystem(Config.expand("|"+format(CPP, $CFLAGS, $CPPFLAGS, opt))) do |f| + puts(" #{src}") + f.grep(pat) {return true} + end + false ensure rm_f "conftest*" @@ -325,5 +336,5 @@ SRC r = try_link(src + <<"SRC", libs) int main() { return 0; } -int t() { void ((*p)()); p = (void ((*)()))#{func}; return 0; } +int t() { void ((*volatile p)()); p = (void ((*)()))#{func}; return 0; } SRC end @@ -460,5 +471,5 @@ def create_makefile(target, srcprefix = $DLDFLAGS = CONFIG["DLDFLAGS"] - $libs = CONFIG["LIBRUBYARG"] + " " + $libs + $libs = CONFIG["LIBRUBYARG"] + " " + $libs + CONFIG["LIBS"] $configure_args['--enable-shared'] or $LIBPATH |= [$topdir] $LIBPATH |= [CONFIG["libdir"]]
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦