Makefileファイルの作成方法


節選自:《Linux Cプログラミングワンストップ学習》,作者:宋力杉
Makefileが発生した原因は、コンパイルするたびに作業量を減らし、コンパイルコマンドの入力エラーによるバグを避けることが主な原因です.また、makeの場合、アクティブファイルが変更されたかどうかを検出し、変更されたファイルがあれば再コンパイルし、なければ更新しません.
次は完全なMakefileファイルです.
main : main.o stack.o maze.o
     gcc main.o stack.o maze.o -o main

main.o : main.c main.h stack.h maze.h
     gcc -c main.c

stack.o : stack.c stack.h main.h
     gcc -c stack.c

maze.o : maze.c maze.h main.h
     gcc -c maze.h
clean :
     @echo "cleanning project"
     -rm main *.o
     @echo "clean completed"

現在のディレクトリの下にMakefileファイルがある場合、makeを入力すると自動的にこのMakefileファイルが読み込まれ、対応するコンパイル手順が完了します.Makefileファイルはルール(Rule)で構成され、各ルールのフォーマットは次のとおりです.
target ... : prerequisites ...
     command1
     command2
     ...

たとえば、上記の例は4つのルールから構成されています.
第1のルールのセットでは、mainはターゲット、mainである.o stack.o maze.oは条件(prerequisites)である.
targetを更新する場合は、prerequisitesをすべて更新する必要があります.また、任意のprerequisiteに更新がある場合は、このtargetを更新する必要があります.targetの「更新」は、その下にあるすべてのcommandを実行することを意味します.各commandはtabで始まる.Makefileのtabで始まるコマンドごとに、makeはshellプロセスを作成して実行します.
各Makefileファイルについて、最初のruleのtargetはdefault targetであり、このdefault targetが更新された場合、makeは終了し、残りはすべてこのdefault targetにサービスされます.最初のコンパイルではmainファイルを生成する必要があり、更新する必要がありますが、すべてのprerequisitesを更新する必要があります.これらのprerequisitesをtargetsとして更新する必要があるかどうかをさらに検出し、更新する必要がある場合は更新操作を行います.最後にmainファイルが正常に更新されるまで、終了します.
make検出ファイルが変更されたかどうかを検出する原理は、targetとそのprerequisitesの最近の変更時間を検出し、あるprequisiteの最近の変更時間がtargetより遅い場合は、targetが更新する必要があることを示します.
最後に、Makefileファイルには、コンパイルによって生成されたバイナリファイルを消去し、ソースファイルのみを保持するcleanルールがあります.コマンドmake cleanを使用してcleanルールを実行します.ここでmake cleanとは、cleanというruleからコンパイルを実行することを意味し、最初のruleからは開始されません.
@は,その後のコマンド自体を表示せず,コマンドの結果のみを表示することを意味する.echoは出力後の情報です
rmコマンドはremove、-エラーを無視して、rmの失敗によるmakeの実行終了を防止するために、後続のコマンドを実行し続けます.-がない場合、rmのターゲットファイルが存在しない場合、rmコマンドは失敗し、エラーが発生します.makeは直接終了し、次の2番目のechoコマンドは実行されません.-がある場合、rmは失敗しましたが、このエラーは無視され、次のコマンドを実行し続けます.