.GNU makeファイルのすべてのルールをPHONY?


16

私の解釈では、基本的にすべてのメイクルールの前に最初に置くべきだと間違っていますか?

.PHONY: all of my rules

all:
    echo "Executing all ..."

of:
    echo "Executing of ..."

my:
    echo "Executing my ..."

rules:
    echo "Executing rules ..."

この「式」に従わない場合はありますか?

http://www.gnu.org/software/make/manual/make.html#Phony-Targets

回答:


23

Clark GrubbのMakefileスタイルガイドは、次のことを推奨しています。

  • すべての偽のターゲットは、.PHONYの前提条件として宣言する必要があります。
  • すべての偽のターゲットを1か所にリストするのではなく、各偽のターゲットを.PHONYの前提条件としてターゲット宣言の直前に追加します。
  • ファイルターゲットは.PHONYの前提条件であってはなりません。
  • 偽のターゲットは、ファイルターゲットの前提条件ではありません。

たとえば、これは次のことを意味します。

.PHONY: all
all:
    echo "Executing all ..."

.PHONY: of
of:
    echo "Executing of ..."

.PHONY: my
my:
    echo "Executing my ..."

.PHONY: rules
rules:
    echo "Executing rules ..."

複数のPHONYターゲットが許可されています。このStack Overflowの質問も参照してください:「gnu makefileに複数の.PHONYターゲットを持つことは可能ですか?」

また、これは質問で直接言及されていませんがPHONY、プロジェクト内の実際の入力または中間ファイルと同じ名前のターゲットを持たないように注意する必要があります。たとえば、プロジェクトにrules(接尾辞なしで)という名前のソースコードファイルがあると仮定した場合、その文字列をPHONYターゲットに含めると、予期されるmake動作が中断される可能性があります。


1
スタイルガイドの優れたシェア。ありがとうございました。
タラバイト

2

私はそれに従うことをお勧めしますが、完全なルールのレシピが私のgmake(3.81)でも機能する場合でも、それを断片化して断片を配置します。

例えば:

#Makefile
all:
   @echo hello world
.PHONY: all

CMD:

$ touch all
$ make all    #this would be a no-op if all weren't a phoney target
  hello world 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.