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

パターンマッチングの規則: 接尾辞の規則の代替

パターンマッチングの規則は、機能的には暗黙の規則と似ています。パターンマッチングの規則では、ターゲットと依存関係のファイルの関係を、接頭辞 (パス名を含む) と接尾辞のいずれかまたは両方を基準にして指定できるため、暗黙の規則よりも記述が簡単で強力です。パターンマッチングの規則は、次の形式で記述するターゲットエントリです。

tp%ts: dp%ds
     rule

ここで、tp および ts は、ターゲットの名前の接頭辞および接尾辞 (省略可能) です。dp および ds は、依存関係の名前の接頭辞および接尾辞 (省略可能) です。% は、両方に共通するベース名を示すワイルドカードです。


注 -

make は、接尾辞の規則の前にパターンマッチングの規則を調べます。このため、標準の暗黙の規則を無効にすることもできますが、通常は無効にしないでください。


ターゲットを構築する規則がない場合は、make はパターンマッチングの規則を検索してから、接尾辞の規則を調べます。使用可能であれば、パターンマッチングの規則が使用されます。

パターンマッチングの規則のターゲットエントリに規則が含まれていない場合は、make は、規則のない明示的なターゲットエントリを持つものとして、ターゲットファイルを処理します。したがって、make は接尾辞の規則を検索し、SCCS からターゲットファイルのバージョンを取り出し、空の規則を持つものとして最終的にターゲットを処理します (ターゲットは、その実行においては更新されている (最新である) とみなされます)。

troff ソースファイルを troff 出力ファイルにフォーマットするパターンマッチングの規則は、以下のとおりです。

%.tr: %.ms 
     troff -t -ms $< > $@

make のデフォルトの接尾辞の規則と定義済みマクロ

以下の表に、デフォルトのメークファイル (/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.orm -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 定義済みの動的マクロ

用途 

マクロ 

デフォルト 

ライブラリアーカイブ 

ARar
ARFLAGSrv

アセンブラのコマンド 

ASas
ASFLAGS
COMPILE.s$(AS) $(ASFLAGS)
COMPILE.S$(CC) $(ASFLAGS) $(CPPFLAGS) -target -c

C コンパイラのコマンド 

CCcc
CFLAGS
CPPFLAGS
COMPILE.c$(CC) $(CFLAGS) $(CPPFLAGS) -c
LINK.c $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)

C++ コンパイラのコマンド1

CCCCC
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 SVr4f77
FFLAGS
COMPILE.f$(FC) $(FFLAGS) -c
LINK.f$(FC) $(FFLAGS) $(LDFLAGS)
COMPILE.F$(FC) $(FFLAGS) $(CPPFLAGS) -c
LINK.F $(FC) $(FFLAGS) $(CPPFLAGS) $(LDFLAGS)

リンカーのコマンド 

LDld
LDFLAGS

lex のコマンド

LEXlex
LFLAGS
LEX.l $(LEX) $(LFLAGS) -t

lint のコマンド 

LINTlint
LINTFLAGS
LINT.c$(LINT) $(LINTFLAGS) $(CPPFLAGS)

Modula 2 のコマンド 

M2Cm2c
M2FLAGS
MODFLAGS
DEFFLAGS
COMPILE.def$(M2C) $(M2FLAGS) $(DEFFLAGS)
COMPILE.mod$(M2C) $(M2FLAGS) $(MODFLAGS)

NeWS 

CPScps
CPSFLAGS

Pascal コンパイラのコマンド 

PCpc
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 のコマンド 

RMrm -f
  

yacc のコマンド 

YACCyacc
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_GETsccs $(SCCSFLAGS) get $(SCCSGETFLAGS) $@ -G$@
SCCSGETFLAGS-s

  1. 下位互換性を持たせるため、C++ のマクロには上記の代わりに使用できる形式があります。C++CCCC で、C++FLAGSCCFLAGS で、COMPILE.CCOMPILE.cc で、LINK.ccLINK.C で、それぞれ代用できます。これらの代用の形式は、将来のリリースでは削除されます。