web-dev-qa-db-ja.com

Makefileで@:(記号のコロン)はどういう意味ですか?

Makefileでは次のことは何をしますか?

rule: $(deps)
    @:

Makeマニュアルでこれを見つけることができないようです。

135
cdwilson

「このコマンドを出力にエコーしない」ことを意味します。したがって、このルールは「シェルコマンド:を実行し、出力をエコーし​​ません」と言っています。

もちろん、シェルコマンド:は何もしません。したがって、これは「何もせず、伝えない」と言っています。

なぜ?

ここでのコツは、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.
177
Charlie Martin

これを行う理由について知りたい人のために、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
    @:
32
Guestolio