Co oznacza dwukropek @: (At) w pliku Makefile?

Co następuje w pliku Makefile?

rule: $(deps)
    @:
Nie mogę znaleźć tego w instrukcji make.
Author: cdwilson, 2011-12-23

2 answers

Oznacza "nie echo tej komendy na wyjściu."Więc ta reguła mówi" wykonaj polecenie powłoki : i nie echo wyjścia.

Oczywiście Komenda powłoki : jest no-op, więc to mówi: "nic nie rób i nie mów."

dlaczego?

Sztuczka polega na tym, że masz niejasną kombinację dwóch różnych składni. Składnia make (1) jest użyciem akcji zaczynającej się od@, która po prostu nie jest echo polecenia. Więc zasada jak

always:
       @echo this always happens

Nie emituje

   echo this always happens
   this always happens

Teraz częścią akcji reguły może być dowolne polecenie powłoki, w tym :. Bash help wyjaśnia to tak samo jak gdziekolwiek:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.
 144
Author: Charlie Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-22 23:50:33

Dla tych, którzy są ciekawi, dlaczego możesz to zrobić, jest to przydatne, jeśli chcesz udawać, że coś zostało zrobione, tak, że Make nie wyświetla "nic do zrobienia dla" twój cel.

Jednym z przykładów jest to, że masz fałszywy cel, który zawsze wykonujesz, a w nim masz kilka warunków w poleceniu. Chcesz mieć przynajmniej coś w razie gdyby te warunki okazały się nieprawdziwe i nic nie zostanie zrobione.

Na przykład (ze skryptów Linuksa / Makefile."czysty"): {]}

__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
    @:
 31
Author: Guestolio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-29 16:04:58