私の説明が間違っている場合は、デフォルトですべてのルールを優先的に適用する必要があります。
.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
答え1
クラークグラブ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
複数の宛先が許可されます。このスタックオーバーフローの質問も参照してください。「Gnu makefileに複数の.PHONYターゲットを持つことはできますか?」
PHONY
また、これはあなたの質問に直接言及されていませんが、ターゲットがプロジェクトの実際の入力または中間ファイルと同じ名前を持たないように注意する必要があります。たとえば、プロジェクトがサフィックスなしでrules
名前付きソースコードファイルを想定している場合、ターゲットにその文字列を含めると、予想されるPHONY
動作が中断される可能性がありますmake
。
答え2
私はこれが良い習慣だと思いますが、それを分割し、ルールレシピ全体の後ろにセグメントを配置することもgmake(3.81)で動作します。
たとえば、
#Makefile
all:
@echo hello world
.PHONY: all
注文する:
$ touch all
$ make all #this would be a no-op if all weren't a phoney target
hello world