Що означає @: (двокрапка символу) у Makefile?


155

Що робить наступне в Makefile?

rule: $(deps)
    @:

Я не можу знайти це в посібнику з виготовлення.

Відповіді:


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
Це відмінне пояснення того, що це робить, але чи випадково ви знаєте, чому ви зробили це в makefile?
Чарльз Кіпакс

8
Не найтуманніший.
Чарлі Мартін

2
Це може бути корисно в файлах, що викликають багато зовнішніх програм, і де ви хочете багато використовувати ехо, щоб зробити його красивим, як цей
dwcoder

1
@ charles-keepax, якщо ви запитуєте конкретно посиланням на @:(не тільки @), то, крім відповіді @ guestolio, це також може бути залишком для розвитку. Це як написати функцію в Python, яка лише містить pass. Це може бути корисно для блокування коду для копіювання / вставки, але вони, як правило, не повинні існувати довго. Під час стирчування цього файлу все-таки
збиратимуться

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
    @:
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.