Spec-Zone.ru › GNU Make

Немедленное расширение переменной при присваивании

Другая форма присваивания позволяет немедленное расширение, но в отличие от простого присваивания, полученная переменная является рекурсивной: она будет повторно расширена при каждом использовании. Для предотвращения неожиданных результатов, после немедленного расширения значения, оно автоматически будет обрамлено кавычками: все вхождения $ в значении после расширения будут преобразованы в $$. Этот тип присваивания использует оператор ‘:::=’. Например,

var = first
OUT :::= $(var)
var = second

приводит к тому, что переменная OUT содержит текст ‘first’, а здесь:

var = one$$two
OUT :::= $(var)
var = three$$four

приводит к тому, что переменная OUT содержит текст ‘one$$two’. Значение расширяется при присваивании переменной, поэтому результатом является расширение первого значения var, ‘one$two’; затем значение повторно экранируется перед завершением присваивания, что даёт окончательный результат ‘one$$two’.

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

Это функционально эквивалентно операторам ‘:=’ / ‘::=’, но есть несколько отличий:

Во-первых, после присваивания переменная является обычной рекурсивной переменной; при добавлении к ней с помощью ‘+=’ значение в правой части не расширяется немедленно. Если вы предпочитаете, чтобы оператор ‘+=’ расширял правую часть немедленно, используйте операторы присваивания ‘:=’ / ‘::=’.

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

Вот еще один пример:

var = one$$two
OUT :::= $(var)
OUT += $(var)
var = three$$four

После этого значение OUT — текст ‘one$$two $(var)’. При использовании этой переменной она будет расширена, и результатом будет ‘one$two three$four’.

Этот стиль присваивания эквивалентен традиционному оператору BSD make ‘:=’; как вы можете видеть, он работает немного иначе, чем оператор GNU make ‘:=’. Оператор :::= добавлен в спецификацию POSIX в выпуске 8 для обеспечения переносимости.

Copyright © 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/make/manual/html_node/Immediate-Assignment.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API