〜2001年6月中旬〜
結局RUBY_CANONICAL_BUILDを作った。 autoconf 2.50の場合、
AC_CANONICAL_TARGET AC_CANONICAL_HOST AC_CANONICAL_BUILD
は
AC_CANONICAL_SYSTEM
とほとんど同じなので、 --targetを指定したら--program-prifix=''も忘れずに。
1.7.xはこんな小細工はやめてAC_CANONICAL_SYSTEMにしちゃおう。
そんな肩書を持ってたのか。
分離の影響か先月の半分ぐらいの流量になってる。
なにげなくCygwinのsetup.exeのソースを見てたら、 tar.bz2もサポートしてることがわかった。 そういえば以前tar.gzだとWinzipで展開する人が多いから *1、 tar.bz2にしよっかななんてChrisがCygwin MLで言ってたような。
すっかり忘れてた。更新。
/lib/automode.oをリンクするとmountのモードに関わらずに
入力側はtext mode 出力側はbinary tmode
になる。pdkshにこれをリンクしてみたがいい感じ。 ソースに手を入れずにこれですめば実にお手軽。
SSL supportが入ったので使ってみたくなる。
% ./configure --with-ssl=/usr/local/ssl <前略> Looking for SSL libraries in /usr/local/ssl checking for RSA_new in -lcrypto... no checking for SSL_new in -lssl... no WARNING: Failed to link with OpenSSL libraries in /usr/local/ssl/lib. Wget will be built without support for https://... URLs. <後略>
となぜか見つけてくれない。ちゃんとあるのに。
% ls -l /usr/local/ssl/lib total 1610 -rw-r--r-- 1 watanabe ruby 1386494 Dec 6 2000 libcrypto.a -rw-r--r-- 1 watanabe ruby 252990 Dec 6 2000 libssl.a
あ、shared library作ってないな。あとで作っとこう。 それはそれとして、こういうときはconfig.logを見て原因を探る。
configure:4019: gcc -o conftest -Os -L/usr/local/ssl/lib \ -rpath /usr/local/ssl/lib conftest.c 1>&5 gcc: unrecognized option `-rpath' /usr/local/ssl/lib: file not recognized: Is a directory
あきらかに-rpathがまずい。なんでこんなオプション使っているのかな? -rpathはldのオプションだから、gccから指定するならこうだ。
-Wl,-rpath
とりあえずLinuxの場合だけこうしてみた。
--- configure.in.orig Tue May 29 07:02:47 2001 +++ configure.in Thu Jun 14 22:50:55 2001 @@ -207,3 +207,4 @@ sol2 ) dash_r="-R" ;; - decosf* | linux* | irix*) dash_r="-rpath " ;; + decosf* | irix*) dash_r="-rpath " ;; + linux*) dash_r="-Wl,-rpath " ;; *)
これでautoconfして、もう一度configureし直し。
% ./configure --with-ssl=/usr/local/ssl <前略> Looking for SSL libraries in /usr/local/ssl checking for RSA_new in -lcrypto... yes checking for SSL_new in -lssl... yes checking whether SSL libs are resolved at runtime... yes <後略>
いいみたい。
Quick Startの通りに実行するとshared libraryを作ってくれないので、 INSTALLをちゃんと読む。すぐにsharedを引数に指定すればいいとわかる。
% ./config shared % make % make test % sudo make install
-rpathまでするアプリケーションは少ないから/etc/ld.so.confに登録。
% sudo vi /etc/ld.so.conf % sudo ldconfig
できたはいいが、どうもよくわからない。
% wget --proxy=off -s \ --http-user=username --http-passwd=password \ https://iw.nifty.com/iw/nifty/iwforum/index.html --21:34:16-- https://iw.nifty.com/iw/nifty/iwforum/index.html => `index.html' Connecting to iw.nifty.com:443... connected! Unable to establish SSL connection. Unable to establish SSL connection.
となってしまう。-dを追加しても
DEBUG output created by Wget 1.7 on linux-gnu. parseurl ("https://iw.nifty.com/iw/nifty/iwforum/index.html") -> \ host iw.nifty.com -> opath iw/nifty/iwforum/index.html -> \ dir iw/nifty/iwforum -> file index.html -> ndir iw/nifty/iwforum newpath: /iw/nifty/iwforum/index.html
が増えるだけであまり役に立つ情報でもない。うーむ。
コンパイルした結果をcacheしてくれるというソフトなんだけど、 一体何の役に立つかというと
こんな場合に素早くmakeが終わる。 特に遅いマシンを使ってるおいらにはうってつけだ。 ディスクも比較的いっぱい余ってるし。
タイムスタンプを見てるわけではないので、 touchだけだとcacheから取ってくる。
% echo 'main(){}' >main.c % gcc -c main.c (compiling into cache) % touch main.c % gcc -c main.c (getting result from cache)
必ずメッセージが出るあたりが気に入らないが、 そのあたりはshell scriptなので何とでもなる。
タイムスタンプじゃないとすると、 一体何を基準にコンパイルするしないを判断しているのか? bin/compilercacheを見ると、 gcc -Eの結果とgcc -vの結果と一部のコマンドライン引数をファイルにして、 md5sumを取っている。
main ( ) { } Reading specs from /usr/local/lib/gcc-lib/i586-pc-linux-gnu/2.95.3/specs gcc version 2.95.3 20010315 (release) IDENTARGS= COMP=gcc INPUTNAME=main.c
で、hash値をファイル名にしてmain.oの内容をcacheするわけだ。
あとはcacheディレクトリに同じhash値のものがあればそれをコピーする。
いやあ、面白いなあ。
オプションをつければIDENTARGSが変化するのでhash値も変わる。
COMPも残してるからちょっとした変更でクロスコンパイラにも対応可能だ。
結局鈴木さんと連絡が取れなくて、Daveさんが作ってしまったらしい。 なんかやたらとテストメールが目立ったがそういうことだったか。
先日 書いたが、すでにtar.bz2になってるのもあるね。 rsync,fileutils,textutilsはもうtar.bz2だ。 それにしてもCygwinってもう何でもあるなあ。 fileutilsのcpはinstallと同じように
% cp foo /bin
でfoo.exeがあればコピーされるようになったようだ。
PATHとかdebug messageのyes/noは~/.compilercachercで設定する。 今はこんな感じにしてる。
COMPILERCACHEBINDIR=$HOME/compilercache-1.0.9/bin PATH=/usr/local/bin:/usr/local/cygwin/bin:/usr/bin:/bin COMPILERPATH=$PATH SHALLDEBUG=no
~/.zshrcでPATHに HOME/compilercache-1.0.9/binも加えてある。 でもこのままだとgcc,cc,g++,c++以外はエラーになってしまうので、 もうちょっと ゆるく してみた。 あとはgccと同じようにbinにsymlinkを張っとけばok。
巷ではGCC 3.0がどーのこーのと騒がれているが、 (てゆうかもう出たの?)Cygwinのほうではgcc-2.95.3-5が出た。 例によってtar.bz2だ。もう完璧に切り替えてきたね。
setup 2.57になってからsetup.iniも一緒にダウンロードしとかないと、 パッケージを選ぶときに困る。バグか?
ちゃんと出てるじゃん。
適当に見繕ってconfigure。
% CFLAGS=-Os CXXFLAGS=-Os ../configure --enable-languages=c,c++ \ --enable-shared --with-system-zlib --enable-sjlj-exceptions \ --enable-version-specific-runtime-libs --enable-c-mbchar \ --enable-threads
GCC 3.0にしたらgc.cの__asm__のとこがwarningになったので修正。
% cat foo.c char *s = "foo bar"; % gcc -V 2.95.3 -c foo.c % gcc -V 3.0 -c foo.c foo.c:1:11: warning: multi-line string literals are deprecated
とgcc 2.95.3だとwarningにならない。
真っ先にdebug messageを止めたのには実は理由がある。 configure時に困るのだ。 autoconfはC preprocessorのチェック時に、 標準エラー出力に何か出力されるとエラーとみなす。 最終的に全部失敗するとしかたなくCPP=/lib/cppとして先に進む。 nativeならこれでもほとんど問題ないがcrossのときはまずい。 余計なmessageを出されると困るわけだ。
そういった意味では
SHALLDEBUG="yes"
ではなくて
: ${SHALLDEBUG:="no"}
となっていたほうがいいかも。これなら確認したいときは
% SHALLDEBUG=yes gcc -c foo.c
とすればいいんだから。
原因不明のCygwin版のsocketに関するエラーは こういうこと らしい。 Windows 2000だからというより、 Windows 2000が動いているようなマシンはそれなりに速いというのが真相だな。 うちじゃ起きないわけだよ。