makefileを作成するときは、通常、最後から始めて、最初に向かって進みます。あなたは最終製品から始めて、それを出発点からどのように生産するかについての規則を与えます。
この場合、2つの最終製品があるようです:A
とC
。
all: A C
コマンドラインでターゲットを指定しない場合、makeはmakefileに表示される最初のターゲットをビルドします。したがって、これをファイルの最初のターゲットとして、その下に他のターゲットを配置する必要があります。これをツリーと考えると、これがツリーのルートであり、以下の各アイテムはそのツリーのブランチです。
このルートの下に含まれていないセカンダリターゲットを定義することもできます。たとえば、多くの(ほとんど?)makefileには、clean
ビルド中に作成されるすべての中間ファイルを削除するという名前のターゲットが含まれています。これは、コマンドとして発行するだけの一部としてではなく、ユーザーが呼び出す場合にのみ使用されます。make clean
make
とにかく、次に、それらのそれぞれが何に依存しているか、そしてそれが何に依存しているかからそれを作成する方法についてそれを伝えます:
A: A.o B.o
$(CC) -o A A.o B.o
C: B.o C.o
$(CC) -o B B.o C.o
次に(必要に応じて、ここにはありません)、各.o
ファイルがファイルにどのように依存しているかを説明し.c
ます。ただし、Gmakeには(既存のほぼすべてのmake
ツールと同様に)、CまたはC++ファイルをコンパイルして一致するオブジェクトファイルを生成する方法を指示するルールが組み込まれています。これらは、makefileの上部に次のようなものが含まれているようなものになります。
CC = gcc
.c.o:
$(CC) $(CFLAGS) -c $*.c
これにより、CFLAGSの現在の値がフラグとしてコンパイラに渡されるため、必要なフラグに設定する必要があります。この場合は、次のようになります。
CFLAGS = -std=c89
通常、これをmakefileの先頭に配置し、通常は任意のターゲットの前に配置します。
これは、makefileで実行できるすべてのことをカバーすることすらできないことを付け加えておきます。たくさんのファイルを扱うときに本当に便利なショートカットはたくさんありますが、ソースファイルが3つしかない場合はあまり役に立ちません。