Функція файлу в makefile приймає аргументи з префіксом символом '@'


10

Цей витяг з коду - з розділу 8.6 керівництва по файлу GNU.

Що означає @ $ @. Для функції файлу arg у makefile? і чому такі команди оболонки, як rm, мають префікс символом "@"

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

Синтаксис функції файлу є

$(file op filename[,text])
make 

Відповіді:


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

ця відповідь не говорить, чому >$@.inвін використовується як режим файлів ... але він корисний по-своєму .. дякую cuonglm ...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.