web-dev-qa-db-ja.com

Makefile:すべてのターゲットを宣言するPHONY

多数のターゲットを持つ長い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として宣言する標準的な方法はありますか?

14
Adam Matan

本当に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のさまざまなフレーバーへの移植性は低くなります。
  • 誤動作しますif誰かがここのmake doc3.pdfのような特定の出力ファイルをmakeすることにしました。
  • [〜#〜]偽物[〜#〜]ターゲットの1つを別のターゲットに依存させることにした場合も誤動作します[〜#〜]偽物[〜#〜] 1つ。

したがって、すべての[〜#〜]偽物[〜#〜]ターゲットを1行で宣言するというアプローチを採用することをお勧めします。 Makefileが非常に大きい場合は、それを複数のファイルに分割してincludeを使用し、各ファイルに1つの.PHONY:行を含めることができます。

6
user2371524