Есть три несвязанных использования @
здесь.
В $@
, символ @
- это имя автоматической переменной, которая может использоваться в правиле. Значение этой переменной является целью, которую создает правило.
Когда @
используется в самом начале строки рецепта (команды), сразу после символа табуляции, это приводит к тому, что команда не будет напечатана, когда она должна быть выполнена.
Персонаж в @
другом месте не особенный.
Таким образом, в вашем примере, чтобы построить program
:
file
Функция вызывается. Он записывает зависимости цели ( $^
автоматическая переменная) в файл program.in
.
Независимо от того, какая команда хранится в переменной CMD
, выполняется с параметрами, сохраненными в переменной CMDFLAGS
, плюс дополнительный параметр @program.in
. Что это делает, зависит от того, что CMD
есть.
Команда rm program.in
выполняется без предварительной печати.
Несколько команд обрабатывают параметр, начиная с @
обозначения файла, из которого можно прочитать дополнительные параметры. Это соглашение DOS, которое появилось, потому что DOS имел строгое ограничение на длину командной строки и не имел возможности интерполировать вывод команды в командную строку. Это редкость в мире Unix, поскольку Unix не имеет этих ограничений. Таким образом, эффект рецепта, вероятно, такой же, как
$(CMD) $(CMDFLAGS) $(OBJECTS)
>$@.in
используется как файловый режим ... но он полезен по-своему ... спасибо cuonglm ...