Spec-Zone.ru › GNU Make

Определение готовых рецептов

Когда одна и та же последовательность команд полезна для создания различных целей, вы можете определить её как готовую последовательность с помощью директивы define, и ссылаться на готовую последовательность из рецептов для этих целей. Готовая последовательность фактически является переменной, поэтому её имя не должно конфликтовать с другими именами переменных.

Вот пример определения готового рецепта:

define run-yacc =
yacc $(firstword $^)
mv y.tab.c $@
endef

Здесь run-yacc — это имя определяемой переменной; endef обозначает конец определения; строки между ними — это команды. Директива define не расширяет ссылки на переменные и вызовы функций в готовой последовательности; символы ‘$’, скобки, имена переменных и т. д. все становятся частью значения определяемой переменной. Смотрите Определение многострочных переменных для полного объяснения define.

Первая команда в этом примере выполняет Yacc для первого предварительного требования любой правила, использующего готовую последовательность. Выходной файл из Yacc всегда называется y.tab.c. Вторая команда перемещает вывод в имя целевого файла правила.

Для использования готовой последовательности подставьте переменную в рецепт правила. Вы можете подставить её как любую другую переменную (см. Основы ссылок на переменные). Поскольку переменные, определённые с помощью define, являются рекурсивно расширяемыми переменными, все ссылки на переменные, которые вы написали внутри define, сейчас расширяются. Например:

foo.c : foo.y
        $(run-yacc)

‘foo.y’ будет заменено на переменную ‘$^’, когда она встречается в значении run-yacc, а ‘foo.c’ — на ‘$@’.

Это реалистичный пример, но в практике он не требуется, потому что make имеет неявное правило, позволяющее определить эти команды на основе имён файлов (см. Использование неявных правил).

При выполнении рецепта каждая строка готовой последовательности обрабатывается так, как будто она появляется сама по себе в правиле, предваряемая табуляцией. В частности, make вызывает отдельный дочерний процесс для каждой строки. Вы можете использовать специальные префиксные символы, влияющие на командные строки (‘@’, ‘-’, и ‘+’) в каждой строке готовой последовательности. См. Написание рецептов в правилах. Например, используя эту готовую последовательность:

define frobnicate =
@echo "frobnicating target $@"
frob-step-1 $< -o $@-step-1
frob-step-2 $@-step-1 -o $@
endef

make не будет выводить первую строку, команду echo. Но он будет выводить следующие две строки рецепта.

С другой стороны, префиксные символы в строке рецепта, которая ссылается на готовую последовательность, применяются к каждой строке последовательности. Таким образом, правило:

frob.out: frob.in
        @$(frobnicate)

не выводит ни одной строки рецепта. (См. Вывод рецептов для полного объяснения ‘@’.)

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/Canned-Recipes.html

Spec-Zone.ru

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