第18章 Make での追加コードの管理
GNU Make ユーティリティー (略称 Make) は、ソースファイルからの実行可能ファイルの生成を管理するツールです。Make は自動的に、複雑なプログラムのどの部分が変更されたかを判断し、再コンパイルする必要があります。Make は、Makefiles と呼ばれる絵設定ファイルを使用して、プログラムを構築する方法を管理します。
18.1. GNU make
および Makefile
の概要
特定のプロジェクトのソースファイルから使用可能な形式 (通常は実行可能ファイル) を作成するには、いくつかの必要な手順を実行します。後で繰り返し実行できるように、アクションとそのシーケンスを記録します。
Red Hat Enterprise Linux には、この目的に合わせて設計されたビルドシステムである、GNU make
が含まれています。
前提条件
- コンパイルとリンクの概念を理解している。
GNU make
GNU make
はビルドプロセスの命令が含まれる Makefile を読み込みます。Makefile には、特定のアクション (レシピ) で特定の条件 (ターゲット) を満たす方法を記述する複数の ルール が含まれています。ルールは、別のルールに階層的に依存できます。
オプションを指定せずに make
を実行すると、現在のディレクトリーで Makefile を検索し、デフォルトのターゲットに到達しようと試みます。実際の Makefile ファイル名は Makefile
、makefile
、および GNUmakefile
です。デフォルトのターゲットは、Makefile の内容で決まります。
Makefile の詳細
Makefile は比較的単純な構文を使用して 変数 と ルール を定義します。Makefile は ターゲット と レシピ で設定されます。ターゲットでは、ルールが実行された場合の出力を指定します。レシピの行は、TAB 文字で開始する必要があります。
通常 Makefile には、ソースファイルをコンパイルするルール、作成されるオブジェクトファイルをリンクするルール、および階層の上部にあるエントリーポイントとして機能するターゲットが含まれます。
1 つのファイル (hello.c
) で設定される C プログラムを構築する場合は、以下の Makefile
を参照してください。
all: hello hello: hello.o gcc hello.o -o hello hello.o: hello.c gcc -c hello.c -o hello.o
上記の例では、ターゲット all
に到達するには、ファイル hello
が必要です。hello
を取得するには、hello.o
(gcc
でリンクされる) が必要で、これは hello.c
(gcc
でコンパイルされる) に基づいて作成されます。
ターゲットの all
は、ピリオドで開始されない最初のターゲットであるため、デフォルトのターゲットとなっています。この Makefile
が現在のディレクトリーに含まれている場合に、引数なしで make
を実行するのは、make all
を実行するのと同じです。
一般的な Makefile
より一般的な Makefile は、この手順を一般化するために変数を使用し、ターゲット clean を追加して、ソースファイル以外をすべて削除します。
CC=gcc CFLAGS=-c -Wall SOURCE=hello.c OBJ=$(SOURCE:.c=.o) EXE=hello all: $(SOURCE) $(EXE) $(EXE): $(OBJ) $(CC) $(OBJ) -o $@ %.o: %.c $(CC) $(CFLAGS) $< -o $@ clean: rm -rf $(OBJ) $(EXE)
このような Makefile にソースファイルを追加する場合には、SOURCE 変数が定義されている行に追加する必要があります。