Spec-Zone.ru › GNU Make

Синтаксис условных операторов

Синтаксис простого условного оператора без 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

Spec-Zone.ru

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