Was bedeutet @: (am Doppelpunkt) in einem Makefile?

155

Was macht das Folgende in einem Makefile?

rule: $(deps)
    @:

Ich kann dies nicht im make-Handbuch finden.

cdwilson
quelle

Antworten:

206

Es bedeutet "Echo diesen Befehl nicht auf der Ausgabe." Diese Regel lautet also "Führen Sie den Shell-Befehl aus :und geben Sie die Ausgabe nicht wieder."

Natürlich ist der Shell-Befehl :ein No-Op, also heißt das: "Tu nichts und sag es nicht."

Warum?

Der Trick dabei ist, dass Sie eine obskure Kombination aus zwei verschiedenen Syntaxen haben. Die make (1) -Syntax ist die Verwendung einer Aktion, die mit @ beginnt und den Befehl einfach nicht wiedergibt. Also eine Regel wie

always:
       @echo this always happens

wird nicht emittieren

   echo this always happens
   this always happens

Der Aktionsteil einer Regel kann nun ein beliebiger Shell-Befehl sein, einschließlich :. Bash-Hilfe erklärt dies ebenso wie überall:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.
Charlie Martin
quelle
21
Mach dich nicht über meine Eingabe lustig, du wirst auch eines Tages alt sein.
Charlie Martin
4
Dies ist eine hervorragende Erklärung dafür, aber wissen Sie zufällig, warum Sie dies in einem Makefile tun würden?
Charles Keepax
8
Nicht der nebligste.
Charlie Martin
2
Es kann in Makefiles nützlich sein, die viele externe Programme aufrufen und in denen Sie viel Echo verwenden möchten, damit es gut aussieht, wie dieses
dwcoder
1
@ charles-keepax, wenn Sie speziell in Bezug auf fragen @:(nicht nur@ ) fragen, dann könnte es zusätzlich zu @ guestolios Antwort auch ein übrig gebliebener Entwicklungsstummel sein. Es ist wie das Schreiben einer Funktion in Python, die nur enthält pass. Es kann nützlich sein, um Codeblöcke zum Kopieren / Einfügen zu stubben, aber sie sollten im Allgemeinen nicht lange existieren. Wenn die Datei auf diese Weise stubbt, wird sie immer noch kompiliert,
fusselt
40

Für diejenigen, die neugierig sind, warum Sie dies tun könnten, ist es nützlich, wenn Sie so tun möchten, als wäre etwas getan worden, damit Make nicht "Nichts zu tun für" Ihr Ziel ausgibt.

Ein Beispiel ist, wenn Sie ein falsches Ziel haben, das Sie immer ausführen, und in dem Sie eine Reihe von Bedingungen im Befehl haben. Sie möchten zumindest etwas haben, falls diese Bedingungen falsch sind und nichts unternommen wird.

Zum Beispiel (aus Linux-Skripten / 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
    @:
Guestolio
quelle