第18章 Make でのさらなるコードの管理
GNU の make ユーティリティー (通称 make) は、ソースファイルからの実行可能なファイルの生成を制御するツールです。make は自動的に、複雑なプログラムのどの部分が変更され、再度コンパイルする必要があるのかを判断します。make は Makefiles と呼ばれる設定ファイルを使用して、プログラムを構築する方法を制御します。
18.1. GNU make および Makefile の概要
特定のプロジェクトのソースファイルから使用可能な形式 (通常は実行可能ファイル) を作成するには、必要な手順を完了します。後で反復できるように、アクションとそのシーケンスを記録します。
Red Hat Enterprise Linux には、この目的用に設計されたビルドシステム、GNU make が含まれています。
前提条件/事前作業
- コンパイルとリンクのコンセプトを理解していること
GNU make
GNU make はビルドプロセスの命令が含まれる Makefiles を読み込みます。Makefile には、特定のアクション (recipe) で特定の条件 (target) を満たす方法を記述する複数の rules が含まれています。ルールは、別のルールに階層的に依存することができます。
オプションを指定せずに make を実行すると、現在のディレクトリーで Makefile を検索し、デフォルトのターゲットに到達しようと試みます。実際の Makefile ファイル名は Makefile、makefile および GNUmakefile です。デフォルトのターゲットは、Makefile の内容で決まります。
Makefile の詳細
Makefiles は比較的単純な構文を使用して variables と rules を定義します。Makefiles は targetと recipe で構成されます。ターゲットでは、ルールが実行された場合にどのような出力が表示されるのかを指定します。レシピの行は、TAB 文字で開始する必要があります。
通常、Makefile は、ソースファイルをコンパイルするためのルール、作成されるオブジェクトファイルをリンクするためにのルール、階層上部のエントリーポイントとしての役割を果たすターゲットで構成されます。
単一のファイル (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 iが必要です。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 変数が定義されている行に追加するだけです。
その他のリソース
- GNU make: 概要: 「2 An Introduction to Makefiles」
- 15章GCC でのビルドコード
18.2. 例: Makefile の使用した C プログラムの構築
以下の例の手順に従い、Makefile を使用して C プログラムを構築します。
前提条件/事前作業
手順
hellomakeディレクトリーを作成して、そのディレクトリーに移動します。$ mkdir hellomake $ cd hellomake
以下のコンテンツで
hello.cファイルを作成します。#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello, World!\n"); return 0; }以下の内容で
Makefileファイルを作成します。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 レシピの行は、Tab 文字で開始する必要があります。ブラウザーから上記のテキストをコピーする場合は、スペースが挿入される可能性があるので、これは手動で変更してください。
makeを実行します。$ make gcc -c -Wall hello.c -o hello.o gcc hello.o -o hello
このコマンドで
hello実行可能ファイルが作成されます。この実行可能ファイル
helloを実行します。$ ./hello Hello, World!
Makefile のターゲット
cleanを実行して、作成されたファイルを削除します。$ make clean rm -rf hello.o hello
その他のリソース
18.3. make のドキュメントリソース
make の詳細情報は、以下に記載のリソースを参照してください。
インストールされているドキュメント
manおよびinfoツールを使用して、お使いのシステムにインストールされている man ページと情報ページを表示します。$ man make $ info make
オンラインのドキュメント
- Free Software Foundation が提供する GNU Make Manual
- 『Red Hat Developer Toolset User Guide 』の「Chapter 3. GNU make」

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.