Spec-Zone.ru › GNU Make

Пример условного оператора

Следующий пример условного оператора указывает make использовать один набор библиотек, если переменная CC имеет значение ‘gcc’, и другой набор библиотек в противном случае. Он работает, управляя тем, какая из двух строк рецепта будет использоваться для правила. В результате, ‘CC=gcc’ в качестве аргумента к make изменяет не только используемый компилятор, но и какие библиотеки подключаются.

libs_for_gcc = -lgnu
normal_libs =

foo: $(objects)
ifeq ($(CC),gcc)
        $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif

Этот условный оператор использует три директивы: одну ifeq, одну else и одну endif.

Директива ifeq начинает условный оператор и задает условие. Она содержит два аргумента, разделенных запятой и заключенными в скобки. Подстановка переменных выполняется для обоих аргументов, а затем они сравниваются. Строки файла makefile, следующие за ifeq, выполняются, если два аргумента совпадают; в противном случае они игнорируются.

Директива else вызывает выполнение следующих строк, если предыдущий условный оператор не выполнился. В примере выше это означает, что вторая альтернативная команда подключения используется всякий раз, когда первая альтернатива не используется. В условном операторе наличие else является необязательным.

Директива endif завершает условный оператор. Каждый условный оператор должен завершаться endif. Следуют безусловные тексты файла makefile.

Как показывает этот пример, условные операторы работают на текстовом уровне: строки условного оператора обрабатываются как часть файла makefile или игнорируются в соответствии с условием. Вот почему более крупные синтаксические единицы файла makefile, такие как правила, могут пересекать начало или конец условного оператора.

Когда переменная CC имеет значение ‘gcc’, вышеприведенный пример имеет такой эффект:

foo: $(objects)
        $(CC) -o foo $(objects) $(libs_for_gcc)

Когда переменная CC имеет любое другое значение, эффект следующий:

foo: $(objects)
        $(CC) -o foo $(objects) $(normal_libs)

Эквивалентные результаты могут быть получены другим способом, путем условного присвоения переменной, а затем ее безусловного использования:

libs_for_gcc = -lgnu
normal_libs =

ifeq ($(CC),gcc)
  libs=$(libs_for_gcc)
else
  libs=$(normal_libs)
endif

foo: $(objects)
        $(CC) -o foo $(objects) $(libs)

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-Example.html

Spec-Zone.ru

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