makeは、例えばfile.oが必要なとき、file.cがあればCコンパイラでコンパイルします。 これはサフィックス .o と .c の関係をmakeが知っているから可能になります。
ここで、一例として数値計算で、すこしづつパラメータを変えて計算させたいとしましょう。 数値計算を行うプログラム名を sample とし、引数はパラメーターの保存されたファイルで、計算結果は標準出力に出るとします。
% ./sample prameter01.in > parameter01.dt
このようにすることで、パラメータparameter01.inに対応する計算結果がparameter01.dtに保存されます。
さて、大量のパラメータファイルをmakeで処理することを考えてみましょう。 パラメータの入った10のファイル
prameter01.in prameter02.in prameter03.in ... prameter10.in
があったとします。そして、それぞれの計算結果を
prameter01.dt prameter02.dt prameter03.dt ... prameter10.dt
に保存することにします。 このとき、makeがサフィックスが.dtのファイルはサフィックスが.inのファイルからコマンドsampleを使って作られると知っていれば、Makefileに
prameter01.dt:
とだけ書けば良いことになりますね。 もちろん、makeはそんなことは知らないので教えてやれねばなりません。 そこでMakefileに次のように書きます。
.SUFFIXES: .in .dt .in.dt: ./samplen $< > $@
.SUFFIXESはmakeにどのようなサフィックスを使うか教えるための特別のターゲットです。
そして次の.in.dt:が、 file.inからfile.dtを作る方法の指定です。
コマンド部分に$<と$@という見慣れないものがありますが、parameter01.dtを生成するときには、$<がparameter01.inに、$@がparameter01.dtにおきかわります。
ですから、こんなMakefileを作ればいいことになります。
いま書いたばかりのMakefileで何が 面倒かというとDATAマクロの定義でしょう。
DATA = prameter01.dt prameter02.dt prameter03.dt prameter04.dt prameter05.dt \ prameter06.dt prameter07.dt prameter08.dt prameter09.dt prameter10.dt
あまりにも当たり前のことを書きならべなければなりませんが、GNU makeならば楽ができます。
Linuxをお使いならば、たぶんGNU make がデフォルトのmakeでしょう。
お使いのmakeがGNU makeかどうかはmake --versionを実行し、GNU makeの文字があることを確認します。
もしかすると gmake という名前でインストールされているかもしれません。
makeを実行するディレクトリにパラメータファイル(.inで終るファイル)がある状況だとします。 これらのすでにあるファイル名から計算結果のファイル名(.dtで終るファイル名)を自動的に生成できればいいのです。
まず、.inで終るファイル名を獲得する方法です。 Makefileに次のように書きます。
IN = $(wildcard *.in)
これでマクロINに.inで終るファイル名が空白で区切られた文字列として保存されます。 この文字列の.inを.dtに置き換えてやれば、求める計算結果のファイル名からなる文字列になります。 文字列の置換は次のように書きます。
DATA = $(IN:.in=.dt)
文字列INのなかで.inを.dtに置き換えてできた文字列がマクロDATAに保存されます。 これを使うと先程のMakefileは新しくMakefileと書けることになります。