Co oznacza @: (w dwukropku symbolu) w pliku Makefile?

155

Co następuje w pliku Makefile?

rule: $(deps)
    @:

Nie mogę znaleźć tego w instrukcji tworzenia.

cdwilson
źródło

Odpowiedzi:

206

Oznacza to „nie powtarzaj tego polecenia na wyjściu”. Więc ta reguła mówi: „wykonaj polecenie powłoki :i nie wyświetlaj wyników.

Oczywiście polecenie powłoki :nie działa, więc oznacza to „nic nie rób i nie mów”.

Czemu?

Sztuczka polega na tym, że masz niejasną kombinację dwóch różnych składni. Make (1) składnia jest wykorzystanie działania zaczynając @, który jest po prostu nie do echo polecenia. Więc taka reguła

always:
       @echo this always happens

nie wyemituje

   echo this always happens
   this always happens

Teraz częścią akcji reguły może być dowolne polecenie powłoki, w tym :. Pomoc Bash wyjaśnia to, jak również wszędzie:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.
Charlie Martin
źródło
21
Nie śmiej się z mojego pisania, kiedyś też będziesz stary.
Charlie Martin
4
To doskonałe wyjaśnienie tego, co to robi, ale czy przypadkiem wiesz, dlaczego miałbyś to zrobić w pliku makefile?
Charles Keepax
8
Nie najbardziej mglisty.
Charlie Martin
2
Może być przydatny w plikach makefile, które wywołują wiele programów zewnętrznych i gdzie chcesz często używać echa, aby wyglądało ładnie, jak ten
dwcoder.
1
@ charles-keepax, jeśli pytasz konkretnie w odniesieniu @:(nie tylko @), to oprócz odpowiedzi @ guestolio może to być również resztka po rozwoju. To jak pisanie funkcji w Pythonie, która zawiera tylko pliki pass. Może być przydatne do tworzenia bloków kodu do kopiowania / wklejania, ale generalnie nie powinny one istnieć długo. Podczas krojenia w ten sposób plik nadal się kompilował, przeszedł
lintowanie
40

Dla tych, którzy są ciekawi, dlaczego możesz to zrobić, przydaje się, jeśli chcesz udawać, że coś zostało zrobione, tak aby Make nie wyświetlał „Nic do zrobienia dla” twojego celu.

Jednym z przykładów jest sytuacja, gdy masz fałszywy cel, który zawsze wykonujesz, aw poleceniu znajduje się kilka warunków. Chcesz mieć przynajmniej coś na wypadek, gdyby te warunki okazały się fałszywe i nic nie zostało zrobione.

Na przykład (ze skryptów Linuksa / 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
źródło