あらゆるMakefileは次の行を含むべきだ。
SHELL = /bin/sh
SHELL
変数が環境から受け継がれるようなシステム上での問題を避けるた
めに。(これはGNU make
では問題には決してならない。)
異なるmake
プログラムは互換性のない接尾辞のリストと暗黙の規則を持
ち、これはときどき混乱やおかしな挙動を生み出す。だから特定のMakefileで必
要とする接尾辞だけを使用するのに、明示的に接尾辞のリストを設定するのは良
い考えだ。
.SUFFIXES: .SUFFIXES: .c .o
最初の行は接尾辞のリストを処分し、二番目はこのMakefileで暗黙の規則の対象 になるかもしれない接尾辞すべてを導入する。
.がコマンド実行のパスに入っていると仮定してはいけない。makeの間に あなたのパッケージの一部であるプログラムを走らせる必要があるとき、そのプ ログラムがmakeの一部として構築されるなら./を使い、もしファイルが ソース・コードの変更されない部分なら、$(srcdir)/を使うようにして ください。これらの接頭辞の一つを使わないと、現在の検索パスが使われる。
./(構築ディレクトリ)と$(srcdir)/(ソース・ディレ クトリ)の区別は、ユーザはconfigureに`--srcdir'オプションを 使って別のディレクトリで構築することができるので、重要である。次の書式の 規則は構築ディレクトリがソース・ディレクトリではないとき失敗する。 foo.manとsedscriptはソース・ディレクトリの中にあるからだ。
foo.1 : foo.man sedscript sed -e sedscript foo.man > foo.1
GNU make
を使うとき、ソースファイルを見付けるのに`VPATH'を頼
りにすることは、単一の依存関係ファイルがある場合には上手く行くだろう。
make
の自動変数`$<'は、ソースファイルがどこにあっても、それを
表すから。(make
のたくさんのバージョンは暗黙的規則でだけ`$<'
を設定する。)
foo.o : bar.c $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o
このようなMakefileのターゲットは代わりに次のように書かれるべきだ。
foo.o : bar.c $(CC) -I. -I$(srcdir) $(CFLAGS) -c $< -o $@
`VPATH'が正しく働くようにするために。ターゲットが複数の依存関係を持 つとき、明示的な`$(srcdir)'を使うことがその規則を上手く働かせる一番 簡単な方法だ。例えば、foo.1に対するターゲットは次のように書かれて るのが一番良い。
foo.1 : foo.man sedscript sed -e $(srcdir)/sedscript $(srcdir)/foo.man > $@
GNUの配布物は普通ソースファイルではない、いくつかのファイルを含む。—例 えば、InfoファイルやAutoconf、Automake、BisonやFlexからの出力だ。これら のファイルは通常ソース・ディレクトリに現れるので、それらは構築ディレクト リではなく、常にソース・ディレクトリに現れるべきだ。だからそれらを更新す るMakefileの規則はソース・ディレクトリに更新されたファイルを置くべきだ。
しかしながら、もしファイルが配布物に現れないなら、Makefileはソース・ディ レクトリにそれを置くべきではない。なぜなら、普通の環境でプログラムを構築 することで、どんな方法でもソース・ディレクトリを変更するべきではないから だ。
構築とインストールのターゲットを少なくとも(そしてそれらのサブターゲッ
ト全てが)並列make
で正しく働くように試みなさい。