Файловая функция в make-файле принимает аргументы с префиксом «@»

10

Этот фрагмент кода взят из главы 8.6 руководства по сборке GNU.

Что означает @ $ @. Для файловой функции arg в make-файле? и почему команды оболочки, такие как rm, начинаются с символа '@'

program: $(OBJECTS)
     $(file >$@.in,$^)
     $(CMD) $(CMDFLAGS) @$@.in
     @rm $@.in

Синтаксис файловой функции

$(file op filename[,text])

источник

Ответы:

9

Есть три несвязанных использования @здесь.

В $@, символ @- это имя автоматической переменной, которая может использоваться в правиле. Значение этой переменной является целью, которую создает правило.

Когда @используется в самом начале строки рецепта (команды), сразу после символа табуляции, это приводит к тому, что команда не будет напечатана, когда она должна быть выполнена.

Персонаж в @другом месте не особенный.

Таким образом, в вашем примере, чтобы построить program:

  1. fileФункция вызывается. Он записывает зависимости цели ( $^автоматическая переменная) в файл program.in.
  2. Независимо от того, какая команда хранится в переменной CMD, выполняется с параметрами, сохраненными в переменной CMDFLAGS, плюс дополнительный параметр @program.in. Что это делает, зависит от того, что CMDесть.

  3. Команда rm program.inвыполняется без предварительной печати.

Несколько команд обрабатывают параметр, начиная с @обозначения файла, из которого можно прочитать дополнительные параметры. Это соглашение DOS, которое появилось, потому что DOS имел строгое ограничение на длину командной строки и не имел возможности интерполировать вывод команды в командную строку. Это редкость в мире Unix, поскольку Unix не имеет этих ограничений. Таким образом, эффект рецепта, вероятно, такой же, как

$(CMD) $(CMDFLAGS) $(OBJECTS)
Жиль "ТАК - перестань быть злым"
источник
2

@ префикс в строке подавляет отображение строки.

По умолчанию makeпечатает каждую строку Makefileперед выполнением. Когда строки начинаются с @, эти строки не будут напечатаны.

Без @:

$ cat > Makefile
hello:                                                                          
    echo hello world
$ make hello
echo hello world
hello world

С @:

$ cat > Makefile
hello:                                                                          
    @echo hello world
$ make hello
hello world

Обратите внимание, что только @в начале строки вызывают подавление эха . >$@.inили @$@.inпросто обычные строки, и $@в нем будут расширены:

$ cat hello
hello:
    @echo @$@.in
$make hello
@hello.in
cuonglm
источник
этот ответ не говорит, почему >$@.inиспользуется как файловый режим ... но он полезен по-своему ... спасибо cuonglm ...