GNU make の記事 Rules of Makefiles の翻訳です。
皮肉のようなタイトル(訳注:makefile の(文法上の)ルールとかけている)ですが、この記事では makefile を作るときに常に留意すべき非常に重要な規則を挙げています。これらのルールに従えば、あなたの makefile は簡潔かつ美しいものになるでしょう。さらに、単に makefile を保守・変更するだけでなく、あなたの人生をもっと楽しいものにします。
1. GNU make を使え
ポータブルな makefile を作ることに苦悩するのをやめて、ポータブルな make
を使いましょう。
2. すべての .PHONY
でないルールは、そのターゲット名どおりのファイルを更新しなければならない
すべてのコマンドスクリプトは ../$@
や $(notdir $@)
1 ではなく、$@
を触るようにしなければなりません。あなたと GNU make の約束です。
3. ターゲットがカレントディレクトリにビルドされれば、人生はシンプル
ソースディレクトリを基準にオブジェクトの位置を指定するのではなく、VPATH
を使ってオブジェクトディレクトリを基準にソースの位置を指定します(訳注:英文)。
4. 最小繰り返しの原則に従え
一つのファイル名を何度も書かないようにしてください。変数、パターンルール、自動変数、make
の組み込み関数を活用しましょう。
5. すべてのTABで始まる行(ただし前行の続きでない)はコマンドの一部であり、逆もまた真なり
TAB で始まらない行は、絶対にコマンドの一部ではありません。これは常に make
の文法で解釈されます。
TAB で始まる行は、常にコマンドの一部です。これは常に make
の文法で解釈されることはありません。
厳密にはこれは常に真ではありませんが、あなたは常に真であると考えるのが最善です。
なお、前行の続きの行は、最初の文字にかかわらず、常に前の行と同じタイプとなります。
6. ディレクトリを通常の依存対象に使わない
ディレクトリをターゲットの依存対象にするのが正しいという状況はほぼ存在しません。GNU make はディレクトリを他のファイルと同じように扱い、ディレクトリの更新日時が変更されていればターゲットをビルドします。しかしながら、ディレクトリの更新日時は、その中のファイルが追加・更新・削除されたときにも変更されます……。これはほとんどの場合、あなたの望む動作ではありません。
ただし、ディレクトリを順序限定依存先(訳注:英文)とすることは有用です。
以上です……今のところは。私がこの件について言いたいことはこれだけではありませんが、基本的かつ簡潔な規則の形式で表現できる点を考えることは簡単じゃありません。
ご提案があればどうぞ教えてください。
-
訳注:
$(notdir ...)
関数は、ファイルパスからディレクトリ部分を除外する関数 ↩