〜2002年8月下旬〜
0.18からlibm2.Sが加わってfrexpが使えるようになった。 でもlibm2.Sはsqrtだの一緒くたになっていて、 同時に参照するとmultiple definitionになってしまう。 うーむ。また余計な仕事を増やしてくれるなあ。
% cat foo.c #include <math.h> main() { int i; frexp(sqrt(1.0), &i); } % diet gcc foo.c -lm /opt/diet/lib-i386/libm.a(libm2.o): In function `sqrt': libm2.o(.text+0x7): multiple definition of `sqrt' /opt/diet/lib-i386/libm.a(sqrt.o)(.text+0x0): first defined here collect2: ld returned 1 exit status
あ、diet libcのfrexpを使わなきゃいいのか。
更新。
なんとなく 呼ばれたような気がした ので Forwarding DLL を用意してみた。
Googleしてみたら この文書 が見つかった。やっぱcloneしなきゃだめなんだ。
変更セットのコンセプトの後に、さらに追い討ちをかけることにな るが、複数のソーススリーのコピーを持つことに慣れてほしい。こ れは、一部の人にとっては、*本当に*慣れるのが大変だ。ソースツ リーを分けることは、BitKeeper では、メジャーおよびマイナーの 並行した複数の開発ラインを線引して管理することを意味している。 CVSでいうブランチは、分離されたソースツリーになるが、 BitKeeperの用語では、"クローン"[Heh, or Star Wars]になる。
xpad 1.5 をmakeしようとしたらGTK+ 2を要求された。 最近ちらほらそういうソフトも出てきたのでインストールすることにした。 1.2.xが上書きされたら困ると思っていたら、 -2.0がsuffixされてるので問題ないようだ。 その前にglib, atk, pangoが必要。
gtk+-2.0.6をmakeしてみたら、1時間経っても終わらない。 いや、最近のソフトはみんなでかいね。結局1時間半かかった。
ruby-talk MLで話題になっているが、 JudySL というのがRubyのstより速いhashらしい。
最低限何が必要なのか調べてみる。
% cd src/JudySL % gcc -I../JudyCommon -I.. -c JudySL.c % nm --undefined JudySL.o|grep Judy JudyLDel JudyLFirst JudyLFreeArray JudyLIns JudyLLast JudyLNext JudyLPrev __JudyLGet
結構依存してるんだな。
specsが間違ってるなあ。gcc-2 -mno-cygwinでRubyのwin32/win32.cがエラーになる。 _cdeclがエラーだ。__cdeclはエラーにならない。 specsのその部分はこうなっている。
%(cpp_cpu) %{posix:-D_POSIX_SOURCE} \ -D__stdcall=__attribute__((__stdcall__)) \ -D__fastcall=__attribute__((__fastcall__)) \ -D__cdecl=__attribute__((__cdecl__)) \ %{!ansi:-D_stdcall=__attribute__((__stdcall__)) \ -D_fastcall=__attribute__((__fastcall__))} -D_cdecl=__attribute__((__cdecl__))} \ -D__declspec(x)=__attribute__((x)) \
2.95.3-5はこうなっていた。
%(cpp_cpu) %{posix:-D_POSIX_SOURCE} \ -D__stdcall=__attribute__((__stdcall__)) \ -D__fastcall=__attribute__((__fastcall__)) \ -D__cdecl=__attribute__((__cdecl__)) \ %{!ansi:-D_stdcall=__attribute__((__stdcall__)) \ -D_fastcall=__attribute__((__fastcall__)) \ -D_cdecl=__attribute__((__cdecl__))} \ -D__declspec(x)=__attribute__((x)) \
なるほど。これか。
-D_fastcall=__attribute__((__fastcall__))}
ここで閉じてるからだ。 対応が取れてないんだからその時点でエラーになって欲しいね。
diet-dynを使わないとdlopen(3)が使えないことが判明。 dietコマンドは-staticをつけるが、 diet libcにはlibdl.aはなくlibdl.soしかない。 でも、getenvでSEGVってしまうんだな。うーむ。
getenvが怪しいというわけで実験。
% echo 'main(){getenv("FOO");}' > foo.c % diet-dyn foo.c % ./a.out zsh: segmentation fault ./a.out
だめじゃん。diet-dynがバグバグってことはstaticにlinkするしかないか?
i386/getenv.Sじゃなくてlib/getenv.cを使ってみる。okだ。 i386/getenv.SはPICになってないってことか。
-ldlをlinkすると
libdl.so used.
と標準エラーに吐かれて非常に欝陶しい。
あ、今度はrubyを作るところで.endeがundefと文句言われた。
% nm -o /opt/diet/lib-i386/*.a|grep 'U \.ende'
してみるとcosh.o,sinh.o,tanh.oのようだ。ソースを見ると
.Lende: .size cosh,.ende-cosh
てな感じで、ラベル名が間違ってる。それぞれ
.size cosh,.Lende-cosh
と変更してやっとrubyまでできた。
% ./ruby -v libdl.so used. ruby 1.7.2 (2002-08-24) [i386-linux]
どちらも同じ引数を取るような気もするが、 AC_CHECK_PROGSだけ複数形なのはやはり意味があったようだ。 というわけで
AC_CHECK_TOOL(AR, ar) if test -z "$AR"; then AC_CHECK_PROGS(AR, aal, ar) fi
としてみた。
10日以上経つがGCC 2.95.3でmakeしたkernelは快調だ。 やはりGCC 3.xだとまだやばいようだ。
偶然なのか結構いいタイミングでmswin32/mingw32のDLL共通化ができたようだ。
@ xmlrpc4r [prev] version: 1.7.11-1 install: ext/xmlrpc4r-1.7.11-1.tar.gz 63820 [curr] version: 1.7.9-1 install: ext/xmlrpc4r-1.7.9-1.tar.gz 62938
と間違ってる。単純にsortしてるからだ。 こんなものを考えてみた。
% cat versions.rb class Versions include Comparable def self.[](v) self.new v end def initialize(v) @version = v end def to_a @version.scan(/\d+/).map{|x| x.to_i} end def <=>(other) self.to_a <=> other.to_a end end if __FILE__ == $0 require 'test/unit' class TC_Versions < Test::Unit::TestCase def test_01 assert([1, 2], Versions["1.2"].to_a) end def test_02 assert(Versions["1.2"] < Versions["1.10"]) end def test_03 assert(Versions["1.2.1"] < Versions["1.10"]) end def test_04 assert(Versions["1.02.1"] == Versions["1.2.1"]) end def test_05 assert(Versions["1.2"] < Versions["1.2.1"]) end end end
と、ここまで作って、 ほとんど同じもの が存在することに気づく。 []まで考えてるとこが同じというか、Test::Unitを使うとこまで同じか。 version.rb のほうはまじめに比較しているが、versions.rbは Array#<=>に帰着させている。
結局のところRubyには使えないってこと?
更新。
なぜかmakeがエラーになってしまう。
compiling dl .../ext/dl/extconf.rb:148:in `initialize': [unknown error] - \ "dlconfig.h" (Errno::E125)
[unknown error]あたりが謎だが、該当する行は
open(file){|f|f.read} == str
だ。なんで?
% ./miniruby -e 'p open("foobar")' libdl.so used. -e:1:in `initialize': [unknown error] - "foobar" (Errno::E125) from -e:1:in `open' from -e:1
errnoがおかしい。
% cat foobar.c #include <stdio.h> extern int errno; main() { fopen("foobar", "r"); printf("%d\n", errno); } % diet-dyn gcc foobar.c % ./a.out 0 % diet gcc foobar.c /opt/diet/lib-i386/libc.a(vprintf.o): In function `vprintf': vprintf.o(.text+0x53): warning: the printf functions add several kilobytes of bloat. /opt/diet/lib-i386/libc.a(fwrite.o): In function `fwrite': fwrite.o(.text+0x4b): warning: your code uses stdio (7+k bloat). % ./a.out 2
うーむ。diet-dynは使いものにならないな、こりゃ。 となるとdietコマンドを使わざるを得ないわけで、 Ruby/DLは使えないという結論に。だから sizeof(FILE)の件は気にしなくてもいいのかもしれない。でも気になる。
先週returnの話であちこち盛り上がっていたが、 returnってなぜかretrunと打ってしまうことが多い。 makeもmkaeやamkeになることがある。 これってどっちも右手左手交互に打つパターンなんだよね。 だからそのタイミングがちょっとずれると2回連続で同じほうの手で打ってしまい、 retrunやmkaeになるようだ。
retrunでgoogleするとこれまた山のようにヒットする。 もしやと思いRubyのChangeLogを調べてみると、やはりあった。
% grep retrun ChangeLog * process.c (rb_proc_times): need not to check retrun value from block retruns true for any of elements.
次の機会にでも直しておこう。
autoconfの代わりになるものらしい。が、かなり趣きが違う。
□ Buildtool needs to be installed beforehand on any system before you can build a buildtool-ized package. This avoids the inclusion of really huge configure (autoconf) and Makefile.in (automake) scripts in your source package.
前もってインストールしておかないといけないの?
vimにもstrftimeぐらいはあるだろうと調べたらやはりあった。 というわけでChangeLogのためのmapを書いてみた。
map ch 1Gi<C-R>=strftime("%a %b %e %X %Y WATANABE Hirofumi <eban@ruby-lang.org>\n\n\n\n")<CR><UP><UP><TAB>*