〜2002年7月中旬〜
代々木で研修合宿だ。
二日目。疲れた。
Changes: There are new ports to x86_64 and IA64, stpcpy, expanded large file support, better support for signals (signal now has BSD signal semantic), a clone for PA-RISC, better support for gcc 3, and header cleanups.
ということなので、Rubyも変更しなくていいかと思ったが、その辺りに変化なし。
というわけで、date.rb, parsedate.rbを足してrepackして3.3-1として更新。
更新。
7/10の夜から死んでるようだ。WWWOFFLEのcacheだと
更新日時: Wed Jul 10 20:00:14 JST 2002
が最後。 本家は250KBもあるのでちとつらい。
歌詞に驚く。
以前はCygwin上でRubyの拡張ライブラリを作るには、 まずライブラリ自身の移植から始めていたが、 もうその必要もないようだ。 DLLもそのインポートライブラリ用意されてるし、 ライブラリを静的にリンクするのはやめようかな。
warningになるので将来的には通らなくなるかもしれないけど、 わざわざwarn_unless_e_option()を作ってるので、 one-liner的には残るのかもしれない。
% echo '$_="a"; p true if /a/' | ruby-1.7.2 -:1: warning: regex literal in condition true % ruby-1.7.2 -e '$_="a"; p true if /a/' true
で、結局は これですね。
それはきっとgcc 3.1.1に違いない。 gcc-mingwを見ると何をすればいいかがわかるというか、 構造はbmingwとある意味そっくりだったり。
やっと 全部 解消。file.cの問題もなくなった。
面倒なので、ライブラリとかヘッダはCygwinのパッケージをそのまま使うことにしよう。 用意するもの:
cygwin-1.3.12-2.tar.bz2 mingw-runtime-2.0-2.tar.bz2 w32api-1.5-1.tar.bz2 gcc-mingw-3_1-20020516-2.tar.bz2 binutils-20020706-2-src.tar.bz2 gcc-3.1.1-3-src.tar.bz2
binutilsは特になにも準備しなくてもmake可能。 gccは途中で<stdio.h>が必要になるので、 あらかじめ展開してそれなりの場所に置いとく。 というわけで順番としては
1. パッケージの展開と移動 2. binutilsのmake, install 3. gccのmake, install
となる。とりあえずprefixは/usr/local/test/cygwinとして、全く新規に作る。
% prefix=/usr/local/test/cygwin % mkdir -p $prefix/i686-pc-cygwin % tar xfv cygwin-1.3.12-2.tar.bz2 --us=bzip2 usr/{include,lib} % tar xfv mingw-runtime-2.0-2.tar.bz2 --us=bzip2 usr/{include,lib} % tar xfv w32api-1.5-1.tar.bz2 --us=bzip2 usr/{include,lib} % mv usr/{include,lib} $prefix/i686-pc-cygwin
これで準備ok。binutilsは簡単。
% tar xfv binutils-20020706-2-src.tar.bz2 --us=bzip2 % cd binutils-20020706-2 % CFLAGS=-Os ./configure --prefix=$prefix --target=i686-pc-cygwin % make % make install
Cygwin上でgcc -vした結果を参考にconfigureのオプションを決める。
% tar xfv gcc-3.1.1-3-src.tar.bz2 --us=bzip2 % cd gcc-3.1.1-3 % mkdir cygwin; cd cygwin % CFLAGS=-Os CXXFLAGS=-Os ../configure --enable-languages=c,c++ \ --enable-threads=posix --with-system-zlib --enable-nls \ --without-included-gettext --disable-shared --enable-interpreter \ --disable-sjlj-exceptions --disable-version-specific-runtime-libs \ --target=i686-pc-cygwin --enable-haifa --prefix=$prefix % make % make install
これでCygwinはok。で、
% touch foo.c % i686-pc-cygwin-gcc -mno-cygwin foo.c i686-pc-cygwin-gcc: installation problem, cannot exec `cc1': No such file or directory
となるのはsymlinkやその他が足りないわけだ。ここでgcc-mingwを使う。
% mkdir -p $prefix/i686-pc-mingw32 % cd $prefix/i686-pc-mingw32 % ln -s ../i686-pc-cygwin/bin . % ln -s ../i686-pc-cygwin/include/mingw include % ln -s ../i686-pc-cygwin/lib/mingw lib % cd ~-/../.. % tar xfO gcc-mingw-3_1-20020516-2.tar.bz2 --us=bzip2 \ etc/postinstall/gcc-mingw-3.1-20020516-1.tar | \ tar xfv - -C $prefix
このままだと.exeつきのsymlinkなので、.exeを削除したsymlinkを張る。
% cd $prefix/lib/gcc-lib/i686-pc-mingw32/3.1.1 % ln -s ../../i686-pc-cygwin/3.1.1/cc1 . % ln -s ../../i686-pc-cygwin/3.1.1/cc1plus . % ln -s ../../i686-pc-cygwin/3.1.1/ccp0 . % ln -s ../../i686-pc-cygwin/3.1.1/tradcpp0 .
要らないsymlinkを削除。
% rm *.exe
これでいけるはずだ。でも-vの結果はちょっと変だな。
ignoring nonexistent directory "/usr/local/test/cygwin/i686-pc-mingw32/sys-include/usr/local/test/cygwin/lib/gcc-lib/i686-pc-mingw32/3.1.1/../../../../i686-pc-mingw32/include`@ " ignoring nonexistent directory "/usr/local/test/cygwin/i686-pc-mingw32/include"(
と、なんか壊れてるっぽい。うーむ。
-mno-cygwinを指定すると、"-cygwin"を"-mingw32"へ置換するようになった。 たとえばspecsのある
$prefix/lib/gcc-lib/i686-pc-cygwin/3.1.1
は
$prefix/lib/gcc-lib/i686-pc-mingw32/3.1.1
になる。これを見るとわかるように"-mingw32"は"-cygwin"より1バイト多い。 それがgcc/config/i386/cygwin.hのこのコメントの意味。
/* Allocate space for all of the machine-spec-specific stuff. Allocate enough space for cygwin -> mingw32 munging. */
実体は
char cygwin_cross_include_dir[sizeof (CROSS_INCLUDE_DIR) + 1] = CROSS_INCLUDE_DIR;
のように1バイト余分に確保している。 しかし、1バイトじゃ足りないのだ。実際は
$prefix/lib/gcc-lib/i686-pc-cygwin/3.1.1/../../../../i686-pc-cygwin/sys-include
のように"-cygwin"が複数回現われる。2個あるから本当は2バイト必要。 3.1.1では正規化もしてるのでその後で展開すればよさそうだが、 面倒なのと3個以上は出てきそうにないので、+ 2してお茶を濁すことにする。 問題になるのはCROSS_INCLUDE_DIRとTOOL_INCLUDE_DIRの2つ。 あ、prefixに"-cygwin"を含ませるとすごくまずいねえ。注意。
でもこれってcrossじゃなくても起きると思うんだけど、 なぜnativeでは問題ないんだろう?違ったpath表現になるのか?
あのパッチはcrossとnativeで同じbmingw packageを使えるようにするためのものなので、 ふつうに使う分には要りません。mingwの-lstdc++問題もgcc-mingwで解決できるし。 gcc-mingwの構成については、 これ でわかるかなあ。
もはやbmingw packageはext/etcを通すだけの単なるライブラリにすぎないので、 ext/etcとwin32/のほうへmargeしてしまう方向で考えたほうがよさそう。
信じられないことに、hdparm -c 1 -d 1してないことに気づく。 というより、このPCは古すぎてDMAはサポートしてないようだ。
とりあえず32-bit I/O supportだけでもenableにしてみる。
% sudo hdparm -t /dev/hdb /dev/hdb: Timing buffered disk reads: 32 MB in 9.42 seconds = 3.40 MB/sec % sudo hdparm -t -c 1 /dev/hdb /dev/hdb: setting 32-bit I/O support flag to 1 I/O support = 1 (32-bit) Timing buffered disk reads: 32 MB in 5.82 seconds = 5.50 MB/sec
これだけでも結構違う。
試しにLinux 2.5.26をmake bzImageしてみる。
PATH=/usr/bin:$PATH make SHELL=/bin/bash bzImage \ 2054.73s user 163.83s system 98% cpu 37:27.74 total
前回 は54分。
CHANGESを見るとマルチバイト対応が入ったようだ。
3. New Features in Bash <snip> c. New code to handle multibyte characters.
/.-Jによるとリリースされたらしい。 例によってperl-currentをrsyncしてみるとpatchlevel.hが変だ。
static char *local_patches[] = { NULL "DEVEL17641", ,NULL };
これじゃ、もちろんエラーになる。 リリース時には間になにもはさまないはずだから大丈夫か。
もともとはこうなっている。
static char *local_patches[] = { NULL ,NULL };
あまり見ない形式だ。 Cでは最後のcommaが許されるからこういう書き方は普通しない。 だからこそ起きたミスだ。
そういえば最後のjperlも
static char *local_patches[] = { NULL + ,"jperl5.005_03-20000401.pat - April Fool" ,NULL };
としたんだっけ。
make testするとPerlIO/scalar.pmやPerlIO/via.pmがないと言われる。 PerlIO/Scalar.pmとPerlIO/Via.pmはあるな。typoか? やっぱtarballを取ってこないとだめだな。11MBだと?でかすぎ。