〜2002年7月下旬〜
patchlevel.hは予想通りだったが、make testは結局変わらず。 logを見比べてみると、ひとつ見落としがあった。うーむ。
ext/B/t/o............................# Failed at ../ext/B/t/o.t line 45 # got '(foo) <bar>' # expected '[Compiling!' FAILED at test 7
例えばgccを例に挙げると
--target=i686-pc-cygwin --host=i686-pc-cygwin --build=i686-pc-linux
ならCygwin用のgccをCygwin上で動くようにLinux上で作るという意味になります。 実際Cygwinのパッケージはこのオプションで作られてます。
--target=i686-pc-cygwin --host=i686-pc-linux --build=i686-pc-linux
ならCygwin用のクロスのgccをLinux上で動くようにLinux上で作るという意味。 この場合はhostとbuildが共通なので省略可能。
--target=sh-elf --host=i686-pc-cygwin --build=i686-pc-linux
ならsh-elf用のクロスのgccをCygwin上で動くようにLinux上で作るという意味。
hostとbuildが違うときは、 --hostで指定したプラットフォーム用のクロスコンパイラが必要。 そのままコマンドのprefixになります。
で、Ruby Binariesの場合は
--target=i386-cygwin --host=i686-pc-cygwin --build=i586-pc-linux-gnu --target=i386-mingw32 --host=i686-pc-cygwin --build=i586-pc-linux-gnu --target=i386-msddosdjgpp --host=i586-msdosdjgpp --build=i586-pc-linux-gnu
となってます。
% cat HelloWorld.java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } } % gcj --main=HelloWorld -Os -o hello HelloWorld.java % ./hello Hello World
--main=が必要らしい。サイズは
% ls -l hello.exe -rwxr-xr-x 1 watanabe ruby 2145601 Jul 23 13:47 hello.exe
と、とんでもなくでかい。stripすると1.3MBぐらいになる。 最適化しないと余計な.stabsが残ってasが文句を言う。
% gcj --main=HelloWorld -o hello HelloWorld.java /tmp/ccGZQxBb.s: Assembler messages: /tmp/ccGZQxBb.s:26: Warning: .stabs: description field '40002' too big, try a different debug format /tmp/ccGZQxBb.s:76: Warning: .stabs: description field '10001' too big, try a different debug format
Warningだから気にしなければいいのかもしれないけど。
そういうもの だったのか。じゃ、jcode.rbも
module Jcode module String ... end end
という構成にすればいいわけだ。早速実験。
% cat foo.rb #!/usr/local/bin/ruby -Ke require 'scope-in-state' module Jcode module String def chop "chop" end end end ScopeJcode = ScopeInState.new(Jcode) p 'あい'.chop ScopeJcode.scope_in do p 'あい'.chop end p 'あい'.chop % ruby foo.rb "あ\244" "chop" "あ\244"
なるほど。original_succ!とかのaliasをやめればいけそうだ。
いつの間にかdefaultが-sになってる。なぜ?
staticにlinkするとさらに1MBほど増えます。
--enable-static-link --enable-minimal-configで作ってみる。 COND_COMMAND, DPAREN_ARITHMETIC, ARITH_FOR_COMMANDを見ないとまずいね。 #if definedしとこう 。
Changes: A security patch was applied to solve the famous /tmp/AdobeFnt06.lst.VUID security problem reported in http://online.securityfocus.com/archive/1/278984.
今回問題になっているのは、Regexp.quoteのバグと、 RegexpとStringが使える場所でStringを使ったときにquoteするという仕様変更。 困ったことにChangeLogには書かれてない。 バグのほうはruby自身を直せばいいだけだが、 仕様変更のほうはスクリプトを直さないといけない。
% ruby-1.7.2 -e 'p Regexp.quote("1.7")' "\\.7" % ruby-1.7.2 -e 'p "a" =~ "^a"' nil % ruby-1.7.2 -e 'p "^" =~ "^"' 0 % ruby-1.7.2 -e 'p "a" =~ /^a/' 0 % ruby-1.7.2 -e 'p "a".sub("^", "#")' -e:1: warning: string pattern instead of regexp; \ metacharacters no longer effective "a" % ruby-1.7.2 -e 'p "^".sub("^", "#")' -e:1: warning: string pattern instead of regexp; \ metacharacters no longer effective "#" % ruby-1.7.2 -e 'p "a".sub(/^/, "#")' "#a"
で、あちこちにあるわけだ。 気づいた2つはcommitされた直後に直したんだけど、 報告されてるようにまだ残ってる。
% mkdir linux; cd linux % CFLAGS=-Os CXXFLAGS=-Os ../configure --enable-languages=c,c++ \ --with-system-zlib --enable-sjlj-exceptions --enable-threads % time bootstrap make bootstrap 21117.96s user 877.51s system 98% cpu 6:11:03.86 total
--enable-static-link --enable-minimal-configだとstripしても
% ls -l bash -rwxr-xr-x 1 watanabe ruby 611816 Jul 28 19:09 bash
と、ちっともminimalじゃない。staticならやっぱdietlibcだよね。 dietlibcにはlocaleはないので
% mkdir diet % ac_cv_func_setlocale=no ac_cv_header_locale_h=no \ ac_cv_header_strings_h=no CFLAGS=-Os CC='diet gcc -nostdinc' \ ../configure --enable-static-link --enable-minimal-config \ --prefix=/usr --bindir=/bin
としてみた。<strings.h>は
#warning "your code included obsolescent <strings.h>. \ Please change that to <string.h>!" #include <string.h>
となっててうるさいのでないものとして扱うことにする。 なぜかlocale.cは一部無条件でsetlocaleしてる場所があったので、 quick hack 。 結果はstripしてこのくらい。
% ls -l bash -rwxr-xr-x 1 watanabe ruby 218688 Jul 28 19:20 bash
更新。
ext/configsub.rbを使えばいい気がしてきた。 特にmswin32専用ってわけでもないし。
更新。
mingw32版でRUBY_TCL_DLLとRUBY_TK_DLLを設定するとエラーになると報告が来た。
When trying to use tcltklib (require 'tcltklib') I get the following error: F:/MINGW/USR/LOCAL/lib/ruby/1.6/tk.rb:7:in `require': tcltklib: \ tcltk_stubs init error (-2) (LoadError)
確かにこうなるね。 -2というのはGetProcAddress("Tcl_CreateInterp")してるところで(ext/tcltklib/stubs.c)、 つまりこのシンボルは存在しないという意味だ。 LoadLibraryの結果を見るとなぜかtcl83.dllもtk83.dllも同じになってる。 ということはLoadLibraryに同じ文字列を渡していることを意味する。 で、思い出した。win32_getenvは毎回allocateしないようになったのだった。
ruby_tcl_dll = getenv("RUBY_TCL_DLL"); ruby_tk_dll = getenv("RUBY_TK_DLL");
だと、後から呼んだgetenvで上書きされてしまう。盲点だな。 strdupして解決。 stubs的にはDLLへPATHだけ通しておけばokなので、 とりあえずそれで我慢してねと返信。
PATHだけのほうが簡単なのでお勧めなのだが、 なぜかRUBY_TCL_DLLとRUBY_TK_DLLを使いたがる人が多い。
configではgcc --versionじゃなくてgcc -dumpversionを使うようになった。 なるほど。これでGCC 3.1.1でも大丈夫だ。
src/ChangeLog-9395を見ると
Tue Dec 19 17:45:11 1995 Karl Fogel <kfogel@floss.cyclic.com>
らしい。裏を取ってみると確かにlogin.cの1.21で 追加されてる 。