第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 ファイル名は、Makefilemakefile および GNUmakefile のいずれかです。デフォルトのターゲットは、Makefile の内容で決まります。

Makefile の詳細

Makefile は比較的単純な構文を使用して 変数ルール を定義します。Makefile は ターゲットレシピ で構成されます。ターゲットでは、ルールが実行された場合の出力を指定します。レシピの行は、TAB 文字で開始する必要があります。

通常 Makefile には、ソースファイルをコンパイルするルール、作成されるオブジェクトファイルをリンクするルール、および階層の上部にあるエントリーポイントとして機能するターゲットが含まれます。

1 つのファイル (Makefile) で構成される C プログラムを構築する場合は、以下の hello.c を参照してください。

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.c (gcc でコンパイル) から作成する hello.o (gcc でリンク) が必要です。

ターゲットの all は、ピリオド (.) で開始されない最初のターゲットであるため、デフォルトのターゲットとなります。引数なしに make を実行するのは、現在のディレクトリーに Makefile が含まれている場合に 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 変数が定義されている行に追加する必要があります。

関連情報

18.2. 例: Makefile を使用した C プログラムの構築

以下の例の手順に従い、Makefile を使用してサンプル C プログラムを構築します。

前提条件

手順

  1. hellomake ディレクトリーを作成して、そのディレクトリーに移動します。

    $ mkdir hellomake
    $ cd hellomake
  2. 以下の内容で hello.c ファイルを作成します。

    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
      printf("Hello, World!\n");
      return 0;
    }
  3. 以下の内容で 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 文字で開始する必要があります。ブラウザーから上記のテキストをコピーする場合、スペースを代わりに貼り付けてしまう可能性があります。この場合、手動で修正します。

  4. make を実行します。

    $ make
    gcc -c -Wall hello.c -o hello.o
    gcc hello.o -o hello

    このコマンドで、実行可能ファイル hello が作成されます。

  5. この実行可能ファイル hello を実行します。

    $ ./hello
    Hello, World!
  6. Makefile ターゲットの clean を実行して、作成されたファイルを削除します。

    $ make clean
    rm -rf hello.o hello

関連資料

18.3. make のドキュメントリソース

make の詳細は、以下に記載のドキュメントを参照してください。

インストールされているドキュメント

  • man ツールおよび info ツールを使用して、お使いのシステムにインストールされている man ページと情報ページを表示します。

    $ man make
    $ info make

オンラインドキュメント


このページには機械翻訳が使用されている場合があります (詳細はこちら)。