Makefile を作成するプロセスは次のとおりです。
- 変数の定義: コンパイラやコンパイル オプションなどの変数を定義します。
- ターゲットファイルの定義: ターゲットファイル名を定義します。
- ソース ファイルの定義: すべてのソース ファイルを定義します。
- ルールの定義: 各ソース ファイルをオブジェクト ファイルにコンパイルするためのルールを定義します。
- 擬似ターゲットの定義: オブジェクト ファイルおよびその他の中間ファイルをクリーンアップする擬似ターゲットを定義します。
以下は Makefile の例です。各ディレクトリに で.c
終わるソース ファイルがあり、対応するファイルにコンパイルする必要があると想定しています.o
。
CC = gcc
CFLAGS = -Wall -Wextra -Werror
SRCDIR = src
OBJDIR = obj
TARGET = myapp
SOURCES := $(wildcard $(SRCDIR)/**/*.c)
OBJECTS := $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(SOURCES))
$(TARGET): $(OBJECTS)
$(CC) $(CFLAGS) $^ -o $@
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -rf $(OBJDIR)/*.o $(TARGET)
CC
使用するコンパイラを定義します。ここでは gcc が使用されます。CFLAGS
コンパイル オプションが定義され、いくつかの警告オプションがここで有効になります。SRCDIR
ソースファイルが配置されるディレクトリを定義します。OBJDIR
中間ファイルとオブジェクトファイルが配置されるディレクトリを定義します。TARGET
最終的に生成される実行可能ファイル名を定義します。SOURCES
すべてのソース ファイルのリストです。ワイルドカードを使用してサブディレクトリ内のソース ファイルを再帰的に検索します。**
OBJECTS
すべてのオブジェクト ファイルのリストです。patsubst 関数を使用してソース ファイル パスをオブジェクト ファイル パスに置き換えます。$(TARGET): $(OBJECTS)
ターゲット ファイルがすべての中間ファイルに依存しており、$ make myapp
コマンド ラインに入力することで最終的な実行可能ファイルを生成できることを示します。$(OBJDIR)/%.o: $(SRCDIR)/%.c
ルールを示し、ディレクトリ内のすべてのファイルを対応するファイルにコンパイルし、ディレクトリに保存します。$(SRCDIR)
.c
.o
$(OBJDIR)
.PHONY: clean
clean が実際のファイルではなく疑似ターゲットであり、$ make clean
コマンド ラインに入力することですべての中間ファイルとターゲット ファイルを削除できることを示します。