Значения переменных, специфичные для целевых объектов
Значения переменных в make обычно являются глобальными; то есть, они одинаковы независимо от места их вычисления (если, конечно, они не сброшены). Исключение составляют переменные, определённые с помощью функции let (см. Функция Let) или функции foreach (см. Функция Foreach), а также автоматические переменные (см. Автоматические переменные).
Ещё одним исключением являются значения переменных, специфичные для целевых объектов. Эта функция позволяет определять различные значения для одной и той же переменной, в зависимости от целевого объекта, над которым make в данный момент работает. Как и в случае с автоматическими переменными, эти значения доступны только в контексте рецепта целевого объекта (и в других целевых присваиваниях).
Установите значение переменной, специфичное для целевого объекта, так:
target … : variable-assignment
Присваивания переменных, специфичных для целевых объектов, могут быть префиксными любыми или всеми специальными ключевыми словами export, unexport, override, или private; они применяют своё обычное поведение только к данному экземпляру переменной.
Несколько значений target создают значение переменной, специфичное для целевого объекта, для каждого элемента списка целевых объектов индивидуально.
Присваивание variable-assignment может быть любым допустимым видом присваивания: рекурсивным (‘=’), простым (‘:=’ или ‘::=’), непосредственным (‘::=’), добавлением (‘+=’), или условным (‘?=’). Все переменные, присутствующие в variable-assignment, оцениваются в контексте целевого объекта: таким образом, любые ранее определённые значения переменных, специфичные для целевого объекта, будут действовать. Обратите внимание, что эта переменная фактически отличается от любого «глобального» значения: две переменные не обязаны иметь одинаковый тип (рекурсивный или простой).
Переменные, специфичные для целевых объектов, имеют тот же приоритет, что и другие переменные makefile. Переменные, предоставленные в командной строке (и в среде, если включён параметр ‘-e’), будут иметь приоритет. Указание директивы override позволит предпочесть значение переменной, специфичное для целевого объекта.
Есть ещё одна особенность переменных, специфичных для целевых объектов: когда вы определяете переменную, специфичную для целевого объекта, это значение также действует для всех зависимостей этого целевого объекта и всех их зависимостей и так далее (если эти зависимости не переопределяют эту переменную своим собственным значением переменной, специфичным для целевого объекта). Например, такое утверждение:
prog : CFLAGS = -g prog : prog.o foo.o bar.o
установит CFLAGS в ‘-g’ в рецепте для prog, но также установит CFLAGS в ‘-g’ в рецептах, создающих prog.o, foo.o и bar.o, и в любых рецептах, создающих их зависимости.
Обратите внимание, что каждая зависимость будет построена только один раз за один вызов make. Если один и тот же файл является зависимостью нескольких целевых объектов, и каждый из этих целевых объектов имеет другое значение для одной и той же переменной, специфичной для целевого объекта, то первый построенный целевой объект заставит построить эту зависимость, и зависимость унаследует значение переменной, специфичное для целевого объекта, от первого целевого объекта. Она проигнорирует значения переменных, специфичные для целевых объектов, от других целевых объектов.
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/Target_002dspecific.html