プログラミングユーティリティ

暗黙の規則を使用してメークファイルを簡素化する : 接尾辞の規則

main.o および data.o.c ファイルからコンパイルするコマンド行は、このバージョンでは接尾辞 .c.o の規則と機能的に同一であるため、ターゲットのエントリが重複します。make は、そのようなコマンド行がメークファイルに記述されているかどうかに関係なく、同じようにコンパイルを実行します。次のメークファイルは、.c.o の規則によって各オブジェクトファイルをコンパイルし、各オブジェクト用のコマンド行を省略しています。

表 4-6 接尾辞の規則を使用して C ソースをコンパイルするメークファイル
# 接尾辞の規則を使用して 2 つの C ソースから
# 1 つのプログラムをコンパイルするメークファイル
CFLAGS= -O 

.KEEP_STATE:

functions: main.o data.o 
         $(LINK.c) -o functions main.o data.o 
clean: 
         rm functions main.o data.o


注 -

接尾辞のすべての規則は、表 4-8 を参照してください。


makemain.o および data.o という依存関係を処理する際に、これらの依存関係のターゲットのエントリがありません。make は、適切な暗黙の規則を調べて適用します。この場合は、接尾辞 .c.o の規則が選択され、名前が同じで接尾辞が .c の依存ファイルから .o ファイルが構築されます。


注 -

make は、接尾辞リスト中に記述されている順番に従って使用する依存ファイルおよび接尾辞の規則を決定します。たとえば、main.cmain.s の両方のファイルがディレクトリにある場合は、接尾辞のリストにおいて .c.s よりも前に記述されているため、make.c.o の規則を使用します。


まず、make は接尾辞リストにターゲットファイルの接尾辞が含まれているかどうかを調べます。main.o の場合は .o がリストに含まれています。次に、make はターゲットファイルを構築するための接尾辞の規則と、元になる依存ファイルを調べます。依存ファイルの名前は、ターゲットの名前と接尾辞を除いて同一です。この場合は、make.c.o の規則を調べて main.c という名前の依存ファイルを検出するため、.c.o の規則を使用します。

接尾辞リストは、.SUFFIXES という名前の特殊ターゲットです。SUFFIXES マクロの定義にはさまざまな接尾辞が含まれています。.SUFFIXES は、このマクロに依存するように指定されています。

表 4-7 標準の接尾辞のリスト
SUFFIXES= .o .c .c‾ .cc .cc‾ .C .C‾ .y .y‾ .l .l‾ .s .s‾ .sh .sh‾ .S .S‾ .ln ¥ .h .h‾ .f .f‾ .F .F‾ .mod .mod‾ .sym .def .def‾ .p .p‾ .r .r‾ ¥ .cps .cps‾ .Y .Y‾ .L .L‾ .SUFFIXES: $(SUFFIXES)

以下の例は、すべての実行可能プログラムをコンパイルするメークファイルです。各プログラムには、ソースファイルが 1 つずつあります。各実行可能ファイルは、ベース名が同じで接尾辞が .c のソースファイルから構築されます。たとえば、demo_1demo_1.c から構築されます。


注 -

clean と同様に、all はターゲットの慣用名です。all は、依存関係リストに含まれるすべてのターゲットを構築します。通常は、makemake all は同一の処理を行います。


# 1 組の C プログラムをコンパイルするメークファイル。
# 1 つのソース (.c ファイル) から 1 つのプログラムを生成。
CFLAGS= -O 
.KEEP_STATE:

all: demo_1 demo_2 demo_3 demo_4 demo_5

この場合は、いずれのターゲットにも接尾辞がありません。そのため、make は各ターゲットに空の (NULL) 接尾辞が付いているとして処理します。次に、make は接尾辞の規則と、有効な接尾辞の付いた依存ファイルを検索します。demo_2 の場合は、demo_2.c という名前のファイルを検索します。接尾辞 .c の規則のターゲットエントリと、それに対応する .c ファイルがあるため、make は接尾辞 .c の規則を使用して demo_2.c から demo_2 を構築します。

空の接尾辞のターゲットに明示的な依存関係があるときは、あいまいさを避けるために、make は接尾辞の規則を使用したターゲットの構築は行いません。

program: zap 
zap:

このメークファイルを使用して make を実行しても、何も出力されません。

$ make program 
$