make入門 #4 組み込みルール

組み込みルールの概要

前回(make入門 #3 自動変数とパターンルール)は以下のようなパターンルールについて説明しました。
prog2: main.o sub.o
        gcc -o $@ $^

%.o: %.c
        gcc -c -o $@ $<

main.o: main.c sub.h
sub.o: sub.c sub.h
ここで青字で示されるパターンルールをMakefileから削除してみます。
prog2: main.o sub.o
        gcc -o $@ $^

main.o: main.c sub.h
sub.o: sub.c sub.h
このMakefileをカレントディレクトリに配置してmakeを実行します。
$ make
cc    -c -o main.o main.c
cc    -c -o sub.o sub.c
gcc -o prog2 main.o sub.o
なんと、このMakefileでもビルドが成功します。 とくに驚くべきことは、*.cから*.oを作成する方法を指定しなていにもかかわらず、コンパイルが実行されています。 実は、makeはデフォルトのパータンルールを持っており、パターンルールが明示されていない場合、そのデフォルトのルールが使用されます。 このパターンルールを組み込みルールと呼びます。

C言語用の組み込みルール

以下のGNU Makeの公式マニュアルに組み込みルールが列挙されています。 この中で*.cから*.oを作成する組み込みルールは以下のように記載されています。
$(CC) $(CPPFLAGS) $(CFLAGS) -c
さらに、上記の変数の$(CC)なども組み込みのデフォルト値があります。以下に記載されています。 上記のサイトに記載されている、それぞれの変数のデフォルト値を以下に示します。
変数デフォルト値
CC cc
CPPFLAGS (なし)
CFLAGS (なし)
これらの変数をMakefile内で以下のように上書きできます。
CFLAGS = -g3 -O2

prog2: main.o sub.o
        gcc -o $@ $^

main.o: main.c sub.h
sub.o: sub.c sub.h
このMakefileを使ってmakeを実行すると以下のようにCFLAGSに設定したオプションが付与されています。
cc -g3 -O2   -c -o main.o main.c
cc -g3 -O2   -c -o sub.o sub.c
gcc -o prog2 main.o sub.o

まとめ

本記事では、組み込みルールについて説明しました。

以下には、make入門の全記事がリストアップされています。

0 件のコメント: