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