Makefileでは次のことは何をしますか?
rule: $(deps)
@:
Makeマニュアルでこれを見つけることができないようです。
「このコマンドを出力にエコーしない」ことを意味します。したがって、このルールは「シェルコマンド:
を実行し、出力をエコーしません」と言っています。
もちろん、シェルコマンド:
は何もしません。したがって、これは「何もせず、伝えない」と言っています。
なぜ?
ここでのコツは、2つの異なる構文のあいまいな組み合わせがあることです。 make(1)構文は、@で始まるアクションの使用であり、単にコマンドをエコーしないことです。だからのようなルール
always:
@echo this always happens
放出しません
echo this always happens
this always happens
これで、ルールのアクション部分は、:
を含むanyシェルコマンドになります。 Bashのヘルプは、これをどこでも説明しています。
$ help :
:: :
Null command.
No effect; the command does nothing.
Exit Status:
Always succeeds.
これを行う理由について知りたい人のために、Makeがターゲットに対して "Nothing to done"を出力しないように、何かが行われたように見せかけたい場合に役立ちます。
1つの例は、常に実行する偽のターゲットがあり、その中にコマンドに多数の条件がある場合です。これらの条件が間違っていて何も実行されない場合に備えて、少なくとも何かが必要です。
たとえば(Linuxのscripts/Makefile.cleanから):
__clean: $(subdir-ymn)
ifneq ($(strip $(__clean-files)),)
+$(call cmd,clean)
endif
ifneq ($(strip $(__clean-dirs)),)
+$(call cmd,cleandir)
endif
ifneq ($(strip $(clean-rule)),)
+$(clean-rule)
endif
@: