Синтаксис Makefile $ (A, B, C)? - PullRequest
       1

Синтаксис Makefile $ (A, B, C)?

0 голосов
/ 05 августа 2011

Рассмотрим следующий код:

$ANIMAL = COW PIG CHICKEN VAMPIRE

all:
        @echo $(ANIMAL, F, >.txt)

Я пытался найти в GNU make manual раздел, в котором упоминается приведенный выше синтаксис, но я не смог найти ничего связанного с ним. Что он печатает и как структурирован синтаксис для функциональности?

Добавлено: когда строка начинается с "@ -", что это значит?

@-- $(GEN_ENV); ...

Ответы [ 3 ]

0 голосов
/ 27 августа 2011

Это называется "макро модификаторы".Это не функция GNU make.Взгляните на эту главу учебника по OPUS make .Общий синтаксис этих модификаторов:

$(name,modifier[,modifier]...) 

name is macro expanded, then each modifier is applied in succession to the elements of the expanded value. 

Взгляните тогда на список модификаторов , и станет ясно, что он формирует список имен файлов (усекает пути каждой переменной в ЖИВОТНЫЕ ) с добавлением .txt.Итак, в вашем случае это будет вывод:

COW.txt PIG.txt CHICKEN.txt VAMPIRE.txt

PS

Я просмотрел ссылку, упомянутую выше, и не думаю, что первая строка ($ ANIMAL =) верна, так как определение макросадолжен начинаться без $.

0 голосов
/ 27 августа 2011

Судя по вашим комментариям, вы на самом деле используете OpusMake, а не GNU make.Вы можете найти больше информации об этом на веб-сайте Opus Software, Inc. , а также в этом удобном справочном руководстве .Из этих источников вы можете видеть, что у вас есть пример макроса , использующего макро модификаторы в своем расширении.переменной FOO, в то время как $(FOO,mod1[,mod2[,...]]]) расширяется до значения FOO, измененного в соответствии с указанными вами модификаторами.Обратите внимание, что вы можете связать воедино любое количество модификаторов, и они будут применяться в порядке слева направо.

Существует множество возможных модификаторов, но в вашем примере специально используются два:

  • Модификатор F, что означает «использовать только конечный компонент пути каждого имени пути в значении переменной»
  • Модификатор >str, что означает «добавлять текст str к каждому пробелу»слово в значении ".

Вот краткий пример:

FOO=abc/def ghi/jkl
BAR=$(FOO,F)
BAZ=$(FOO,>.txt)
BOO=$(FOO,F,>.txt)
  • BAR будет иметь значение def jkl (т. Е. Только часть имени файла каждого пути).
  • BAZ будет иметь значение abc/def.txt ghi/jkl.txt (т. Е. Добавлять .txt к каждому разделенному пробелами слову в значении)
  • BOO будет иметь значение def.txt jkl.txt (т.е. первоевзять только часть имени файла каждого пути, а затем добавить .txt к каждому)
0 голосов
/ 26 августа 2011

Чтобы ответить на ваше дополнение: в обычных файлах Makefile (читай: POSIX, GNU, ...)

  • ведущий '@' подавляет эхо команды.
  • ведущий '-' говорит, что нужно игнорировать ненулевой статус выхода
  • оба могут быть объединены, и повторения в порядке, поэтому @---@@@-@---echo foo совпадает с @-echo foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...