(おそらく)最後は、依存関係を Makefile から抽出して .depend に書き込んでくれる perl スクリプトだ。
eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}'
& eval 'exec perl -S $0 $argv:q'
if 0;
require "getopts.pl";
&Getopts("f:o:");
$opt_f = "Makefile" if( ! $opt_f );
$opt_o = ".depend" if( ! $opt_o );
# 'make depend' で散らかった Makefile を開いて perl 配列に読み込む
open(IF,"<$opt_f") || die;
@makefile = <IF>;
close(IF);
# ここで .depend とテンポラリな Makefile を開く。
# ここからオリジナルの Makefile をこれら二つに振り分ける。
open(DF,">$opt_o") || die;
open(MF,">$opt_f.tmp") || die;
# オリジナルのファイルから一行ずつ読み込んで…
foreach (@makefile) {
# もし依存関係の区画にいるなら、その行を .depend に書く
#
if( $depend ) {
print DF $_;
}
else {
# まだ依存関係の区画でなければ、make dependが
# 書き込むセパレータかどうかをチェックする。
#
if( m/^\Q# DO NOT DELETE THIS LINE -- g++dep uses it.\E/ ) {
# もしそうなら、modeを変更して、この行を飛ばす。
++$depend;
next;
}
# "include .depend"を挿入する位置ならばスキップする。
# こうしないと、処理した Makefile 中に大量の include .depend が埋め込まれる
next if( m/^include $opt_o/ );
# テンポラリの Makefile に依存関係以外の内容を出力する
print MF $_;
}
}
# 新しい Makefile に依存関係を include するように書く
print MF "include $opt_o\n";
# 二つの出力ファイルを閉じる
close(DF);
close(MF);
# オリジナルの Makefile を消して、テンポラリをリネームする。
# ここでエラーチェックすべきなのは明らかだが、Makefile は
# 何らかのリビジョンコントロールシステムにチェックインされて
# いるはずなので不要である。もちろんチェックインしているよね?
unlink("$opt_f");
rename("$opt_f.tmp","$opt_f");
exit(0);