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

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

rule: $(deps)
    @:

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

Ответ 1

Это означает, что "не отсылайте эту команду на выходе". Итак, это правило говорит: "Запустите команду оболочки : и не эхо-вывод.

Конечно, команда оболочки : - это не-op, поэтому это говорит "ничего не делать и не рассказывать".

Почему?

Трюк здесь в том, что у вас есть неясная комбинация двух разных синтаксисов. Синтаксис make (1) - это использование действия, начинающегося с @, что просто не означает повторение команды. Итак, правило вроде

always:
       @echo this always happens

не будет выделять

   echo this always happens
   this always happens

Теперь частью действия правила может быть любая команда оболочки, включая :. Bash help объясняет это, как и везде:

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

Ответ 2

Для тех, кто интересуется, почему вы можете это сделать, полезно, если вы хотите сделать вид, что что-то было сделано, чтобы Make не выводил "Nothing to be done for" вашей цели.

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

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