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

make を使用してプログラムをコンパイルする

前述の例では、明示的なターゲットのエントリと暗黙の規則を使用して簡単な 1 つのソースファイルから C プログラムをコンパイルする方法を説明しました。ただし、ほとんどの C プログラムは、複数のソースファイルからコンパイルされます。また、多くのプログラムでは、標準のシステムライブラリやユーザー定義のライブラリのルーチンがインクルードされています。

cc コマンドを 1 回実行して 1 つのプログラムを再コンパイルおよびリンクする方が簡単な場合がありますが、通常は、複数のソースファイルからプログラムを何回かに分けて段階的にコンパイルする方が便利です。各ソースファイルを別々のオブジェクト (.o) ファイルにコンパイルしてから、それらのオブジェクトファイルをリンクして実行可能ファイル (a.out) を作成します。この方法では、より多くのディスク容量が必要ですが、後で (繰り返して) 再コンパイルを行う際に、ソースが変更されたオブジェクトファイルだけに対してコンパイルを実行すればよいため、コンパイルの時間を節約することができます。

簡単なメークファイルの例

単純ですが実用的なメークファイルの例を以下に示します。

表 4-4 C ソースのコンパイル用のメークファイル (すべて明示的)
# 2 つの C ソースファイルから 1 つのプログラムを
# コンパイルするメークファイル

.KEEP_STATE

functions: main.o data.o 
         cc -O -o functions main.o data.o 
main.o: main.c 
        	cc -O -c main.c 
data.o: data.c 
         cc -O -c data.c 
clean: 
        	rm functions main.o data.o

この例では、makemain.o および data.o というオブジェクトファイルと、functions という実行可能ファイルを生成します。

$ make 
cc -o functions main.o data.o 
cc -O -c main.c 
cc -O -c data.c 

make の定義済みマクロを使用する

次の例は、前述の例と機能は同一ですが、コンパイルコマンドの代わりに make の定義済みマクロを使用しています。定義済みマクロを使用すると、コンパイル環境が変更されたときに、メークファイルを編集する必要がありません。また、コマンド行からコンパイラのオプションを指定するための CFLAGS マクロ (およびその他の FLAGS マクロ) を使用できます。定義済みマクロは、make の暗黙の規則でも頻繁に使用されます。後述のメークファイルで使用されている定義済みマクロを次に示します。これらの定義済みマクロ [このバージョンの make では定義済みマクロが、旧バージョンよりも頻繁に使用されています。ここで示す定義済みマクロの一部は、旧バージョンでは使用できません。] は、C プログラムのコンパイル全般で便利です。

COMPILE.c

cc コマンド行。以下のように CCCFLAGSCPPFLAGS-c オプションで構成されます。

COMPILE.c=$(CC) $(CFLAGS) $(CPPFLAGS) -c

マクロの名前の COMPILE という部分は、マクロがコンパイルの (オブジェクト、つまり .o ファイルを作成する) コマンド行を表すマクロであることを示しています。.c という接尾辞は、コマンド行が .c (C ソース) ファイルに適用されることを示すニーモニックです。


注 -

名前が FLAGS という文字列で終わるマクロは、関連するコンパイラコマンドのマクロにオプションを引き渡します。これらのマクロは、整合性と移植性を保つために使用します。また、メークファイル中にこれらのマクロに適したデフォルト値を記述しておくと便利です。すべての定義済みマクロのリストを、表 4-10 に示しています。


LINK.c

COMPILE.c などのオブジェクトファイルをリンクするための基本的な cc コマンド行です。-c オプションは使用せず、LDFLAGS マクロへの参照を使用します。

LINK.c=$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)
CC

値は cc です (この値は、別の C コンパイラのパス名に再定義できます)。

CFLAGS

cc コマンドのオプションです。デフォルトでは空です。

CPPFLAGS

cpp のオプションです。デフォルトでは空です。

LDFLAGS

リンカー ld のオプションです。デフォルトでは空です。

表 4-5 定義済みマクロを使用して C ソースをコンパイルするメークファイル
# 2 つの C ソースをコンパイルするメークファイル
CFLAGS= -O 
.KEEP_STATE:

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

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

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 
$

明示的なターゲットのエントリと暗黙の規則の使用について

複数の依存ファイルからターゲットを構築する際には、構築のための規則が含まれている明示的なターゲットを make で指定する必要があります。1 つの依存ファイルからターゲットを構築する際には、多くの場合は暗黙の規則を使用すると便利です。

前述の例で示すように、make は簡単に 1 つのソースファイルを対応するオブジェクトファイルまたは実行可能ファイルにコンパイルします。ただし、複数のオブジェクトファイルをリンクして実行可能ファイルを作成するための情報は make には組み込まれていません。また、make は依存関係の検査で検出したオブジェクトファイルだけをコンパイルします。make は、開始点、つまりリスト内の各オブジェクトファイル (最終的には各ソースファイル) が依存するターゲットを必要とします。

したがって、複数の依存ファイルからターゲットを構築するには、照合順と、ターゲットの依存ファイルを示す依存関係リストを提供する明示的な規則が必要です。各依存ファイルが 1 つのソースから構築される場合は、暗黙の規則を使用できます。

暗黙の規則と動的なマクロ

make は、複数のマクロをターゲット単位で動的に管理します。動的なマクロは、特に暗黙の規則の定義において頻繁に使用されます。マクロの意味を理解することは重要です。


注 -

動的なマクロは、メークファイルで明示的に定義されていないため、$ 記号を接頭辞として追加して (つまり、マクロ参照であることを示して) 記述します。


動的なマクロは、以下のとおりです。

$@

現在のターゲットの名前です。

$?

ターゲットよりも新しい依存関係のリストです。

$<

make が暗黙の規則を使用するときの依存ファイル名を示します。

$*

現在のターゲットのベース名 (接尾辞を除いたターゲット名) です。

$%

処理されるライブラリメンバーの名前を示します。詳細は、「オブジェクトライブラリの構築」を参照してください。

暗黙の規則は、ターゲット名または依存ファイル名を規則内のコマンド行に指定するために、これらの動的なマクロを使用します。以下の .c.o の規則を例として示します。

.c.o:
         $(COMPILE.c) $< $(OUTPUT_OPTION)

$< は、現在のターゲットの依存ファイル (この場合は .c ファイル) の名前に置換されます。


注 -

OUTPUT_OPTION というマクロは、デフォルトでは値が空です。このマクロは、CFLAGS と同様の機能を持っていますが、引数を -o コンパイラオプションに渡してコンパイラの出力先ファイル名を指定するための独立したマクロとして提供されています。


この .c の規則では、$@ は現在のターゲット名に置換されます。

.c:
         $(LINK.c) $< -o $@

$< および $* のいずれのマクロも、接尾辞のリストでの順序に応じて値が異なるため、明示的なターゲットのエントリでこれらのマクロを使用すると予期しない結果になる場合があります。関連するファイル名からファイル名を正確に取得する方法については、「マクロ参照での接尾辞の置換」を参照してください。

動的なマクロの修飾子

F および D を参照に含めることによって動的なマクロを修飾できます。処理されるターゲットがパス名で指定されている場合は、$(@F) はファイル名部分、$(@D) はディレクトリ部分をそれぞれ示します。ターゲット名に / という文字が含まれていない場合は、$(@D) にドット (.) が値として割り当てられます。たとえば、/tmp/test という名前のターゲットでは、$(@D) の値は /tmp$(@F) の値は test になります。

動的なマクロと依存関係リスト : 遅延マクロ参照

動的なマクロは、すべてのどのようなターゲットを処理する際にも割り当てられます。マクロは、ターゲットの規則ではそのまま、依存関係リストでは参照の先頭に $ を追加して使用できます。$$ で始まる参照を、マクロへの遅延参照と呼びます。以下に例を示します。

x.o y.o z.o: $$@.BAK 
         cp $@.BAK $@

このエントリは、x.o.BAKy.o.BAKz.o.BAK からそれぞれ x.oy.oz.o を取得するために使用できます。

依存関係リストの読み取り

遅延マクロ参照を使用できるのは、make が、メークファイル全体を最初に読み込む際と、ターゲットの依存関係を処理する際の合計 2 回依存関係リストを読み込むためです。make は、リストを読み込むたびにマクロ展開を実行します。動的なマクロは、マクロへの参照が 2 回目の読み取りまで遅延される場合を除き、最初の読み取りではまだ定義されていないため、空の文字列に展開されます。

$$ という文字列は、定義済みマクロの '$' への参照です。このマクロは値が '$' になっています。make が最初の読み取りでこのマクロを展開する際には、$$@$@ に展開されます。依存関係の検査では、その $@ というマクロ参照に動的に値が割り当てられるときに、make は参照をその値に展開します。

make は、最初の読み取りではターゲットのターゲット名部分だけを評価します。ターゲット名として遅延マクロ参照を使用すると、正しい結果が得られません。

NONE= none 
all: $(NONE) 

$$(NONE): 
         @: this target's name isn't `none'

このメークファイルは、以下のような結果になります。

$ make
make: Fatal error: Don't know how to make target `none'

規則の評価

make は、規則の実行時にそのコマンドの適用ごとに 1 回だけ、ターゲットエントリの規則部分を評価します。この場合も、make への遅延マクロ参照を使用すると誤った結果になります。

接尾辞規則の橋渡し

接尾辞の規則では、複数の規則の関係から自動的にそれらの中間の規則を生成するということはありません。たとえば、接尾辞が .X というファイルから接尾辞が .Y というファイルを構築する接尾辞の規則と、接尾辞が .Y というファイルから接尾辞が .Z というファイルを構築する規則がある場合に、make.X ファイルから .Z ファイルを作成するという規則を、上記 2 つの規則から生成するということは行いません。中間の処理をターゲットとして指定する必要があります。中間の処理のエントリには空の規則を使用できます。

trans.Z: 
trans.Y:

この例では、trans.Y が存在していれば trans.Z はそのファイルから構築されます。trans.Y がターゲットエントリとして記述されていない場合は、使用する依存ファイルがないために make が "don't know how to build" というエラーを表示して失敗する場合があります。trans.Y がターゲットエントリとして記述されている場合は、trans.Y が最新でないまたは存在しないときに、maketrans.Y を構築します。メークファイルで規則が指定されていないため、make は適切な暗黙の規則を使用します。この場合は .X.Y の規則が使用されます。trans.X が存在する (または SCCS から取り出すことができる) 場合に、maketrans.Y および trans.Z の両方を必要に応じて再構築します。

接尾辞の規則を追加する

make には多数の便利な接尾辞の規則が提供されていますが、ユーザー定義の規則を追加することもできます。ただし、暗黙の規則を追加する場合は、パターンマッチングの規則が適しています (「パターンマッチングの規則: 接尾辞の規則の代替」を参照してください)。この節では、暗黙の規則をメークファイルに追加する従来の方法を説明しています。旧バージョンの make と互換性がある暗黙の規則を記述する必要がない場合をは、この節をとばして次の節に進んでも構いません。

接尾辞の規則は、2 段階の手順で行います。まず、ターゲットと依存関係の両方のファイルの接尾辞を、.SUFFIXES という特殊ターゲットの依存関係として指定し、接尾辞のリストに追加します。依存関係リストには指定した内容が蓄積されていくため、以下のようにこのターゲットのエントリを追加すると、リストに接尾辞が追加されます。

.SUFFIXES:  .ms .tr

次に、接尾辞の規則を指定するターゲットエントリを追加します。

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

これらのエントリを記述したメークファイルを使用して、ms というマクロ (.ms ファイル) が含まれている文書ソースファイルを troff 出力ファイル (.tr ファイル) にフォーマットできます。

$ make doc.tr 
troff -t -ms doc.ms > doc.tr

接尾辞リストのエントリは、SUFFIXES マクロに指定されています。接尾辞をリストの最初に挿入するには、まず依存関係のない .SUFFIXES ターゲットエントリを指定して、その値を消去します。依存関係リストには蓄積されていきますが、この場合は例外的に値が上書きされます。以下のように依存関係および規則のないターゲットエントリを指定することによって、既存の定義を消去することができます。

.SUFFIXES

次に、以下のようにもう 1 つ別のエントリに新しい接尾辞、その後に SUFFIXES マクロへの参照を続けて記述して、接尾辞を追加することができます。

.SUFFIXES:
.SUFFIXES: .ms .tr $(SUFFIXES)

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

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

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 で、それぞれ代用できます。これらの代用の形式は、将来のリリースでは削除されます。