複数ファイルの場合では、Makefileの書式は
ターゲット: ソース
だと説明しました。 実はこれも省略記法なのです。 正式には
ターゲット: ソース
コマンド
です。 コマンドには、ソースなどからターゲットを生成する方法を書きます。 複数行にわたって複数のコマンドを書くことができます。 Makefileでは、コマンドを書く行には最初に一つ以上のタブを入れなければなりません。
例を上げましょう。
mycat.o: mycat.c
では、ソースの名前に.cが付いているのでCコンパイラで処理されました。 これは正式には
mycat.o: mycat.c
$(CC) -c mycat.c
と書くところを、mycat.cからmycat.oを作る方法をmakeが知っているので省略したのです。 $(CC)はマクロCCの参照です。
mycat: mycat.o getline.o copy.o
は、 ソースは全てオブジェクトファイルで、ターゲットmycatに.oの付いたmycat.oを含むので、これらを全てをリンクせよという指示だとmakeは判断します。 これも
mycat: mycat.o getline.o copy.o
$(CC) mycat.o getline.o copy.o -o mycat
とリンクの方法を指定するところを、makeにまかせて省略したのです。
コマンドで処理されるファイルにソースで指定されていないファイルが含まれていたり、逆にソースで指定されているのにコマンドで処理されないファイルがあったりしてもかまいません。 makeはターゲットとソースのタイムスタンプを比較してコマンドを実行するかどうか決定するだけです。
想像がつくと思いますが、マクロCFLAGSやLOADLIBESで指定したオプションも、コマンドが省略されている時は適切なところに挿入されるようになっています。
ここではCのコンパイラでターゲットを生成する例で、しかも省略できる例しかあげませんでしたが、コマンド部分にはどんなunixコマンドを書いてもかまいません。 具体的な例はこのあとのちょっとした応用やC以外にmakeを使うを見てください。