〜2001年1月中旬〜
% cd gcc-2.95.2-6/gcc/config/i386 % grep '"no-win32"' *.[ch] cygwin.h:{ "no-win32", -MASK_WIN32, "Don't set Windows defines" }, \cygwin.hにあるSUBTARGET_SWITCHESというマクロだ。
if test "$cross_compiling" = yes; then ac_cv_sizeof_int=4のような記述が気になる。intは4だからこのあたりはいいが
if test "$cross_compiling" = yes; then ac_cv_sizeof_long_long=0これはちょっといやな感じだ。 gccだから当然long longも使える。 でも使えないものとして扱われてしまう。 やっぱこういうところを手で最適化していかないとだめなんだなあ。
#if sizeof(long long) == 8と書けないところが辛い。 その他
CONNECT host:port HTTP/1.0を送るという処理があった。 ふーむ。そうかこれがHTTP tunnelってやつか、なるほど。 このあとに
/^HTTP\/.+[\d.]+ 200/にマッチするような文字が返ってくるのを待ち、 リレーするような感じのスクリプトだった。
% telnet http-proxy-host 8080 Connected to proxy. Escape character is '^]'. CONNECT xxx.rim.or.jp:22 HTTP/1.0 HTTP/1.0 200 OK SSH-1.5-1.2.27 quit Protocol mismatch. Connection closed by foreign host.おお、いけてる。
ssh -L 2401:cvs.netlab.co.jp:2401 -f xxx.rim.or.jp exec sleep 600これでlocalhostのポート2401がcvs.netlab.co.jpのポート2401に転送される。 つまりpserverの指定でcvs.netlab.co.jpの代わりに localhostを指定すればいいわけだ。 ああ、今ならもちろんcvs.ruby-lang.orgだ。
ProxyCommand foo %h %pのように書けば%h,%pは実際に接続するホストとポート番号が展開されて fooが実行される。fooは標準入出力でやりとりをするように書く。 つまりinetdから起動されるコマンドのように。 日経Linuxの2000.12号にPerlのスクリプトが載っているが、やってることは remoteからlocalへ、localからremoteへデータを単に転送するだけ。 あとは最初にCONNECTを送るとか、その応答を待つとかいう処理をすればいい。 selectを使っているけど、RubyならThreadだよね。 100行もあれば書けてしまうだろうと思ったら、 すでにCで書かれたものがあった。 connect.cをありがたく使わせてもらう。 ソースを見るとSOCKS5にも対応してる。 至れり尽くせりだ。
ProxyCommand /usr/local/bin/connect -S socks5-proxy-host %h %pが現在の設定。
/usr/local/bin/connect -S socks5-proxy-host cvs.ruby-lang.org 2401が動くようにすれば転送されるはずだ。 やってみると見事に動く。なるほどねえ。
:pserver;proxy=http-proxy-host;proxyport=8080:anonymous@cvs.ruby-lang.org:/rubyとこんな感じでリポジトリを指定できる。
% CC='gcc -specs=specs.msvcrt -Zbmingw' \ CFLAGS='-Os -DNATIVE_WIN32' \ ./configure \ --target=i386-mingw32 \ --disable-threads \ --with-threads=none \ --prefix=/usr/local/mingw
gmessages.c:55: conflicting types for `write'で、該当の個所はここだ。
#undef write static inline int write (FILE *fd, const char *buf, int len) { fwrite (buf, len, 1, fd); return len; }なんかとても変なことをしてる。 なんの意味があるのかわからないけど、とりあえず
#define write static_writeして逃げた。
#ifndef _MSC_VERになっていたので
#if !defined _MSC_VER && !defined _WIN32と変更。やっと最後まで通った。
#if !(defined (_MSC_VER) || defined (__LCC__))というのがありこれが怪しそう。defined __MINGW32__を追加したら通った。
PASS: array-test PASS: dirname-test PASS: hash-test PASS: list-test PASS: node-test PASS: relation-test PASS: slist-test PASS: string-test PASS: strfunc-test PASS: tree-test PASS: type-test =================== All 11 tests passed ===================
% CC='gcc -specs=specs.msvcrt -Zbmingw' \ prefix=/usr/local/mingw \ ./configurent/Makefile.gcc を使うほうがいい気もする。
% PATH=/usr/local/mingw/bin:$PATH \ CC='gcc -specs=specs.msvcrt -Zbmingw' \ CFLAGS=-Os \ ./configure \ --target=i386-mingw32 \ --prefix=/usr/local/mingwglib-configはmingwのものを使うためにPATHに/usr/local/mingw/binを追加。
checking for zlib.h... no configure: error: ZLIB headers not foundあれ、zlib.hが見つからない。 なるほど/usr/local/mingw/includeがspecs.msvcrtから抜けてる。 それに/usr/local/mingw/libもない。追加しないと。 -lzは見つかっているがcygwinのlibz.aがlinkされて成功してしまったんだろう。
edsio.c:296: storage size of `tv' isn't knownと来たか。
#if HAVE_GETTIMEOFDAY 省略 #else struct timeval tv; time_t t = time (NULL); if (t < 0) { edsio_generate_errno_event (EC_EdsioTimeFailure); goto bail; } if (setme) { setme->nanos = 0; setme->seconds = tv.tv_sec; } #endifこれはあきらかにバグだ。tvはいらない。何のための
time_t t = time (NULL);だ。これでできた。
% ./xdelta xdelta.exe: usage: xdelta.exe COMMAND [OPTIONS] [ARG1 ...] xdelta.exe: use --help for more help.exeがつくのがちょっとやだな。というわけでquick hack。
% ls -l ruby* | awk '{print $5,$9}' 672800 ruby-1.6.2-20010110-i386-cygwin.tar.gz 114200 ruby-1.6.2-20010110-i386-cygwin.xdelta 665323 ruby-1.6.2-i386-cygwin.tar.gz % mv ruby-1.6.2-20010110-i386-cygwin.tar.gz o % ./xdelta patch ruby-1.6.2-20010110-i386-cygwin.xdelta % ls -l ruby-1.6.2-20010110-i386-cygwin.tar.gz | awk '{print $5,$9}' 675808 ruby-1.6.2-20010110-i386-cygwin.tar.gz % gzip -t ruby-1.6.2-20010110-i386-cygwin.tar.gz復元したらちょっと大きくなった。 gzip的には正しいってことは圧縮率だけの問題か? 確かにこのパッケージはgzip -9で圧縮してるし、 xdeltaが-9相当で圧縮してるとは限らない。
% cmp =(gzip -dc o) =(gzip -dc ruby-1.6.2-20010110-i386-cygwin.tar.gz)cmpが何も文句を言わない。どうやらそういうことらしい。
% ls -l o ruby-1.6.2-20010110-i386-cygwin.tar.gz | awk '{print $5,$9}' 672800 o 672515 ruby-1.6.2-20010110-i386-cygwin.tar.gzうーむ。まいっか。
% gzip -dc o > o.orig % ./xdelta delta o.orig o o.xdelta % ls -l o* -rw-r--r-- 1 watanabe ruby 672800 Jan 13 21:21 o -rw-r--r-- 1 watanabe ruby 2150400 Jan 13 23:24 o.orig -rw-r--r-- 1 watanabe ruby 136 Jan 13 23:24 o.xdeltaなるほど、そういうことか。
% ls -l xdelta.exe -rwxr-xr-x 1 watanabe ruby 70656 Jan 13 23:32 xdelta.exe
% rsh jarh Fanfare!!! You are successfully logged in to this server!!!が、~/.rhostsもなしでloginできちゃうのはあれだな。
% telnet jarh Trying 192.168.10.3... Connected to jarh.localdomain. Escape character is '^]'. CYGWIN_98-4.10 1.1.7(0.31/3/2) (jarh) (tty0) login: watanabe Fanfare!!! You are successfully logged in to this server!!!パスワードを聞いてこない。 rshが成功したのは認証が全部省かれてるということか。 Win98だからこんなもんなんだろう。 あ、/etc/passwdに書かれてるユーザかどうかのチェックは入るようだ。
% rsh jarh -l hoge Password: Login incorrect
% ssh -v jarh SSH Version OpenSSH_2.3.0p1, protocol versions 1.5/2.0. Compiled with SSL (0x0090600f). debug: Reading configuration data /home/watanabe/.ssh/config debug: Applying options for * debug: Reading configuration data /usr/local/etc/ssh_config debug: Seeding random number generator debug: ssh_connect: getuid 1116 geteuid 0 anon 0 debug: Connecting to jarh [192.168.10.3] port 22. debug: Seeding random number generator debug: Allocated local port 963. debug: Connection established.とここで止まってしまう。inetd -d で起動し直してメッセージを見ると
someone wants sshd accept, ctrl 3 + Closig from 22 249303 execl /usr/sin/in.sshdとなっているのでsshdは起動されてるようなんだけど? 一応/usr/sbin/in.sshdが存在するかどうか確認する。
% ls /usr/sbin in.ftpd.exe in.rshd.exe in.tftpd.exe makewhatis syslogd.exe in.rexecd.exe in.talkd.exe in.uucpd.exe sftp-server.exe in.rlogind.exe in.telnetd.exe inetd.exe sshd.exeがーん。ないじゃん。てゆうかsshd.exeだ。 これは/etc/inetd.confのバグかな。
% diff -u1 /etc/inetd.conf{.bak,} --- /etc/inetd.conf.bak Sun Dec 17 15:19:58 2000 +++ /etc/inetd.conf Sun Jan 14 17:29:28 2001 @@ -51,2 +51,2 @@ # tftp dgram udp wait nobody /usr/sbin/in.tftpd in.tftpd -sshd stream tcp nowait root /usr/sbin/in.sshd sshd -i +sshd stream tcp nowait root /usr/sbin/sshd sshd -i % ps PID PPID PGID WINPID TTY UID STIME COMMAND I 319631 1 319631 4294647665 -1 500 15:11:44 /usr/bin/BASH 133359 1 133359 4294833937 -1 500 17:29:35 /USR/SBIN/INETD 260579 133359 260579 4294732729 -1 500 17:29:48 /USR/SBIN/IN.RLOGIND 233087 260579 233087 4294652585 0 500 17:29:49 /USR/LOCAL/BIN/ZSH 187199 233087 187199 4294659929 0 500 17:29:51 /usr/bin/PS % kill -HUP 133359すると最後に
REDO: sshd proto=tcp, wait=0, user=root builtin=0 server=/usr/sbin/sshdと出た。これでokだ。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. Please contact your system administrator. Add correct host key in /home/watanabe/.ssh/known_hosts to get rid of this message. RSA host key for jarh has changed and you have requested strict checking. debug: Calling cleanup 0x805fc20(0x0)違う名前にしとけばよかったか。 /etc/ssh_host_*を同じものにしてやればいいのかもしれないが、 なんか面倒なのでknown_hostsを分けた。~/.ssh/configに
Host wjarh HostName jarh UserKnownHostsFile /home/watanabe/.ssh/wjarhを追加して、やっとssh wjarhでloginできた。
% cd /usr/sbin % ln -s sshd.exe in.sshd.exeのほうがいいかも。やっぱそうした。
Welcome to POSIX. Cygwin is not DOSISH.
と言い、もともとUnixを使ってた人には
Welcome to Windows. Hope you enjoy the ride.
とか言う。要するに
CygwinはWindowsでもUnixでもない。CygwinはCygwinだ。
ってことだな。
% stty -a | head -3 speed 9600 baud; rows 24; columns 80; line = 0; intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;を見ればわかるとおり^Zはふつうsuspendでしょ、やっぱ。 だからcommand.comから起動したrubyで^Zなんてしてはいけない。 command.comはsuspendなんて知らないんだから。 え?しちゃったの?だめだよ。 そういうときはもう一個立ち上げてpsしてみる。
% ps | grep -i ruby S 360939 1 360939 4294606357 -1 500 01:28:38 /USR/LOCAL/BIN/RUBYSが立ってるのがsuspendしてるプログラムだ。 Iはたぶんinteractiveという意味。 bashが入力待ちのときなんかがそうだ。
% kill -CONT 360939 % ps | grep -i ruby I 360939 1 360939 4294606357 -1 500 01:28:38 /USR/LOCAL/BIN/RUBYIに変わった。 これでrubyを起動したwindowで^Dすればいいはずなんだけど、 どうもどこかでbusy waitしてるようで終わらない。
% kill 360939するしかない。だったら最初から-KILLか。
% CC=i586-pc-msdosdjgpp-gcc \ CFLAGS='-Os' \ ./configure \ --target=i386-msdosdjgpp \ --host=i586-pc-msdosdjgpp \ --build=i586-pc-linux-gnu \ --disable-threads \ --with-threads=none \ --prefix=/usr/local/i586-pc-msdosdjgpp <途中略> checking for extra flags to get ANSI library prototypes... configure: \ error: can not run test program while cross compilingやっぱりそこだよね。 ここはconfigure.inでAC_TRY_RUNというマクロが使われているんだけど、 クロスコンパイル時の引数が指定されてない。 だからac_cv_fooの環境変数技が使えないのだ。 MinGWのときは面倒だからとnativeへ逃げたが今回は逃げない。 つまりconfigure.inを書き換える。
warning: AC_TRY_RUN called without default to allow cross compiling
つまり一度autoconfを実行してみればどれだけ直さなきゃいけないかわかる。
% autoconf |& grep 'warning: AC_TRY_RUN' | wc 22 220 1892なぬ?22個所もあるの?
- Macro: AC_TRY_RUN (PROGRAM, [ACTION-IF-TRUE [, ACTION-IF-FALSE [, ACTION-IF-CROSS-COMPILING]]])
PROGRAMを実行し、成功したらACTION-IF-TRUE、失敗したらACTION-IF-FALSEが
実行される。クロスコンパイル時にはPROGRAMは実行せずに、
いきなりACTION-IF-CROSS-COMPILINGが実行される。
glibはこれを省略してるわけだ。
対応はそれほど難しいものではなく、TRUEかFALSEのどちらかを選べばいい。
そう。最後の引数はそのどちらかをコピーして書けばいい。
わからなかったらFALSEを選んでおけば無難。
また、ACTION-IF-CROSS-COMPILINGをつけとけばac_cv_fooで対処可能なので、
それほど深く悩む必要はない。
autoconfするとconfigureが更新される。
% CC=i586-pc-msdosdjgpp-gcc \ CFLAGS='-Os' \ AR=i586-pc-msdosdjgpp-ar \ RANLIB=i586-pc-msdosdjgpp-ranlib \ NM=i586-pc-msdosdjgpp-nm \ LD=i586-pc-msdosdjgpp-ld \ ac_cv_c_bigendian=no \ ./configure \ --target=i386-msdosdjgpp \ --disable-threads \ --with-threads=none \ --prefix=/usr/local/i586-pc-msdosdjgpp \ --host=i586-pc-msdosdjgpp \ --build=i586-pc-linux-gnuかなりすごいことになってる。 ar, ranlib, nm, ldもクロスのものが使われるように設定。 make して sudo make install したら完了。
% make -f msdos/Makefile.dj2 \ CC=i586-pc-msdosdjgpp-gcc \ AR='i586-pc-msdosdjgpp-ar rcs' \ RANLIB=i586-pc-msdosdjgpp-ranlib % sudo make -f msdos/Makefile.dj2 \ install \ CP=cp \ INCLUDE_PATH=/usr/local/i586-pc-msdosdjgpp/include \ LIBRARY_PATH=/usr/local/i586-pc-msdosdjgpp/lib多少文句言われるが気にしない。 準備完了。
% CC='i586-pc-msdosdjgpp-gcc' \ CFLAGS=-Os \ AR=i586-pc-msdosdjgpp-ar \ RANLIB=i586-pc-msdosdjgpp-ranlib \ NM=i586-pc-msdosdjgpp-nm \ LD=i586-pc-msdosdjgpp-ld \ ./configure \ --target=i386-msdosdjgpp \ --host=i586-pc-msdosdjgpp \ --build=i586-pc-linux-gnu \ --prefix=/usr/local/i586-pc-msdosdjgpp \ --with-glib-prefix=/usr/local/i586-pc-msdosdjgppMinGWのときはPATHでglib-configの位置を教えたけど、 --with-glib-prefixを使うのがまっとうなやりかただろう。
% ls -l xdelta.exe -rwxr-xr-x 1 watanabe ruby 108232 Jan 16 02:10 xdelta.exeDJGPPは全部staticにlinkされるのでちょっと大きくなる。
% ls -l miniperl microperl -rwxr-xr-x 1 watanabe ruby 834088 Jan 17 23:24 microperl -rwxr-xr-x 1 watanabe ruby 650824 Jan 17 23:15 miniperl名前はmicroだけどちっとも小さくない。
% chmod +w uconfig.h % make -f Makefile.microでできあがるからConfigureしなくてもokってことらしい。
% ./configure.gnu -Dprefx=/usr/local -Dcc=gcc zsh: permission denied: ./configure.gnu % ls -l configure.gnu -r--r--r-- 1 watanabe ruby 2550 Aug 14 03:33 configure.gnuって、なぜ?
% sh ./configure.gnu -Dprefx=/usr/local -Dcc=gcc sh Configure -ds -e -Dprefx=/usr/local -Dcc=gcc First let's make sure your kit is complete. Checking... *** WHOA THERE!!! *** This is an UNSTABLE DEVELOPMENT release. The version of this perl5 distribution is 7, that is, odd, (as opposed to even) and that signifies a development release. If you want a maintenance release, you want an even-numbered version. Do ***NOT*** install this into production use. Data corruption and crashes are possible. It is most seriously suggested that you do not continue any further unless you want to help in developing and debugging Perl. Do you really want to continue? [n] Okay, bye.終わっちゃった。あ、なるほど。たしかにConfigureに
*) case "$xversion" in *[13579])とある。つまりPerlもminorが奇数なら開発バージョンになった。 だから簡単に実行できないようにconfigure.gnuも0444なわけだ。
eval.o(.text+0x10df0): undefined reference to `rb_last_status' eval.o(.text+0x110ca): undefined reference to `rb_last_status' io.o(.text+0x1c92): undefined reference to `rb_syswait' io.o(.text+0x27fd): undefined reference to `rb_proc_exec'
% cvs ci -m 2000-01-18 version.hしてしまった。30分後ぐらいに気づいて
% cvs ci -m 2001-01-18 -f version.hしなおした。-f が肝だ。未だに20世紀気分が抜けないらしい。
% alias civ='cvs ci -m `date +"%Y-%m-%d"` version.h'しとくか。
% make CFLAGS=してみたら、拡張ライブラリを作るときにこけた。 extmk.rbでCFLAGSにいろいろ入れてるからだ。 -O2 -gぐらいに留めといたほうがようさそう。
% cd /usr/mingw/lib % ar rcu libcurses.aとでもしといてお茶を濁すか? あ、PDCursesを入れればいいんだね。なっとく。 でも、CygwinにはあってMinGWにはないライブラリに関しては 空のライブラリで対処しといたほうがいいだろう。
% ruby extconf.rb % make % sudo make installといった手順で作る。
% ruby -r fake_i386-cygwin extconf.rb % make % make installで~/dist/i386-cygwin/usr/localがPREFIXに設定されてインストールできる(はずだ)。 簡単なものなら。
% make install DESTDIR=$HOME/distでインストールしてある。
anchor-cached-begin = <font color="#00B000"> anchor-cached-end = </font> anchor-requested-begin = <font color="#B0B000"> anchor-requested-end = </font> anchor-not-cached-begin = <font color="#B00000"> anchor-not-cached-end = </font>をコメントアウトした。そんな違いは知る必要もないし。
次の日記 >
のようなので<>≫にしよう。 >で誤動作するのはなんとなくわからないでもないが、 他にもあるんだけどねえ。
% ls mirai.sh track02.mp3 track04.mp3 track06.mp3 track08.mp3 track10.mp3 track01.mp3 track03.mp3 track05.mp3 track07.mp3 track09.mp3 track11.mp3 % echo * mirai.sh track03.mp3 track06.mp3 track09.mp3 track01.mp3 track04.mp3 \ track07.mp3 track08.mp3 track05.mp3 track02.mp3 track10.mp3 track11.mp3ソートされない。なぜだ?
% xmms *.mp3 &とすると自然とシャッフルされた結果になるが、 毎回同じ結果だからシャッフルでもなんでもない。 てゆうかxmmsにもシャッフルはあるし、そもそもそんな結果は望んでない。 Cygwin版zshではちゃんとソートされる。 Src/glob.cを見るとnotstrcmpでstrcollを呼んでるがこれが怪しい。
% setenv LC_COLLATE Cしてみるとちゃんとソートされるようになった。 うーむ。そろそろglibc 2.2.1にしようかな。 とりあえず~/.zshenvに追加しとこう。あ、
% setenv() { export $1=$2 }してるんで、そこんとこよろしく。