多数のターゲットを持つ長いmakefile
について考えてみます。これらはすべて、 PHONY
(ターゲット名が既存のファイルを表していないことを意味します)です。
私は次のいずれかを行うことができます:
.PHONY: a
a:
do someting a
.PHONY: b
b:
do someting b
.PHONY: c
c:
do someting c
または:
.PHONY: a b c
a:
do someting a
b:
do someting b
c:
do someting c
最初のオプションは面倒で、2番目のオプションはエラーが発生しやすく、将来、ターゲットを追加してPHONY
として宣言するのを忘れた場合に発生します。
makefile
内のすべてのターゲットをPHONY
として宣言する標準的な方法はありますか?
本当にallターゲットが[〜#〜] phony [〜#〜]の場合、これは少し無意味です。 make
は "出力を更新するために必要なことを行う"を意味します。必要なことは何ですか?の答えが常に同じである場合、単純なスクリプトは同じ仕事をします。より少ないオーバーヘッドで。
そうは言っても、すべてのターゲットがコマンドラインで指定されることを意図しているである必要がある状況を想像することができます[〜#〜]偽物[〜#〜]-仮定しましょう次のようなドキュメントを作成します。
all: doc1.pdf doc2.pdf doc3.pdf doc4.pdf doc5.pdf
manuals: doc3.pdf doc4.pdf
faqs: doc1.pdf
designdocs: doc2.pdf
apidocs: doc5.pdf
developerdocs: doc2.pdf doc5.pdf
userdocs: doc1.pdf doc3.pdf doc4.pdf
%.pdf: %.md
$(somedocgenerator) -o $@ $<
次に、could次のようにします。
.PHONY: all $(MAKECMDGOALS)
これにより、コマンドラインで指定されたターゲットが動的に作成されます[〜#〜] phony [〜#〜]。 default targetをここに含める必要があることに注意してください。これは、make
と入力するだけで、明示的に指定せずに呼び出すことができるためです。
このアプローチには2つの欠点があるため、お勧めしません。
make
のさまざまなフレーバーへの移植性は低くなります。make doc3.pdf
のような特定の出力ファイルをmake
することにしました。したがって、すべての[〜#〜]偽物[〜#〜]ターゲットを1行で宣言するというアプローチを採用することをお勧めします。 Makefile
が非常に大きい場合は、それを複数のファイルに分割してinclude
を使用し、各ファイルに1つの.PHONY:
行を含めることができます。