From: nobu.nakada@... Date: 2002-08-30T10:07:00+09:00 Subject: [ruby-dev:18105] Re: Shim with VC++5 なかだです。 At Fri, 30 Aug 2002 08:23:53 +0900, U.Nakamura 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はできる。 中田 伸悦