Что означает @: (в двоеточии символа) в Makefile? - PullRequest
132 голосов
/ 23 декабря 2011

Что делает следующее в Makefile?

rule: $(deps)
    @:

Я не могу найти это в руководстве по make.

Ответы [ 2 ]

171 голосов
/ 23 декабря 2011

Это означает, что «не выводите эту команду на выходе». Таким образом, это правило гласит: «выполните команду оболочки : и не отображайте вывод.

Конечно, команда оболочки : не работает, поэтому она говорит: «ничего не делай и не говори».

Почему?

Хитрость в том, что у вас есть неясная комбинация двух разных синтаксисов. Синтаксис make (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.
32 голосов
/ 29 мая 2013

Для тех, кому интересно, почему вы можете это сделать, полезно, если вы хотите притвориться, будто что-то было сделано, чтобы Make не выдавала «Ничего не будет сделано» для вашей цели.

Один из примеров - если у вас есть фальшивая цель, которую вы всегда выполняете, и в ней есть несколько условных выражений в команде. Вы хотите иметь хоть что-то, если эти условия окажутся ложными и ничего не будет сделано.

Например (из скриптов Linux / 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
    @:
...