〜2002年5月下旬〜
MISSINGからvsnprintf.oをfilter-outするだけだと、 OBJSからは消えてないのでvsnprintf.oを作ってしまう。 じゃ、OBJSからfilter-outすればいいかというと、 すでに明示的な規則に登録されてしまうためだめ。 GNUmakefileの中でMakefileをincludeしてるから後の祭りになる。 つまり、Makefileを作るところでなんとかする必要があるわけだ。 というわけでAC_CONFIG_COMMANDS_POSTを使ってみよう。 config.statusを作った後で実行したい処理を定義できる。
AC_CONFIG_COMMANDS_POST([ case "$target_os" in mingw*) sed 's/ vsnprintf\.o//' config.status >config.tmp && mv config.tmp config.status;; esac ])
を入れてみた。いまいち気に入らないがこれでいける。
あ、よく考えてみたら、
ac_cv_func_vsnprintf=yes
だけでいいんじゃない?ぐはぁ。
info autoconfしてみたら
The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'.
とあった。なんか今後はconfigure.acが主流になりそうだな。
変ですね。2行に分けても問題ないです。というか最初から2行に分けてます。 dependに関してはmkmf.rbのほうに 暗黙のルールがあるから必要ないです 。
あ、もうCVSのほうへ入れちゃいましたか。 そうするとsrcdirとは別のディレクトリでbuildできなくなります。
まいったなあ。Klezだらけだよ。それでなくてもSPAMだらけだというのに。
Operaでbladeを見るとなぜか<pre>を無視したように表示される。
更新。
更新。すっかり忘れてた。
コンパイル速度が速い。 手始めにarray.cをコンパイルしてみたが、ちと手強い。
というSubjectで
Hi, "Itrs\037`mnsgdq\037Qtax\037g`bjdq+".split(//).each {|i| i.succ!}.join Regards Peter
という内容のメールが届いた。 ruby-dev summary 17048-17127 の影響だろうか。 いや、俺にこれだけ送ってこられても困るというか、 人の作ったものを集めてるわけじゃないんで、 そこんとこよろしく。
ちょっと言わせてもらうと、これはcaesar暗号であり
print 'Whfg nabgure Ehol unpxre,'.tr('A-Za-z', 'N-ZA-Mn-za-m')
と同じタイプのものだ。というかprintをつけるように(-1点)。
おぉ、ifとかclassで%が使えるよー。
最近GDBを使おうとすると
Dwarf Error: Cannot handle DW_FORM_strp in DWARF reader.
と文句言われることに気づいた。 やっぱGCC 3.1が原因だよね。 というわけでGDBを5.2に上げた。
なぜかgdb-5.2.tar.gzを展開したらgzipがSEGVになってしまう。 あ、家のPCだと問題ないな。 違いといえば会社のがglibc 2.2.2で家のが2.2.5とバージョンの違いぐらいなんだけど、 debugしようとしても、そのGDBが動かないというジレンマが。 というわけでgzipは元に戻した。
更新。
更新。
versionが一ヶ月ずれてますね。
ごとけんさんからメールが来た。1.7のlib/benchmark.rbが
% lcvs st lib/benchmark.rb =================================================================== File: benchmark.rb Status: Up-to-date Working revision: 1.2 Thu Apr 25 12:33:49 2002 Repository revision: 1.2 /src/ruby/lib/benchmark.rb,v Sticky Tag: (none) Sticky Date: (none) Sticky Options: (none)
なのであれでいいんだそうです。
早速./config sharedしてみると
Operating system: i586-whatever-linux2 [: (GCC): unknown operand [: (GCC): unknown operand
となんか変。GCC 3.1は--versionが豪華になってるね。
% gcc --version gcc (GCC) 3.1 Copyright (C) 2002 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. % gcc-3.0.4 --version 3.0.4
こうしてみた。
--- config.orig 2002-03-16 01:47:23.000000000 +++ config 2002-05-26 19:00:57.000000000 @@ -385,7 +385,7 @@ if [ "$GCCVER" != "" ]; then CC=gcc # then strip off whatever prefix Cygnus prepends the number with... - GCCVER=`echo $GCCVER | sed 's/^[a-z]*\-//'` + GCCVER=`echo $GCCVER | sed 's/^[-a-z() ]*//i;1q'` # peak single digit before and after first dot, e.g. 2.95.1 gives 29 GCCVER=`echo $GCCVER | sed 's/\([0-9]\)\.\([0-9]\).*/\1\2/'` else
要するに3.0.4なら30に、3.1なら31になればいい。 sed 1qは1行目で終わりという意味で、結局head -1と同じ。 ついでにConfigureのlinux-elfの-m486を-march=i586に変更。
更新。
更新。
Klezが3通、そのVirus Alertが×3で9通、spamが1通。 unsubscribeすべきか?
突然perl -Dしたくなった。が、-DDEBUGGINGつきでmakeしてないのでできない。 GCCも3.1になったしこれで試そう。
% ./Configure -des -Dcc=gcc
途中所々に出る
cc1: warning: changing search order for system directory "/usr/local/include" cc1: warning: as it has already been specified as a non-system directory
と
cpp0: warning: changing search order for system directory "/usr/local/include" cpp0: warning: as it has already been specified as a non-system directory
が気になる。
どうもGCC 3.1はdefaultのinclude directoryを-Iで指定するとこんな警告を出すようだ。
% touch foo.c % gcc -I/usr/local/include -c foo.c cc1: warning: changing search order for system directory "/usr/local/include" cc1: warning: as it has already been specified as a non-system directory
Rubyは絶妙なタイミングで-I/usr/local/includeを外したと言える。
% make make: *** No rule to make target `<built-in>', needed by `miniperlmain.o'. Stop.
む?なんだろう?どうも-Eで余計なものが増えたようだ。
% gcc -E - </dev/null # 1 "<stdin>" # 1 "<built-in>" # 1 "<command line>" # 1 "<stdin>"
makedepend.SHに<stdin>と同じように<built-in>と<command line>も追加。 *.SHをいじったら
% ./Configure -S
を実行する。config.shができてれば最初から実行する必要はない。 makedepend.SHなので
% make depend
も実行してmakefileも更新した。 Perlの場合Makefileとmakefileを扱うのでちょっと面倒。
makeしてみるとpp_sys.cで
pp_sys.c: In function `Perl_pp_sysread': pp_sys.c:1499: incompatible type for argument 5 of `recvfrom' ...
というエラーになる。struct sockaddrのcastが尽くエラーになってる。 /usr/include/sys/socket.hを見ると__SOCKADDR_ARGがまずそう。 本来なら
#if defined __cplusplus || !__GNUC_PREREQ (2, 7) || !defined __USE_GNU # define __SOCKADDR_ARG struct sockaddr *__restrict # define __CONST_SOCKADDR_ARG __const struct sockaddr * #else
このelseのほうになるはずなんだけどなあ。あ、__attribute__か? config.hを確認してみるとHASATTRIBUTEがdefineされてない。 これが原因のようだ。Configureでは
if $cc $ccflags -c attrib.c >attrib.out 2>&1 ; then if $contains 'warning' attrib.out >/dev/null 2>&1; then echo "Your C compiler doesn't fully support __attribute__." val="$undef" else echo "Your C compiler supports __attribute__." val="$define" fi else
という感じでcheckしているので、つまりwarningがあったらだめってことだ。 ぐはぁ。やはりあの警告を何とかしないといけない。
思考錯誤して
% ./Configure -des -Dcc=gcc -Dlocincpth=
でいいかと思ったけど効果なし。locincpthをクリアするタイミングが難しそう。 今回はPolicy.shを使うことにした。-DDEBUGGINGもつけてこんな感じだ。
cc='gcc' optimize='-Os' ccflags='-DDEBUGGING' locincpth=''
これでmake testもAll tests successfulになった。
更新。2.3.xは[test]にして2.2.xを[curr]にしたほうがいいかなあ。
zsh と ccache が追加されたのはいいが、最近 cygwin-announce ML のほうにアナウンスされないのがちょっと不便。
2.5系列はなぜかがんがんteenyが上がる。 いつの間にか2.4に追いついた。 というわけで試してみる。SWSUSPが使いたいというのもあるが。 dj1もあてとこう。
いきなりmake menuconfigで
Generating include/linux/version.h expr: syntax error
と止まってしまう。なんか待ってるようだ。C-dで先に進んだ。でも
mv: missing file argument Try `mv --help' for more information. make: *** [include/linux/version.h] Error 1
なのでぜんぜんだめだ。
Makefileを見るとこの.が怪しい。
@. scripts/mkversion_h $@ $(KERNELRELEASE) $(VERSION) $(PATCHLEVEL) $(SUBLEVEL)
やっぱashかなあ。
% make SHELL=/bin/sh menuconfig
だと
Generating include/linux/version.h expr: syntax error
で、
% make SHELL=/bin/zsh menuconfig zsh: no matches found: s/arm.*/arm/ Makefile:170: arch//Makefile: No such file or directory make: *** No rule to make target `arch//Makefile'. Stop.
なので、ashが原因らしい。ぐはぁ。 Makefileの中でなぜ.を使う必要があるのかわからん。 CONFIG_SHELLは一体何のためにあるんだ?
make bzImageしてみるとvmlinuxを作るところで
init/init.o: In function `rd_load_image': init/init.o(.text.init+0xfe7): undefined reference to `change_floppy' init/init.o: In function `rd_load_disk': init/init.o(.text.init+0x111b): undefined reference to `change_floppy'
というエラーに。 change_floppyが定義されてるinit/do_mounts.cを見ると
#if defined(BLOCK_DEV_RAM) || defined(CONFIG_BLK_DEV_FD) static void __init change_floppy(char *fmt, ...)
となってるが、ここは
#if defined(CONFIG_BLK_DEV_RAM) || defined(CONFIG_BLK_DEV_FD) static void __init change_floppy(char *fmt, ...)
が正解。ってこんな単純なミスがあろうとは。 フロッピーをモジュールにする人はあまりいないのだろう。
続いて
aic7xxx_linux.c:2829: unknown field `abort' specified in initializer aic7xxx_linux.c:2829: unknown field `reset' specified in initializer aic7xxx_linux.c:2829: duplicate initializer aic7xxx_linux.c:2829: (near initialization for `driver_template.slave_attach') aic7xxx_linux.c:2829: duplicate initializer aic7xxx_linux.c:2829: (near initialization for `driver_template.bios_param')
というエラー。 drivers/scsi/aic7xxx/aic7xxx_linux_host.hのAIC7XXXからabortとresetを削除してみる。 いけてるようだ。ま、いけてなくてもモジュールだから後でなんとでもなるだろう。
bootしてみると各種daemonを起動するとこでfreezeしてしまう。うーむ。
つまりこういうことです。
% echo 'static char foo[] = "";' >foo.c % gcc -Wall -c foo.c foo.c:1: warning: `foo' defined but not used % echo 'const static char foo[] = "";' >foo.c % gcc -Wall -c foo.c %
100KB以上またはVirus Alertというsubjectのメールははじくようになった。 virusが来なくなった分、逆にspamが目立つ。
出たようだが、全然直ってない。逆にエラーが増えてる。
suspend.c:303: `tq_disk' undeclared (first use in this function) suspend.c:303: (Each undeclared identifier is reported only once suspend.c:303: for each function it appears in.)
もうちょっと待つか。
おいおい。今日1日で24通来たぞ。どうなってんだ?
XMLを吐くソフトがあるんだけど全く改行をつけてくれない。とても見辛い。 というわけでXSLTだ。って処理系は何がいいんだろう? 簡単に試せるのはCygwinのパッケージになってるlibxsltのxsltprocだ。 で、 こんなの を作った。
% tr -d '\n' <indent.xsl |sed 's/> *</></g' | \ xsltproc indent.xsl - |cmp indent.xsl - %
というわけでいいみたい。