まず、make はプログラムを実行していないことに注意してください。make ファイルは一連の推論規則です。
あるものを別のものに変える方法をmakeに伝え、次に目標を与えます。次に、推論ルールを組み合わせて手順を把握し、途中でファイルのタイムスタンプをチェックして、不要な作業を繰り返さないようにします。
SUFFIXES は、ファイルで認識すべきサフィックスを make に指示します。
2 つの接尾辞をリストするルール: .co は、.c 接尾辞を持つ SINGLE ファイルを取得し、それを .o 接尾辞を持つ SINGLE FILE に変換するルールを示します。
cc -c x.c
xo をビルドする
.c.o:
<TAB>cc -c $<
「$<にあるソースファイルを取得し、このコマンドを使用して.oファイルに変換します」と言います
次に、次のようなルールを作成できます。
mycmd: x.o y.o z.o
<TAB>cc -o $@ $^
また、現在のディレクトリに 3 つの c ファイル (xc、yc、および zc) がある場合、make は、mycmd を作成するときに .o ファイルが必要であり、.o ファイルを作成できることを認識できると推測できます。 .c、そのようになります。
特別な変数の定義はこちら: http://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html
したがって、(コマンドラインで)入力すると:
make mycmd
make はルールのリストを調べて、次のことを確認します。ああ、それを作成するには、xo、yo、および zo が必要です。次に、ディスクに移動します。xc、xo、yc、zc が見つかったとします。次のように考えます。
私は xo.. を持っていますが、.o ファイルは .c ファイルから作成されています... ソースが変更されたかどうかを確認する必要があります。タイムスタンプをチェックし、.c ファイルが .o ファイルよりも新しい場合は再構築します。
yc と zc については、cc を使用してそれらを .o ファイルに変換できることを認識しています。
xo が xc よりも新しいと仮定すると、make は次のようになります。
cc -c y.c
cc -c z.c
cc -o myprog x.o y.o z.o
次に make を再度実行すると、同じ手順が実行されますが、今回は myprog がすべての .o ファイルよりも新しいことがわかり、.o ファイルはすべて .c ファイルよりも新しいため、何もしません。
ここで、xc を編集して再度 make を実行するとします。一連のチェックを再度実行し、xc が xo よりも新しいことを検出し、再構築します。次に、mycmd が xo よりも古いことがわかります。そのため、再リンクします。
したがって、非常に短い一連のルールで、かなり多くの作業が行われます。