Поиск…


Ссылка на переменную

Чтобы использовать значение, хранящееся в переменной, используйте знак доллара, за которым следует имя переменной, заключенное в круглые скобки или фигурные скобки.

x = hello
y = $(x)
# y now contains the value "hello"
y = ${x}
# parentheses and curly braces are treated exactly the same

Если имя переменной имеет только один символ, скобки / фигурные скобки могут быть опущены (например, $x ). Эта практика используется для автоматических переменных (см. Ниже), но не рекомендуется для переменных общего назначения.

Просто расширенные переменные

Просто расширенные переменные ведут себя как переменные от традиционных языков программирования. Выражение в правой части оценивается, и результат сохраняется в переменной. Если правая часть содержит ссылку на переменную, эта переменная расширяется до назначения.

x := hello
y := $(x)
# Both $(x) and $(y) will now yield "hello"
x := world
# $(x) will now yield "world", and $(y) will yield "hello"

Альтернативная форма заключается в использовании назначения с двойной колонкой:

x ::= hello

Однократное и двойное назначение столбцов эквивалентны. В стандарте POSIX указывается только форма ::= , поэтому реализации со строгим соблюдением стандартов могут не поддерживать версию с одним двоеточием.

Рекурсивно-расширенные переменные

При определении рекурсивно расширенной переменной содержимое правой части сохраняется как-есть. Если присутствует ссылка на переменную, сама ссылка сохраняется (а не значение переменной). Сделайте ожидания, чтобы расширить ссылки на переменные до тех пор, пока фактически не будет использована переменная.

x = hello
y = $(x)
# Both $(x) and $(y) will now yield "hello"
x = world
# Both $(x) and $(y) will now yield "world"

В этом примере определение y является рекурсивным. Ссылка на $(x) не расширяется до тех пор, пока $(y) будет расширен. Это означает, что всякий раз, когда значение x изменяется, значение y также изменится.

Рекурсивно-расширенные переменные являются мощным, но легко понятным инструментом. Они могут использоваться для создания конструкций, которые напоминают шаблоны или функции, или даже для автоматического создания частей файла makefile. Они также могут быть источником труднодоступных проблем. Будьте осторожны при использовании только рекурсивно расширенных переменных.

Автоматические переменные

В контексте отдельного правила Make автоматически определяет ряд специальных переменных. Эти переменные могут иметь другое значение для каждого правила в make-файле и предназначены для упрощения написания правил. Эти переменные могут использоваться только в части рецепта правила.

переменная Описание
$@ Имя файла цели правила
$% Имя целевого участника, если целью этого правила является архив
$< Имя файла для первого обязательного условия
$^ Список всех предварительных условий
$? Список всех предварительных условий, которые новее, чем целевые
$* «Основа» неявного или шаблонного правила

В следующем примере используются автоматические переменные для генерации общего правила. Это дает инструкции о том, как создать файл .o из файла .c с тем же именем. Поскольку мы не знаем конкретного имени затронутых файлов, мы используем $@ в качестве заполнителя для имени выходного файла и $^ в качестве заполнителя для списка предварительных условий (в данном случае списка входных файлов).

%.o: %.c
    cc -Wall $^ -c $@

Условное присвоение переменной

Оператор ?= Является расширением, которое ведет себя как = , за исключением того, что присваивание происходит только в том случае, если переменная еще не установлена.

x = hello
x ?= world
# $(x) will yield "hello"

Добавление текста к существующей переменной

Оператор += является общим расширением, которое добавляет указанное содержимое в конец переменной, разделенное пробелом.

x = hello
x += world

Переменные ссылки в правой части будут расширены тогда и только тогда, когда исходная переменная была определена как просто расширенная переменная.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow