第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 変数が定義されている行に追加する必要があります。