makefile                
            .PONYターゲット
        
        
            
    サーチ…
ファイル以外のターゲットに.PHONYを使用する
 .PHONYを使用して、ファイルではないターゲットを指定します(例: cleanまたはmrproper 。 
良い例え
.PHONY: clean
clean:
    rm *.o temp
悪い例
clean:
    rm *.o temp
良い例ではmakeことを知っているcleanので、それが最新であるかどう検索しませんし、レシピを実行しますが、ファイルではありません。 
悪い例では、 makeはcleanという名前のファイルを探します。存在しないか最新でない場合はレシピを実行しますが、レシピが存在し、最新のレシピは実行されません。 
'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
しかし、この方法には落とし穴があります。
- sub-makeで検出されたエラーはこのルールでは無視されるため、障害が発生した場合でも残りのディレクトリを構築し続けます。
- 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