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