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


155

Makefileで以下は何をしますか?

rule: $(deps)
    @:

makeのマニュアルではこれが見つかりません。

回答:


206

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

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

どうして?

ここでの秘訣は、2つの異なる構文のあいまいな組み合わせがあることです。メイク(1)構文は、コマンドをエコーするだけではなく、@から始まるアクションの使用です。のようなルール

always:
       @echo this always happens

放出しません

   echo this always happens
   this always happens

現在、ルールのアクション部分は、を含む任意のシェルコマンドにすることができます:。Bashのヘルプはこれをどこでも説明しています:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

21
私のタイピングをからかわないでください、あなたもいつかは年をとるでしょう。
チャーリーマーティン

4
これは、これが何をするかについての優れた説明ですが、Makefileでこれを行う理由を偶然知っていますか?
Charles Keepax 2012年

8
曇りではありません。
チャーリーマーティン

2
これは、多くの外部プログラムを呼び出すメイクファイルや、この
dwcoder

1
@ charles-keepax @:(だけでなく@)に関して具体的に質問している場合は、@ guestolioの回答に加えて、開発の残りのスタブである可能性もあります。Pythonでだけを含む関数を書くようなものpassです。コピー/貼り付けのためにコードのブロックをスタブするのに役立ちますが、それらは一般的に長く存在すべきではありません。この方法で
スタブを

40

なぜこれを行うのかについて知りたい場合は、何かが行われたかのように見せかけ、Makeがターゲットに対して「実行する必要のないこと」を出力しないようにする場合に便利です。

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
    @:
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.