〜2001年4月上旬〜
% make install prefix=$HOME/cygwin/gcc-2.95.3-2のように *1。
i686-pc-cygwin-gcc -V 2.95.2-7とかで過去のバージョンも呼び出せるんだから気にしなくてもいいかもしれない。 が、 gcc 2.95.3からはcppじゃなくてcpp0を呼び出すようになってしまったので、 あらかじめln -s cpp cpp0しとくとか工夫が必要。
% make install tooldir=/usrで作ってあるらしい。このバージョンに限らないけど。 これで${prefix}/i686-pc-cygwinじゃなくなるわけでspecs問題も解決か? specs自体はmake時にbuild_tooldirを元に決めてるから、 これを指定すればうまくいきそうだが、 build_tooldirはasとかにもからんでくるのでmake時に指定するのはまずい。 よって、make install時にはtooldirだけ指定し、specsはその後、手で修正する。
% sudo make install tooldir=/usr/local/cygwinこのままだとgccだけなので、 以前インストールしたCygwin 1.1.8-2も同じようにインストールし直す。 で、これで-mno-cygwin環境がましになったので、 Cygwin 1.1.8-2を最初からmakeし直すことにした。 最初からgccといっしょにmakeしとけばいいと今になって気づく。まあいいや。
% cd /usr/local/cygwin/lib/gcc-lib/i686-pc-cygwin/2.95.3-2 % sudo rm libstdc++.a % sudo ln -s ../../../../lib/libstdc++.a.2.10.0 libstdc++.aこれで最後まで通る。同じように
% sudo make install tooldir=/usr/local/cygwinする。修正したspecsは差分じゃなくてそのまま ここに置いとこう。
% cygcheck -sしよう。まじで。
% ruby -e 'p Time.at 1000000000' Sun Sep 09 10:46:40 JST 2001ということらしい。 つまりこの日に9桁から10桁になるわけだ。 そんなとこに依存するバグを作るのも難しいと思うんだけど。
% tar xfvz gcc-2.95.3.tar.gz % cd gcc-2.95.3 % mkdir obj; cd obj % CFLAGS=-Os CXXFLAGS=-Os \ ../configure \ --target=i586-pc-msdosdjgpp \ --enable-languages=c,c++ \ --enable-shared \ --enable-c-mbchar % sudo mkdir -p /usr/local/lib/gcc-lib/i586-pc-msdosdjgpp/2.95.3 % makeやっぱり、size_tとwchar_tがまずいね。ちと調査が必要だな。
char *p = ""; *p = '\0';が原因だった。WinNTは保護されてるんだね。 なにしろgdb上で実行すると
% w3m http://host/index.html > index.htmlと同じような感じになり、ちゃんと動いてしまうからデバッグにならない。 termcapのacが問題だからTERMがcygwinとかlinuxなら問題なく動く。 これ以外に設定してる人かつWinNTとなるとかなり確率は低い。
% cat hoge.c main() { char *p = ""; *p = '\0'; } % gcc hoge.c % ./a.out zsh: segmentation fault ./a.out % gcc -fwritable-strings hoge.c % ./a.out %
% ./configure --target=sh-elf \ --host=i686-pc-cygwin \ --build=i586-pc-linux-gnuという感じでconfigureを実行すればよい。 もちろんあらかじめ--target=i686-pc-cygwinで作ったクロスの環境は必要だけど。
% env CC='i686-pc-cygwin -mno-cygwin' \ ./configure \ --target=i386-mingw32 \ --host=i686-pc-cygwin \ --build=i586-pc-linux-gnu \ ...
%{mwin32|no-cygwin:...}じゃ、-no-cygwinのときだから全然だめだよ。 rubyは-mwin32が新設されたときに強制的につけるようにしたから問題ない。 GNU dbmを作っていて気づいた。
% ruby -e 'Thread.new{`echo test`}.join'なんだけど、WinNTだとまったく問題なし。 [ruby-dev:12795]のスクリプトもちゃんと動く。どうしてこんなに違うんだ?
% tar xfvz gdbm-1.8.0-3-src.tar.gz % cd gdbm-1.8.0 % CC=i686-pc-cygwin-gcc \ LD=i686-pc-cygwin-ld \ AR=i686-pc-cygwin-ar \ RANLIB=i686-pc-cygwin-ranlib \ NM=/usr/local/cygwin/bin/i686-pc-cygwin-nm \ ./configure \ --target=i686-pc-cygwin \ --host=i686-pc-cygwin \ --build=i586-pc-linux-gnu \ --prefix=/usr/local/cygwin-local <中略> checking host system type... \ Invalid configuration `i686-pc-cygwin': system `cygwin' not recognized <後略>なんとcygwinが認識されない。なぜに?
% ls -l config.sub -rwx------ 1 watanabe ruby 19802 May 19 1999 config.subなるほど2年前だとするとcygwin32じゃないとだめか。 中を見るとやはり-cygwin32*になってる。というわけで
--host=i686-pc-cygwin32にしてもう一回。 binutils軍団は全部i686-pc-cygwinをつけてるから、 実のところ--hostはほとんど意味なし。
/bin/sh ./libtool --mode=compile i686-pc-cygwin-gcc -c -I. -I. -O dbminit.c i686-pc-cygwin-gcc -c -I. -I. -O dbminit.c dbminit.c: In function `dbminit': dbminit.c:49: function `dbminit' definition is marked dllimport make: *** [dbminit.lo] Error 1該当する行を見ると
GDBM_EXPORT(int, dbminit) (file) char *file;となってる。 GDBM_EXPORTはsystems.hで定義されている。DLL絡みだな。 じーっと見ると-DGDBM_STATICすればよさそう。てゆうか
Makefile.cygwinなんてのがあるじゃん。なぬ?