・ビルドメモ
sed-4.2 の環境で VLC-0.9.9a をビルドしようとすると、
kojima@xeon[/mnt/Srcs/VLC/build]% make make all-recursive make[1]: ディレクトリ `/mnt/Srcs/VLC/build' に入ります Making all in po make[2]: ディレクトリ `/mnt/Srcs/VLC/build/po' に入ります make[2]: ディレクトリ `/mnt/Srcs/VLC/build/po' から出ます Making all in src make[2]: ディレクトリ `/mnt/Srcs/VLC/build/src' に入ります rm -f -- "../include/vlc_about.h.tmp" mkdir -p -- ../include echo "/* Automatically generated file - DO NOT EDIT */" > "../include/vlc_about.h.tmp" echo "static const char psz_license[] =" >> "../include/vlc_about.h.tmp" cat ../COPYING | sed s/'"'/'\\"'/g | gawk '{ print "\""$0"\\n\"" }' >> "../include/vlc_about.h.tmp" echo ";" >> "../include/vlc_about.h.tmp" echo "static const char psz_thanks[] =" >> "../include/vlc_about.h.tmp" grep -v '$Id:' ../THANKS | sed s/'"'/'\\"'/g | gawk '{ print "\""$0"\\n\"" }'|sed s/"<.*.> "// >> "../include/vlc_about.h.tmp"
この最後の行の処理が無限ループになるのか、1時間以上放置していても終了しなかった。
古い 4.1.2 に戻すと
kojima@xeon[/mnt/Srcs/VLC/build]% make make all-recursive ... echo "static const char psz_license[] =" >> "../include/vlc_about.h.tmp" cat ../COPYING | sed s/'"'/'\\"'/g | gawk '{ print "\""$0"\\n\"" }' >> "../include/vlc_about.h.tmp" echo ";" >> "../include/vlc_about.h.tmp" echo "static const char psz_thanks[] =" >> "../include/vlc_about.h.tmp" grep -v '$Id:' ../THANKS | sed s/'"'/'\\"'/g | gawk '{ print "\""$0"\\n\"" }'|sed s/"<.*.> "// >> "../include/vlc_about.h.tmp" echo ";" >> "../include/vlc_about.h.tmp" echo "static const char psz_authors[] =" >> "../include/vlc_about.h.tmp" grep N: ../AUTHORS | cut -d" " -f 2- | sed s/'"'/'\\"'/g | gawk '{ print "\""$0"\\n\"" }' >> "../include/vlc_about.h.tmp" echo ";" >> "../include/vlc_about.h.tmp" mv -f -- "../include/vlc_about.h.tmp" "../include/vlc_about.h" make all-recursive make[3]: ディレクトリ `/mnt/Srcs/VLC/build/src' に入ります Making all in . make[4]: ディレクトリ `/mnt/Srcs/VLC/build/src' に入ります /bin/sh ../libtool --tag=CC --mode=compile gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I.. -I../include -I../include -DSYS_LINUX ...
と一瞬で処理が進むので、どうやら sed-4.2 の問題らしい。
気になるので、処理しているデータファイルを調べたら、151行めで無限ループになっているらしい。
Julien Plissonneau Duqu醇Qne - JACK audio input module 
パッと見は特に問題なさそうなんだけど、行末に文字化けのせいかエスケープシークエンス風のコードが紛れ込んで、 LANG を ja_JP.eucJP にしているとエスケープシークエンスの終了を待つような状態になってしまう模様。
% od -cd bad-data 0000000 J u l i e n P l i s s o n n e 30026 26988 28261 20512 26988 29555 28271 25966 0000020 a u D u q u 033 , A h 033 ( B n e 30049 17440 29045 7029 16684 7016 16936 25966 0000040 - J A C K a u d i o i n 11552 18976 17217 8267 30049 26980 8303 28265 0000060 p u t m o d u l e 033 , A 033 ( 30064 8308 28525 30052 25964 11291 8257 10267 0000100 B \n \n 2626 10 0000103
LANG を C にしてやれば sed-4.2 でも問題なく通ったので、locale まわりの問題っぽいけど、 最近では ja_JP.eucJP な locale でのバグなんて直す人いるかなぁ。。
sed-4.1.2,sed-4.2,sed-4.2.1のそれぞれで試してみたけど,無限ループにならなかったです。試し方が悪かったかな。
試した内容:bad-dataをTHANKSにリネームして,無限ループになる最後の行を実行。 -- tamu 2009-06-30 (火) 12:14:45