前述のように、プロジェクトを整理するには、プロジェクトを主な構成要素ごとにいくつかのディレクトリに分割するのが適しています。このようにして分割したプロジェクトは、通常は 1 つのファイルシステム上またはディレクトリ階層内で管理します。ヘッダーファイル、ライブラリ、プログラムはそれぞれ別のサブディレクトリに置きます。参照マニュアルなどのドキュメントも、別のサブディレクトリに置いて管理します。
次の図に示すように、プロジェクトが 1 つの実行可能プログラム、1 つのユーザー定義ライブラリ、ライブラリのルーチン用の 1 組のヘッダー、複数のマニュアルで構成されているものとします。
各サブディレクトリにあるメークファイルは、これまでの節で説明したものを使用できますが、プロジェクト全体を管理するためのメークファイルがさらに必要です。プロジェクトのルートディレクトリにあるメークファイルには、プロジェクトを 1 つの構成要素として一括管理するためのターゲットエントリを指定します。
プロジェクトが大きくなると、簡単に使用できる整合性のあるメークファイルが必要になります。マクロおよびターゲット名は、どのメークファイルでも意味が同じである必要があります。出力形式を決定する条件付きマクロ定義およびコンパイルオプションは、プロジェクト全体で一貫している必要があります。
可能であれば、テンプレートを使用してメークファイルを記述します。テンプレートを使用して、プロジェクトがどのように構築されるかを監視します。モジュール用のディレクトリを作成し、適切なメークファイルをそのディレクトリにコピーして、数行を編集するだけで、新しい種類のモジュールを追加することができます。また、ルートのメークファイルで構築する新しいモジュールを追加する必要があります。
デフォルトのメークファイルなどで使用されるマクロおよびターゲットの名前の付け方は、プロジェクト全体で統一する必要があります。ニーモニック名とは、ターゲットの機能やマクロの値を正確に覚えていなくても、その名前から機能または値の種類を判断することができるような名前です。ニーモニックは、メークファイルを解読する際にも便利です。
一貫したコンパイル環境を保ちながら、メークファイルを簡潔にする方法として、以下のように make を使用します。
include filename
この include 指令は、filename に指定した名前のメークファイルの内容を読み取ります。指定した名前のファイルがない場合は、make は /etc/default でその名前のファイルを検査します。
たとえば、以下のようにターゲットエントリをインクルードすると、各メークファイルごとに troff ソースを処理するパターンマッチングの規則を重複して記述する必要はありません。
SOURCES= doc.ms spec.ms ... clean: $(SOURCES) include ../pm.rules.mk
この例では、make は ../pm.rules.mk ファイルの内容を読み取ります。
# pm.rules.mk # # パターンマッチング規則用の "include" makefile # %.tr: %.ms troff -t -ms $< > $@ %.nr: %.ms nroff -ms $< > $@
外部でのテストまたは通常の使用を目的として、プログラムをリリースする際には、make を使用してプログラムをインストールできます。インストールを行うための新しいターゲットおよびマクロ定義は、以下のように簡単に追加できます。
DESTDIR= /proto/project/bin install: functions -mkdir $(DESTDIR) cp functions $(DESTDIR)
ライブラリまたはヘッダーをインストールする際にも、同様のターゲットを使用できます。