Синтаксис условных операторов
Синтаксис простого условного оператора без else выглядит следующим образом:
conditional-directive text-if-true endif
Текст text-if-true может содержать любые строки текста, которые будут считаться частью файла makefile, если условие истинно. Если условие ложно, вместо этого текст не используется.
Синтаксис сложного условного оператора следующий:
conditional-directive text-if-true else text-if-false endif
или:
conditional-directive-one text-if-one-is-true else conditional-directive-two text-if-two-is-true else text-if-one-and-two-are-false endif
Может быть столько «else conditional-directive» блоков, сколько необходимо. Как только заданное условие становится истинным, используется text-if-true, и никакие другие блоки не используются; если ни одно условие не истинно, используется text-if-false. text-if-true и text-if-false могут содержать любое количество строк текста.
Синтаксис conditional-directive одинаков как для простых, так и для сложных условных операторов; после else или нет. Существует четыре различных директивы, проверяющие различные условия. Вот таблица этих директив:
ifeq (arg1, arg2)ifeq 'arg1' 'arg2'ifeq "arg1" "arg2"ifeq "arg1" 'arg2'ifeq 'arg1' "arg2"-
Все ссылки на переменные в arg1 и arg2 расширяются и сравниваются. Если они идентичны, то действует text-if-true; в противном случае — text-if-false, если таковой имеется.
Часто требуется проверить, имеет ли переменная ненулевое значение. Когда значение является результатом сложных расширений переменных и функций, расширения, которые вы считаете пустыми, могут фактически содержать пробелы и, следовательно, не считаются пустыми. Однако вы можете использовать функцию
strip(см. Функции текста), чтобы избежать интерпретации пробелов как ненулевого значения. Например:ifeq ($(strip $(foo)),) text-if-empty endif
будет вычислять text-if-empty даже если расширение
$(foo)содержит пробелы. ifneq (arg1, arg2)ifneq 'arg1' 'arg2'ifneq "arg1" "arg2"ifneq "arg1" 'arg2'ifneq 'arg1' "arg2"-
Все ссылки на переменные в arg1 и arg2 расширяются и сравниваются. Если они различны, то действует text-if-true; в противном случае — text-if-false, если таковой имеется.
ifdef variable-name-
Форма
ifdefпринимает имя переменной в качестве аргумента, а не ссылку на переменную. Если значение этой переменной имеет ненулевое значение, то действует text-if-true; в противном случае — text-if-false, если таковой имеется. Переменные, которые никогда не были определены, имеют пустое значение. Текст variable-name расширяется, поэтому он может быть переменной или функцией, которая расширяется до имени переменной. Например:bar = true foo = bar ifdef $(foo) frobozz = yes endif
Ссылка на переменную
$(foo)расширяется, даваяbar, что считается именем переменной. Переменнаяbarне расширяется, но ее значение проверяется для определения того, является ли оно ненулевым.Обратите внимание, что
ifdefпроверяет только наличие значения у переменной. Она не расширяет переменную, чтобы посмотреть, является ли это значение ненулевым. Следовательно, тесты с использованиемifdefвозвращают true для всех определений, за исключением таких, какfoo =. Для проверки пустого значения используйтеifeq ($(foo),). Например:bar = foo = $(bar) ifdef foo frobozz = yes else frobozz = no endif
устанавливает ‘frobozz’ в ‘yes’, в то время как:
foo = ifdef foo frobozz = yes else frobozz = no endif
устанавливает ‘frobozz’ в ‘no’.
ifndef variable-nameЕсли переменная variable-name имеет пустое значение, то действует text-if-true; в противном случае — text-if-false, если таковой имеется. Правила расширения и проверки variable-name идентичны директиве
ifdef.
Дополнительные пробелы разрешены и игнорируются в начале строки директивы условного оператора, но табуляция не допускается. (Если строка начинается с табуляции, она будет считаться частью рецепта правила). Помимо этого, дополнительные пробелы или табуляции могут быть вставлены без эффекта где угодно, кроме как внутри имени директивы или внутри аргумента. Комментарий, начинающийся с ‘#’, может появиться в конце строки.
Еще две директивы, участвующие в условном операторе, это else и endif. Каждая из этих директив записывается как одно слово без аргументов. Дополнительные пробелы разрешены и игнорируются в начале строки, а пробелы или табуляции в конце — также. Комментарий, начинающийся с ‘#’, может появиться в конце строки.
Условные операторы влияют на то, какие строки файла makefile make использует. Если условие истинно, make считывает строки text-if-true как часть файла makefile; если условие ложно, make полностью игнорирует эти строки. Отсюда следует, что синтаксические единицы файла makefile, такие как правила, могут безопасно быть разделены на начало или конец условного оператора.
make вычисляет условные операторы при чтении файла makefile. Следовательно, вы не можете использовать автоматические переменные в проверке условных операторов, так как они не определяются до тех пор, пока не будут выполнены рецепты (см. Автоматические переменные).
Для предотвращения нежелательной путаницы, запрещено начинать условный оператор в одном файле makefile и завершать его в другом. Однако вы можете написать директиву include внутри условного оператора, при условии, что вы не пытаетесь завершить условный оператор внутри включённого файла.
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/Conditional-Syntax.html