このターゲットには依存関係がないため、../lib/libpkg.a という名前のファイルがないときにだけこのターゲットが実行されます。ファイルが .PRECIOUS により保護されたライブラリアーカイブである場合は、../lib/libpkg.a ファイルがないということはほとんどありません。make はそのファイルの依存関係を認識する必要はないため、認識しません。ファイルを構築するかどうか、およびその構築方法は、入れ子にした呼び出しによって決定されます。
つまり、ファイルシステム内にファイルがあっても、そのファイルが最新でない場合もあります。したがって、ファイルがあるかどうかに関わらず、そのファイルを規則が空白の (および既存のファイルがない) 他のターゲットに依存させることによって、入れ子にした make コマンドを強制的に実行する必要があります。
表 4-15 入れ子にした make コマンド用のターゲットエントリ
# 入れ子にした make コマンド用 # ターゲットエントリ ../lib/libpkg.a: FORCE cd $(@D); $(MAKE) $(@F) FORCE: |
この方法により、make は、正しいディレクトリ ../lib に変更し、そのディレクトリにあるメークファイルに記述された命令に従って、必要であれば libpkg.a を構築します。入れ子にした make の実行結果は次のようになります。
$ make ../lib/libpkg.a cd ../lib; make libpkg.a make libpkg.a `libpkg.a' is up to date.
以下のメークファイルは、入れ子にした make コマンドを使用して、プログラムが依存するユーザー定義のライブラリを処理します。
表 4-16 ユーザー定義のライブラリを使用した C プログラム用のメークファイル
../lib/libpkg.a が最新である場合は、このメークファイルを使用する make の実行結果は以下のようになります。
$ make cc -O -c main.c cc -O -c data.c cd ../lib; make libpkg.a `libpkg.a' is up to date. cc -O -o functions main.o data.o ../lib/libpkg.a -lcurses -l termlib