2.5. Make でのさらなるコードの管理
GNU make ユーティリティー (略称 make) は、ソースファイルからの実行可能ファイルの生成を管理するツールです。make は自動的に、複雑なプログラムのどの部分が変更されたかを判断し、再コンパイルする必要があります。make は Makefile と呼ばれる設定ファイルを使用して、プログラムの構築方法を制御します。
2.5.1. GNU make および Makefile の概要 リンクのコピーリンクがクリップボードにコピーされました!
特定のプロジェクトのソースファイルから使用可能な形式 (通常は実行ファイル) を作成するには、必要な手順を完了します。後で繰り返し実行できるように、アクションとそのシーケンスを記録します。
Red Hat Enterprise Linux には、この目的に合わせて設計されたビルドシステムである、GNU make が含まれています。
- GNU
makeとは -
GNU
makeは、ビルドプロセスの命令が含まれる Makefile を読み込みます。Makefile には、特定のアクション (レシピ) で特定の条件 (ターゲット) を満たす方法を記述する複数の ルール が含まれています。ルールは、別のルールに階層的に依存できます。
オプションを指定せずに make を実行すると、カレントディレクトリーで Makefile が検索され、デフォルトのターゲットに到達しようとします。実際の Makefile ファイル名は Makefile、makefile、および GNUmakefile のいずれかになります。デフォルトのターゲットは、Makefile の内容で決まります。
特定のターゲットで make を実行するには、以下を実行します。
$ make target
- Makefile の構造と構文
- Makefile は比較的単純な構文を使用して 変数 と ルール を定義します。Makefile は ターゲット と レシピ で構成されます。ターゲットでは、ルールが実行された場合にどのような出力が表示されるのかを指定します。レシピの行は、TAB 文字で開始する必要があります。
通常、Makefile は、ソースファイルをコンパイルするルール、作成されるオブジェクトファイルをリンクするルール、および階層上部のエントリーポイントとしてのロールを果たすターゲットで設定されます。
- 基本的な 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 変数が定義されている行に追加します。
2.5.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を実行します。$ makegcc -c -Wall hello.c -o hello.o gcc hello.o -o helloこのコマンドで、実行可能ファイル
helloが作成されます。この実行可能ファイル
helloを実行します。$ ./helloHello, World!Makefile のターゲット
cleanを実行して、作成されたファイルを削除します。$ make cleanrm -rf hello.o hello
関連情報
2.5.3. make のドキュメント リンクのコピーリンクがクリップボードにコピーされました!
make の詳細は、以下に記載のドキュメントを参照してください。
- インストールされているドキュメント
-
システムにインストールされている man ページを表示するには、
manユーティリティーを使用します。
$ man makeシステムにインストールされている情報ページを表示するには、
infoユーティリティーを使用します。$ info make
-
システムにインストールされている man ページを表示するには、