パターンマッチングの規則は、機能的には暗黙の規則と似ています。パターンマッチングの規則では、ターゲットと依存関係のファイルの関係を、接頭辞 (パス名を含む) と接尾辞のいずれかまたは両方を基準にして指定できるため、暗黙の規則よりも記述が簡単で強力です。パターンマッチングの規則は、次の形式で記述するターゲットエントリです。
tp%ts: dp%ds rule
ここで、tp および ts は、ターゲットの名前の接頭辞および接尾辞 (省略可能) です。dp および ds は、依存関係の名前の接頭辞および接尾辞 (省略可能) です。% は、両方に共通するベース名を示すワイルドカードです。
make は、接尾辞の規則の前にパターンマッチングの規則を調べます。このため、標準の暗黙の規則を無効にすることもできますが、通常は無効にしないでください。
ターゲットを構築する規則がない場合は、make はパターンマッチングの規則を検索してから、接尾辞の規則を調べます。使用可能であれば、パターンマッチングの規則が使用されます。
パターンマッチングの規則のターゲットエントリに規則が含まれていない場合は、make は、規則のない明示的なターゲットエントリを持つものとして、ターゲットファイルを処理します。したがって、make は接尾辞の規則を検索し、SCCS からターゲットファイルのバージョンを取り出し、空の規則を持つものとして最終的にターゲットを処理します (ターゲットは、その実行においては更新されている (最新である) とみなされます)。
troff ソースファイルを troff 出力ファイルにフォーマットするパターンマッチングの規則は、以下のとおりです。
%.tr: %.ms troff -t -ms $< > $@
以下の表に、デフォルトのメークファイル (/usr/share/lib/make/make.rules) に記述されている標準の接尾辞の規則と定義済みマクロを示します。
表 4-8 標準の接尾辞の規則
用途 |
接尾辞規則の名前 |
コマンド行 |
---|---|---|
アセンブリファイル | .s.o | $(COMPILE.s) -o $@ $< |
.s | $(COMPILE.s) -o $@ $< | |
.s.a | $(COMPILE.s) -o $% $< | |
$(AR) $(ARFLAGS) $@ $% | ||
$(RM) $% | ||
.S.o | $(COMPILE.S) -o $@ $< | |
.S.a | $(COMPILE.S) -o $% $ | |
$(AR) $(ARFLAGS) $@ $% | ||
$(RM) $% | ||
C ファイル (.c の規則) | .c | $(LINK.c) -o $@ $< $(LDLIBS) |
.c.ln | $(LINT.c) $(OUTPUT_OPTION) -i $< | |
.c.o | $(COMPILE.c) $(OUTPUT_OPTION) $< | |
.c.a | $(COMPILE.c) -o $% $< | |
$(AR) $(ARFLAGS) $@ $% | ||
$(RM) $% | ||
C++ ファイル | .cc | $(LINK.cc) -o $@ $< $(LDLIBS) |
.cc.o | $(COMPILE.cc) $(OUTPUT_OPTION) $< | |
.cc.a | $(COMPILE.cc) -o $% $< | |
$(AR) $(ARFLAGS) $@ $% | ||
$(RM) $% | ||
C++ ファイル (SVR4 書式) | .C | $(LINK.C) -o $@ $< $(LDFLAGS) $*.c |
.C.o | $(COMPILE.C) $< | |
.C.a | $(COMPILE.C) $< | |
$(AR) $(ARFLAGS) $@ $*.o | ||
$(RM) -f $*.o | ||
FORTRAN 77 ファイル | .cc.o | $(LINK.f) -o $@ $< $(LDLIBS) |
.cc.a | $(COMPILE.f) $(OUTPUT_OPTION) $< | |
$(COMPILE.f) -o $% $< | ||
$(AR) $(ARFLAGS) $@ $% | ||
| $(RM) $% | |
.F | $(LINK.F) -o $@ $< $(LDLIBS) | |
.F.o | $(COMPILE.F) $(OUTPUT_OPTION) $< | |
.F.a | $(COMPILE.F) -o $% $< | |
$(AR) $(ARFLAGS) $@ $% | ||
$(RM) $% |
表 4-9 標準の接尾辞の規則
用途 |
接尾辞規則の名前 |
コマンド行 |
---|---|---|
lex ファイル | .l | $(RM) $*.c |
$(LEX.l) $< > $*.c | ||
$(LINK.c) -o $@ $*.c $(LDLIBS) | ||
$(RM) $*.c | ||
.l.c | $(RM) $@ | |
$(LEX.l) $< > $@ | ||
.l.ln | $(RM) $*.c | |
$(LEX.l) $< > $*.c | ||
$(LINT.c) -o $@ -i $*.c | ||
$(RM) $*.c | ||
.l.o | $(RM) $*.c | |
$(LEX.l) $< > $*.c | ||
$(COMPILE.c) -o $@ $*.c | ||
$(RM) $*.c | ||
.L.C | $(LEX) $(LFLAGS) $< | |
.L.o | $(LEX)(LFLAGS) $< | |
$(COMPILE.C) lex.yy.c | ||
.L.o | rm -f lex.yy.c | |
mv lex.yy.o $@ | ||
Modula 2 ファイル | .mod | $(COMPILE.mod) -o $@ -e $@ $< |
.mod.o | $(COMPILE.mod) -o $@ $< | |
.def.sym | $(COMPILE.def) -o $@ $< | |
NeWS | .cps.h | $(CPS) $(CPSFLAGS) $*.cps |
Pascal ファイル | .p | $(LINK.p) -o $@ $< $(LDLIBS) |
.p.o | $(COMPILE.p) $(OUTPUT_OPTION) $< | |
Ratfor ファイル | .r | $(LINK.r) -o $@ $< $(LDLIBS) |
.r.o | $(COMPILE.r) $(OUTPUT_OPTION) $< | |
.r.a | $(COMPILE.r) -o $% $< | |
$(AR) $(ARFLAGS) $@ $% | ||
$(RM) $% | ||
シェルスクリプト | .sh | $(RM) $@ |
cat $< >$@ | ||
chmod +x $@ | ||
yacc ファイル (.yc の規則) | .y | $(YACC.y) $< |
$(LINK.c) -o $@ y.tab.c $(LDLIBS) | ||
$(RM) y.tab.c | ||
.y.c | $(YACC.y) $< | |
mv y.tab.c $@ | ||
.y.ln | $(YACC.y) $< | |
$(LINT.c) -o $@ -i y.tab.c | ||
$(RM) y.tab.c | ||
.y.o | $(YACC.y) $< | |
$(COMPILE.c) -o $@ y.tab.c | ||
$(RM) y.tab.c | ||
yacc ファイル (SVR4) | .Y.C | $(YACC) $(YFLAGS) $< |
mv y.tab.c $@ | ||
.Y.o | $(YACC) $(YFLAGS) $< | |
$(COMPILE.c) y.tab.c | ||
rm -f y.tab.c | ||
mv y.tab.o $@ |
表 4-10 定義済みの動的マクロ
用途 |
マクロ |
デフォルト |
---|---|---|
ライブラリアーカイブ | AR | ar |
ARFLAGS | rv | |
アセンブラのコマンド | AS | as |
ASFLAGS | ||
COMPILE.s | $(AS) $(ASFLAGS) | |
COMPILE.S | $(CC) $(ASFLAGS) $(CPPFLAGS) -target -c | |
C コンパイラのコマンド | CC | cc |
CFLAGS | ||
CPPFLAGS | ||
COMPILE.c | $(CC) $(CFLAGS) $(CPPFLAGS) -c | |
LINK.c | $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) | |
C++ コンパイラのコマンド1 | CCC | CC |
CCFLAGS | ||
COMPILE.cc | $(CCC) $(CCFLAGS) $(CPPFLAGS) -c | |
LINK.cc | $(CCC) $(CCFLAGS) $(CPPFLAGS) $(LDFLAGS) | |
C++ SVR4 コンパイラのコマンド (SVR4) | (C++C) | CC |
(C++FLAGS) | -O | |
COMPILE.C | $(C++C) $(C++FLAGS) $(CPPFLAGS) -c | |
LINK.C | $(C++C) $(C++FLAGS) $(CPPFLAGS) $(LDFLAGS) -target | |
FORTRAN 77 コンパイラのコマンド | FC in SVr4 | f77 |
FFLAGS | ||
COMPILE.f | $(FC) $(FFLAGS) -c | |
LINK.f | $(FC) $(FFLAGS) $(LDFLAGS) | |
COMPILE.F | $(FC) $(FFLAGS) $(CPPFLAGS) -c | |
LINK.F | $(FC) $(FFLAGS) $(CPPFLAGS) $(LDFLAGS) | |
リンカーのコマンド | LD | ld |
LDFLAGS | ||
lex のコマンド | LEX | lex |
LFLAGS | ||
LEX.l | $(LEX) $(LFLAGS) -t | |
lint のコマンド | LINT | lint |
LINTFLAGS | ||
LINT.c | $(LINT) $(LINTFLAGS) $(CPPFLAGS) | |
Modula 2 のコマンド | M2C | m2c |
M2FLAGS | ||
MODFLAGS | ||
DEFFLAGS | ||
COMPILE.def | $(M2C) $(M2FLAGS) $(DEFFLAGS) | |
COMPILE.mod | $(M2C) $(M2FLAGS) $(MODFLAGS) | |
NeWS | CPS | cps |
CPSFLAGS | ||
Pascal コンパイラのコマンド | PC | pc |
PFLAGS | ||
COMPILE.p | $(PC) $(PFLAGS) $(CPPFLAGS) -c | |
LINK.p | $(PC) $(PFLAGS) $(CPPFLAGS) $(LDFLAGS) | |
Ratfor のコンパイルコマンド | RFLAGS | |
COMPILE.r | $(FC) $(FFLAGS) $(RFLAGS) -c | |
LINK.r | $(FC) $(FFLAGS) $(RFLAGS) $(LDFLAGS) | |
rm のコマンド | RM | rm -f |
yacc のコマンド | YACC | yacc |
YFLAGS | ||
YACC.y | $(YACC) $(YFLAGS) | |
接尾辞のリスト | 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‾ |
SCCS get コマンド | .SCCS_GET | sccs $(SCCSFLAGS) get $(SCCSGETFLAGS) $@ -G$@ |
SCCSGETFLAGS | -s |
下位互換性を持たせるため、C++ のマクロには上記の代わりに使用できる形式があります。C++C は CCC で、C++FLAGS は CCFLAGS で、COMPILE.C は COMPILE.cc で、LINK.cc は LINK.C で、それぞれ代用できます。これらの代用の形式は、将来のリリースでは削除されます。