Функция origin
Функция origin отличается от большинства других функций тем, что она не работает со значениями переменных; она сообщает вам нечто о переменной. А именно, она сообщает вам, откуда она взялась.
Синтаксис функции origin:
$(origin variable)
Обратите внимание, что переменная — это имя переменной, о которой нужно узнать, а не ссылка на эту переменную. Поэтому обычно вы не будете использовать ‘$’ или скобки при её записи. (Однако вы можете использовать ссылку на переменную в имени, если не хотите, чтобы имя было константой.)
Результат этой функции — строка, указывающая, как была определена переменная переменная:
- ‘undefined’
-
если переменная никогда не была определена.
- ‘default’
-
если у переменной есть стандартное определение, как это обычно бывает с
CCи так далее. См. Переменные, используемые неявными правилами. Обратите внимание, что если вы переопределили стандартную переменную, функцияoriginвернёт происхождение более позднего определения. - ‘environment’
-
если переменная была унаследована из среды, предоставленной
make. - ‘environment override’
-
если переменная была унаследована из среды, предоставленной
make, и переопределяет значение переменной в файле make в результате опции ‘-e’ (см. Краткое описание опций). - ‘file’
-
если переменная была определена в файле make.
- ‘command line’
-
если переменная была определена в командной строке.
- ‘override’
-
если переменная была определена с директивой
overrideв файле make (см. Директиваoverride). - ‘automatic’
-
если переменная — это автоматическая переменная, определенная для выполнения рецепта для каждого правила (см. Автоматические переменные).
Эта информация в первую очередь полезна (помимо вашей любознательности) для определения того, хотите ли вы принять значение переменной. Например, предположим, у вас есть файл make foo, который включает другой файл make bar. Вы хотите, чтобы переменная bletch была определена в bar, если вы выполните команду ‘make -f bar’, даже если среда содержит определение bletch. Однако, если foo определил bletch перед включением bar, вы не хотите переопределять это определение. Это можно сделать, используя директиву override в foo, придав этому определению приоритет над более поздним определением в bar; к сожалению, директива override также переопределит любые определения командной строки. Итак, bar может содержать:
ifdef bletch ifeq "$(origin bletch)" "environment" bletch = barf, gag, etc. endif endif
Если bletch была определена из среды, это переопределит её.
Если вы хотите переопределить предыдущее определение bletch в случае, если оно было получено из среды, даже с опцией ‘-e’, вы можете вместо этого написать:
ifneq "$(findstring environment,$(origin bletch))" "" bletch = barf, gag, etc. endif
Здесь переопределение происходит, если ‘$(origin bletch)’ возвращает либо ‘environment’, либо ‘environment override’. См. Функции для подстановки и анализа строк.
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/Origin-Function.html