Siena. です。

▼ nobu.nakada さん < [ruby-dev:22399]> (1) EXTFLAGS が引数無しの "-L" に展開され、main.o がリンクされない> "$(libdir)" が正しく展開されるように変更するのが本筋かと思いますが、> とりあえずの対症療法として $extpath から "$(libdir)" を削除しました。これは、makeまで$(libdir)のまま渡されて、makeによって展開される

はい、そうなるべきだと思っています。

》のが正しい姿でしょう。そう考えれば、mkmf.rbのString#quoteでシングルクォートを使うようにすべきかも知れませんが、humanとmacosが

mkmf.rb:String#quote ではなく、mkmf.rb:libpathflag の方ですね。
ここをシングルクォートで囲むように変更して、ビルドが成功するのを
RUBYSHELL=sh.exe と RUBYSHELL=cmd.exe の両方で確認できました。


--- lib/mkmf.rb.org Fri Dec 19 08:01:04 2003 +++ lib/mkmf.rb Sat Dec 27 07:44:40 2003 @@ -236,5 +236,5 @@ end def libpathflag(libpath=$LIBPATH) libpath.map{|x| - (x == "$(topdir)" ? LIBPATHFLAG : LIBPATHFLAG+RPATHFLAG) % %["#{x}"] + (x == "$(topdir)" ? LIBPATHFLAG : LIBPATHFLAG+RPATHFLAG) % %['#{x}'] }.join end
できれば、OS/2 EMXでも引数を配列で渡せばシェルを通さないようにしたほうがいいんでしょうけどねぇ。 えぇと。process.c:rb_f_system() と missing/os2.c:do_spawn()、 ここを直しておかないといけませんね。TODO に加えておきます。 なるほど、ここでエラーになっていたとは。 何故 /bin/sh が絡むのか不思議だったのですが、ようやく分かりました(鈍) シェル経由での実行になっていて、sh が $(...) を展開しようとしていると。 確かに、シェルを cmd.exe に変えて、変更前の extmk.rb, mkmf.rb で RUBYSHELL=cmd.exe make とした場合には上記の問題は出ませんでした。 》> (2) $extlibs の重複除去のため、EXTLIBS の正しいリンク順が破壊される> ライブラリ a が b に依存する場合に、リンク時のコマンドでオプションの> 指定順は "-la -lb" とせねばならず、"-lb -la" とはできないようです。 》 》これはUnix系のldでは標準的な動作ですが、重複するライブラリを使うものはないだろうと思って手を抜いてしまいました。 なる ^^; 手元では片っ端から静的リンクしている関係で、厳しいようです。 その組合せの順序によって readline.a で undefined symbols になったり ncurses.a や termcap.a で multiply defined になったりします。 》> 上記の変更のために、重複した時にこの逆転が起きてしまっています。> パッチでは、新規追加分を $extlibs の左側に追加するようにしました。 》 》入れ換えただけでは、逆にすでに$extlibsにあるものの順序が保証されないでしょう。真面目にやるならこんなとこ? 確かにそうですね。単純な場合しか考えていませんでした。 》def merge_libs(*libs)libs.inject([]) do |l, r|i = 0(r & l).each do |c|j = r.index(c)l.insert(l.rindex(c), *r[i...j])i = j + 1endl.concat(r[i..-1])endend これでも不十分で、次のようなテストが通りません。 def test_reversal() array = merge_libs( %w[ a b c ], %w[ c d a ] ) assert_in_order( array, "a", "b" ) assert_in_order( array, "c", "d" ) ## assume that a and c have no dependency end で、もう少し考えて、挿入位置を常に先に進めるようにしてみました。 前に戻ってしまう場合には、直前の挿入位置に追加しています。 これで、x, y 両方の順序が保たれると思いますがいかがでしょうか。 def merge_libs( *libs ) libs.inject( [] ){ |x,y| xy = x & y xn = yn = 0 y.each_with_index do |v,yi| if( xy.include? v ) xi = [ x.index( v ), xn ].max() x[ xi, 1 ] = y[ yn .. yi ] xn, yn = xi + ( yi - yn + 1 ), yi + 1 end end x.concat( y[ yn .. -1 ] || [] ) } end --- Siena. <mailto:siena / faculty.chiba-u.jp>