Что означает @: (в двоеточии символа) в Makefile?

155

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

rule: $(deps)
    @:

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

cdwilson
источник

Ответы:

206

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

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

Зачем?

Хитрость в том, что у вас есть неясная комбинация двух разных синтаксисов. Макияж (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
Это отличное объяснение того, что это делает, но знаете ли вы случайно, почему вы делаете это в make-файле?
Чарльз Keepax
8
Не самый туманный.
Чарли Мартин
2
Это может быть полезно в make-файлах, которые вызывают много внешних программ, и где вы хотите много использовать echo, чтобы он выглядел красиво, как этот
dwcoder
1
@ charles-keepax, если вы спрашиваете конкретно в отношении @:(а не только @), то в дополнение к ответу @ guestolio это также может быть оставшаяся заглушка от разработки. Это похоже на написание в Python функции, которая содержит только pass. Это может быть полезно для создания заглушек блоков кода для копирования / вставки, но обычно они не должны существовать долго. При такой обработке файл все равно будет компилироваться, проходить линтинг и т. Д.
boweeb
40

Для тех, кто интересуется, почему вы можете сделать это, полезно, если вы хотите притвориться, будто что-то было сделано, так что 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
    @:
Guestolio
источник