Рекурсивное расширение переменных
Первый тип переменных — это рекурсивно расширяемые переменные. Такие переменные определяются строками с использованием символа ‘=’ (см. Настройка переменных) или директивой 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