サーチ…


ファイル以外のターゲットに.PHONYを使用する

.PHONYを使用して、ファイルではないターゲットを指定します(例: cleanまたはmrproper

良い例え

.PHONY: clean
clean:
    rm *.o temp

悪い例

clean:
    rm *.o temp

良い例ではmakeことを知っているcleanので、それが最新であるかどう検索しませんし、レシピを実行しますが、ファイルではありません。

悪い例では、 makecleanという名前のファイルを探します。存在しないか最新でない場合はレシピを実行しますが、レシピが存在し、最新のレシピは実行されません。

'make'コマンドの再帰的呼び出しに.PHONYを使用する

makeを再帰的に使用するとは、makeをmakefile内のコマンドとして使用することです。このテクニックは、大きなプロジェクトにサブディレクトリが含まれており、それぞれにそれぞれのメークファイルがある場合に便利です。次の例は、.PHONYを再帰的なmakeで使用する利点を理解するのに役立ちます。

/main
     |_ Makefile
     |_ /foo
            |_ Makefile
            |_ ... // other files
     |_ /bar
            |_ Makefile
            |_ ... // other files
     |_ /koo
            |_ Makefile
            |_ ... // other files

サブディレクトリのmakefileをmainのmakefileから実行するには、メインのmakefileは以下に示すようにループします(この方法は他にもありますが、現在のトピックの範囲外です)

SUBDIRS = foo bar koo

subdirs:
        for dir in $(SUBDIRS); do \
          $(MAKE) -C $$dir; \
        done

しかし、この方法には落とし穴があります。

  1. sub-makeで検出されたエラーはこのルールでは無視されるため、障害が発生した場合でも残りのディレクトリを構築し続けます。
  2. Makeの実行能力複数のビルドターゲットの並列実行は、1つのルールしか使用されないので利用されません。

サブディレクトリを.PHONYターゲットとして宣言することで(そうする必要があるのは、サブディレクトリが常に存在するため、そうでなければビルドされません)、これらの問題を克服することができます。

SUBDIRS = foo bar koo

.PHONY: subdirs $(SUBDIRS)

subdirs: $(SUBDIRS)

$(SUBDIRS):
        $(MAKE) -C $@


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow