make 改訂版(3章)

サフィックスルールとは

特定の拡張子を持つコンポーネントから、別の特定の拡張子を持つターゲットを作成するルール
サフィックスルールで使える拡張子は、.SUFFIXES行で定義する


基本的なサフィックスルールは、makeにあらかじめ定義されている。
makeにあらかじめ定義されているマクロやルールを表示するために、makeには-pというオプションがある。
make -p -f/dev/null 2> /dev/null とやると表示できる。

  • fオプションは読み込むMakefileを指定
  • pオプションは読み込んだMakefileから定義を表示
[kobakoba0723@fedora13intel64 ~]$ make -p -f/dev/null 2>/dev/null | grep SUFFIXES
SUFFIXES := .out .a .ln .o .c .cc .C .cpp .p .f .F .r .y .l .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el
.SUFFIXES: .out .a .ln .o .c .cc .C .cpp .p .f .F .r .y .l .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el


ここで変数としてのSUFFIXESは『makefileを読み込む前のサフィックスのデフォルトリスト』
 GNU make 日本語訳(Coop編) クイックリファレンス
.SUFFIXESというターゲット(?)を使って、このリストの内容を変更する
変数としてのSUFFIXESの定義に、":="が使われているが、
これは単純展開変数といって、変数が定義された時点で変数の値を決定するための定義方法。
別の方法に再帰展開変数(=で定義)があり、こちらは変数が使われる時になって値を決定する定義方法。
 GNU make 日本語訳(Coop編) 変数の二つの味


SUFFIXESルールを適用する順番は、.SUFFIXESの先頭から順に適用します。
.oファイルを生成する場合
あらかじめ定義された状態において適用可能なルールは、以下の11個

  • .F.o:
  • .p.o:
  • .cc.o:
  • .c.o:
  • .r.o:
  • .s.o:
  • .cpp.o:
  • .C.o:
  • .mod.o:
  • .S.o:
  • .f.o

.SUFFIXESの定義に従って、適用順に並び替えると、

  1. .c.o:
  2. .cc.o:
  3. .C.o:
  4. .cpp.o:
  5. .p.o:
  6. .f.o
  7. .F.o:
  8. .r.o:
  9. .s.o:
  10. .S.o:
  11. .mod.o:


以前、単一ファイルの場合Makefileも用意しないで、コンパイル可能だった理由がよくわからなかったが、
 引き続き「UNIXプログラミングの道具箱」(make)
あらかじめ定義されている以下のサフィックスルールに従ってコンパイルされているのが理由。

LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
.c:
	$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@

@^は、全コンポーネントをスペース区切りで並べたものを表すマクロ
 GNU make 日本語訳(Coop編) クイックリファレンス
そのため、make sample とやると、以下のような状態でコンパイルが実行される。

  • $^ に sample.c
  • $@ に sample
  • gcc sample.c -o sample