ACE Tutorial 005
On the road to a multithreaded server


(おそらく)最後は、依存関係を 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);


[インデックスへ] [次へ進む]