Spec-Zone.ru › GNU Make

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

Первый тип переменных — это рекурсивно расширяемые переменные. Такие переменные определяются строками с использованием символа ‘=’ (см. Настройка переменных) или директивой define\ (см. Определение многострочных переменных). Указанное значение устанавливается дословно; если оно содержит ссылки на другие переменные, эти ссылки расширяются всякий раз, когда эта переменная подставляется (в процессе расширения какой-либо другой строки). В этом случае это называется рекурсивным расширением.

Например,

foo = $(bar)
bar = $(ugh)
ugh = Huh?

all:;echo $(foo)

выведет ‘Huh?’: ‘$(foo)’ расширяется до ‘$(bar)’, которое расширяется до ‘$(ugh)’, которое, наконец, расширяется до ‘Huh?’.

Этот тип переменных — единственный, поддерживаемый большинством других версий make. У него есть свои преимущества и недостатки. Преимущество (по мнению большинства) заключается в том, что:

CFLAGS = $(include_dirs) -O
include_dirs = -Ifoo -Ibar

сделает то, что предполагалось: при расширении ‘CFLAGS’ в рецепте оно расширится до ‘-Ifoo -Ibar -O’. Основной недостаток заключается в том, что вы не можете добавить что-либо в конец переменной, как в

CFLAGS = $(CFLAGS) -O

потому что это вызовет бесконечную петлю при расширении переменной. (На самом деле make обнаруживает бесконечную петлю и сообщает об ошибке.)

Другой недостаток заключается в том, что любые функции (см. Функции преобразования текста), упомянутые в определении, будут выполняться каждый раз при расширении переменной. Это замедляет работу make; хуже того, это приводит к тому, что функции wildcard и shell дают непредсказуемые результаты, поскольку вы не можете легко контролировать время их вызова или даже количество вызовов.

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/Recursive-Assignment.html

Spec-Zone.ru

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