make 前:C以外にmakeを使う 後:参考文献

makeの第一歩+0.1: サフィックスルール

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を作ればいいことになります。


GNU makeで楽をする

いま書いたばかりの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と書けることになります。


make 前:C以外にmakeを使う 後:参考文献
小栗栖 修
メールアドレス: ogurisu[AT]kanazawa-u.ac.jp ([AT]を@におきかえてください)

Last modified: Sat Jun 14 08:48:11 JST 2008