〜2003年1月上旬〜
391通。このあたりで落ち着いたか?韓国から85通。
今年の年越しmakeはOpenSSLだった。 OpenSSLは
% objdump -p /usr/local/ssl/lib/libssl.so.0.9.6|grep SONAME SONAME libssl.so.0.9.6
なので、0.9.7を使いたければリンクしなおす必要あり。
OpenSSHをmakeしなおしてみよう。ちなみにOpenSSHの場合は同じ0.9.6でも
OpenSSL version mismatch. Built against 90607f, you have 906080
のようにコンパイル時に埋め込んでしまうため、 共有ライブラリの名前が変わらないようなupdateのときは注意が必要。
とりあえずみんないじり始めたので、残務をかたづけよう。
makeなら知ってるからmakeでLIBRBUY_SOを展開させるわけやね。 うまいな。でも./config.status --recheckがちょっといやだな。
config.h: config.status ./config.status --recheck
だとconfigure直後のmakeで必ずrecheckがかかるから。 たぶん要らない気がする。
それとconfigureしなおすとconfig.hは初期状態に戻るので、 必ず更新される。 その後makeすればconfig.hに追加された状態に戻るが、 config.hは更新されているので全部リコンパイルとなる。 これは痛い。 ccacheを使ってればそれほど痛くないかもしれないけど。
というわけでLIBRUBY_SOをconfig.hで定義するのはちょっと無理な感じがする。 LIBRUBY_SOを参照しているのはruby.cだけなので、 libruby_so.hという別のファイルを作るのはどうだろう?
ruby.o: libruby_so.h
てな感じでWindows系はruby.cでこれをincludeする。 これならruby.cだけが依存するからまずまずかな。
要するにLIBRUBY_SOをどう伝えるかということなので、 だったら*.rcにでも埋め込んでしまうのはどうだろう? Windows系だけの話だし。リソースはよくわからないんだけど、
STRINGTABLE BEGIN 0 "#{$libruby_so}" END
としてresource.rbを実行するとことろで
-libruby_so=$(LIBRUBY_SO) \
を追加する。あとはruby.cを
LoadString(0, 0, libpath, sizeof libpath); GetModuleFileName(GetModuleHandle(libpath), libpath, sizeof libpath);
とでもすればいけそう。やってみる。あ、 いけた。
これは-DLIBRUBY_SO=が-libruby_so=になっただけとも言える。 でも、依存するものが少ないし、変更点も少ないし、 新たにファイルを作るわけでもないので、 いいかもしれない。
更新。
更新。インストーラがクロスの環境じゃ動かなくなってしまったので、
% mkdir lib % mv vr lib % i386-cygwin-ruby -rmkmf -e 'create_makefile("vr")' % make site-install
とした。結構 役に立ってるようだ。
/etc/ld.so.confを確認してldconfigしないとだめです。 LD_RUN_PATHという手もありますが。
Vim6のruby modeはdefaultでコメント行でoすると勝手に"# "が頭につく。 自分の行動パターン的にはそこにはスクリプトを書くことが多いというより、 空行を入れるかもといったところだ。いずれにしても余計なお世話だ。 調べてみると$VIMRUNTIME/ftplugin/ruby.vimに
" Set 'formatoptions' to break comment lines but not other lines, and insert " the comment leader when hitting <CR> or using "o". setlocal fo-=t fo+=croql
とあった。これが怪しい。:help 'fo'してみるとdefaultはtcqらしい。 tは引かれてcroqlが足されるから最終的にはcroqlか? CTRL-^してfo-tableを見ると
o Automatically insert the current comment leader after hitting 'o' or 'O' in Normal mode.
とあった。これだな。setlocal fo-=oでやめさせればいいわけだ。 どうせなら~/.vim/ftplugin/ruby.vimを作ってここで設定しよう。 あ、これを作ると$VIMRUNTIMEのほうはloadされなくなるのか。 setlocal sw=2も入れとこう。
libsafeをインストールして
% LD_PRELOAD=libsafe.so.2.0.16 make test
で実行してみる。1.6も1.8も問題ないなあ。
% LD_PRELOAD=libsafe.so.2.0.16 ldd ./miniruby libsafe.so.2.0.16 => /lib/libsafe.so.2.0.16 (0x4001b000) libdl.so.2 => /lib/libdl.so.2 (0x40021000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x40024000) libm.so.6 => /lib/libm.so.6 (0x40050000) libc.so.6 => /lib/libc.so.6 (0x40072000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
だからちゃんとpreloadもされてるよなあ。 glibc 2.3.1ってことは必然的にgcc 3.2以上だから、 うちとほとんど同じ環境のはずなんだけど。
human68kも動いてなかったし、winceも考えなくてもいいでしょう。 ぎゃっと叫ぶ人が出てきたときに考えれば。
02:23AM。なにか物音がするので玄関に行ってみると、新聞が来てた。はえー。
GNU makeは
% make -n DESTDIR=/tmp install
とするとMAKEFLAGSに"-n -- DESTDIR=/tmp"とセットする。
% make -n DESTDIR=/tmp no-install
とすると、--make-flagsで
"$(MFLAGS)$(MAKEFLAGS) -n DESTDIR=$(DESTDIR)"
を渡しているから、各拡張ライブラリへのmakeへは
"-nn -- DESTDIR=/tmp -n DESTDIR=/tmp"
が最終的に渡る。 このままでは"--"があるため"-n"はターゲットになってしまう。 というわけで"--"を削除する。 ついでに同じものがいくつも出てくるのもなんだからuniqする。 で、順番も気になるのでオプションが前に来るようにしよう。
$mflagsは最終的には
["INSTALL_PROG=install -c -m 0755", "INSTALL_DATA=install -c -m 0644", "MAKEDIRS=mkdir -p", "-nn", "DESTDIR=/tmp", "-n", "install"]
となっている。これは単純にsortはできないので、 Enumerable#partitionを使ってみよう。1.8だしね。
$mflags = $mflags.partition{|x| x[0] == ?-}.flatten!
で、オプションを前方に集められる。
["-nn", "-n", "INSTALL_PROG=install -c -m 0755", "INSTALL_DATA=install -c -m 0644", "MAKEDIRS=mkdir -p", "DESTDIR=/tmp", "install"]
ext/extmk.rbで$0を設定するようになったが、Cygwinはなんか変だな。
% irb hoge.rb hoge.rb(main):001:0> $0 => "hoge" hoge.rb(main):002:0> $0 = "foobar" => "foobar" hoge.rb(main):003:0> $0 => "foob"
と4文字で切れてしまう。あれ?最初から4文字か。と思ったら、irb/init.rbで
$0 = opt
と設定していた。代入すると4文字で切られちゃう感じだな。でもmakeすると
../ruby/ext/extmk.rb:74:in `load': No such file to load -- /home/wata (LoadError)
となるから、もっと設定されるときもあるようだ。うーむ。 set_arg0()をじっくり読もう。
include FileUtils::Verboseしてしまうと、cmpもverboseになるのが気になるなあ。
include FileUtils::NoWrite if $dryrun module FileUtils @fileutils_output = STDOUT @fileutils_label = '' end Object.module_eval do [:ln_sf, :makedirs, :install].each do |method| define_method(method) do |*args| args.push :verbose FileUtils.send method, *args end end end
としてmakelinkはln_sfにしちゃうとか。
@fileutils_labelの初期値が'fileutils.'だと、 one-linerでそれを表示したくないときに困る。 具体的にはlib/mkmf.rbのconfiguration()で使われてるftools.rbをfileutils.rbに単純に置き換えたとき。
INSTALL_PROG = $(RUBY) -rfileutils -e 'FileUtils.install ARGV[0], ARGV[1], 0755, :verbose'
これだと、
fileutils.install -c -m 0755 x y
という表示になってしまう。かといって
INSTALL_PROG = $(RUBY) -rfileutils -e 'include FileUtils;@fileutils_label="";install ARGV[0], ARGV[1], 0755, :verbose'
というのも苦しい。 実際はこの行が表示されるわけじゃないからいいのかもしれないが、 単純にfileutils.rb側を変えたほうがよさそうな気もする。
長くなるとか、@のような文字は危ないかもしれないので、 runという名前のライブラリを考えてみた。 -runで実行できるようにわざとun.rbという名前で作る。
% ruby -run -e install -- -m 0755 x y % ruby -run -e rm -- -f *.o % ruby -run -e cp -- -p x y
のように普通のコマンドと同じように使える。 メタ文字も出てこないのでquoteする必要もない。
RM = $(RUBY) -run -e rm -- -vf MAKEDIRS = $(RUBY) -run -e mkdir -- -vp INSTALL_PROG = $(RUBY) -run -e install -- -vm 0755 INSTALL_DATA = $(RUBY) -run -e install -- -vm 0644
と定義できる。 [ruby-list:13912]の焼き直しにすぎないんだけど。
ruby-talkは16KB制限が入った。12月と1月のruby-talkを見てみたけど、 16KBに収まらないようなメールはやっぱ何か間違ってる。 ruby-devは差分が流れるから別だけど。
% ruby -v -e 'p [1,2,3].zip([4,5,6]).map{|x,y| x+y}' ruby 1.8.0 (2003-01-07) [i386-linux] [5, 7, 9]
なんだかんだで、 Win32API.rbを用意することになったが、 とりあえずgetch.rbとpoint.rbはそれなりに動くようになった。 が、肝心のregistry.rbは
% cat reg.rb require 'registry' Win32::Registry::HKEY_LOCAL_MACHINE.open( 'SOFTWARE\Cygnus Solutions\Cygwin\Program Options') do |reg| p reg['c:\cygwin\usr\sbin\inetd.exe'] end % ruby -I. reg.rb ./Win32API.rb:19:in `call': bignum too big to convert into `int' (RangeError) from ./Win32API.rb:29:in `call' from ./registry.rb:417:in `OpenKey' from ./registry.rb:525:in `open' from ./registry.rb:605:in `open' from reg.rb:4
となってしまう。本来なら
% ruby reg.rb "binmode tty ntsec"
と表示されるはずなんだけど。sym.cを見てみる。あ、NUM2LONGだからか。
case 'L': ANY2L(args[i]) = DLNUM2LONG(argv[i]); PUSH_L(ftype); break;
NUM2ULONGにしてみる。先に進んだ。でも
./Win32API.rb:19:in `call': undefined method `to_ptr' for 0:Fixnum (NoMethodError) from ./Win32API.rb:19:in `call' from ./registry.rb:447:in `QueryValue' from ./registry.rb:665:in `read' from ./registry.rb:688:in `[]' from reg.rb:5 from reg.rb:3:in `open' from ./registry.rb:605:in `open' from reg.rb:4
と次の関門が待っているのであった。今日はここまで。
Win32API wrapperは無謀だったか?
Ruby Binariesの.htaccessにこれを加えてみた。
IndexOptions DescriptionWidth=* TrackModified IndexOrderDefault Descending Date
defaultは新しい順のほうがよさそう。
Descriptionが古いままだなあ。list.rhtmlのほうを使うようにしないと。 名前も調べなおさないといけないのか。
久し振りにwineを起動してみるとこけてしまった。
% wine -- ruby -v err:virtual:map_image Standard load address for a Win32 program (0x00400000) not available - security-patched kernel ? wine: could not load 'R:\ruby\mingw\ruby.exe' as Win32 binary
なるほど。 Openwallパッチが原因か。そういえば動的にon/offってできないんだ。
実際のところWineはどのくらいの実力があるのか計ってみた。 例によって違いがわかりやすい遅いP5 133MHzのLinux 2.4.20上で実行。
% TIMEFMT='%E real %U user %S sys %P cpu' % time wine --debugmsg err-all -- ./ruby -v ruby 1.8.0 (2003-01-09) [i386-cygwin] 3.38s real 1.74s user 0.41s sys 63% cpu % time ruby -v ruby 1.8.0 (2003-01-09) [i386-linux] 0.49s real 0.46s user 0.05s sys 103% cpu
起動時間は3秒ぐらいだな。
% time wine --debugmsg err-all -- ./ruby ../ruby/sample/sieve.rb 1000000 >/dev/null 64.20s real 61.92s user 0.86s sys 97% cpu % time ruby ../ruby/sample/sieve.rb 1000000 >/dev/null 71.91s real 71.74s user 0.25s sys 100% cpu
うーむ。逆転してしまった。まじ?同じgcc 3.2なのに。 てゆか間にCygwinもあるんだよね。なにか間違ってる…。