Spec-Zone.ru › GNU Make

Синтаксис правил статических шаблонов

Вот синтаксис правила статического шаблона:

targets …: target-pattern: prereq-patterns …
        recipe
        …

Список targets указывает цели, к которым применяется правило. Цели могут содержать символы подстановки, точно так же, как и цели обычных правил (см. Использование символов подстановки в именах файлов).

Значения target-pattern и prereq-patterns определяют, как вычисляются зависимости каждой цели. Каждая цель сопоставляется с target-pattern для извлечения части имени цели, называемой основой. Эта основа подставляется в каждое из prereq-patterns для создания имен зависимостей (по одному от каждого prereq-pattern).

Каждое правило обычно содержит символ ‘%’ только один раз. Когда target-pattern соответствует цели, ‘%’ может соответствовать любой части имени цели; эта часть называется основой. Остальная часть правила должна точно совпадать. Например, цель foo.o соответствует шаблону ‘%.o’, где ‘foo’ является основой. Цели foo.c и foo.out не соответствуют этому шаблону.

Имена зависимостей для каждой цели создаются путём подстановки основы в ‘%’ в каждом правиле зависимости. Например, если одно правило зависимости — %.c, то подстановка основы ‘foo’ даёт имя зависимости foo.c. Разрешается писать правило зависимости, которое не содержит ‘%’; тогда эта зависимость одинакова для всех целей.

Символы ‘%’ в правилах шаблонов могут быть экранированы предшествующим обратным слешем (‘\’). Обратные слэши, которые в противном случае экранировали бы символы ‘%’, могут быть экранированы дополнительными обратными слешами. Обратные слэши, которые экранируют символы ‘%’ или другие обратные слэши, удаляются из правила перед его сравнением с именами файлов или подстановкой основы. Обратные слэши, которые не могут экранировать символы ‘%’, остаются без изменений. Например, шаблон the\%weird\\%pattern\\ имеет ‘the%weird\’ перед действующим символом ‘%’ и ‘pattern\\’ после него. Последние два обратных слеша остаются без изменений, потому что они не могут повлиять на любой символ ‘%’.

Вот пример, который компилирует каждый из foo.o и bar.o из соответствующего файла .c:

objects = foo.o bar.o

all: $(objects)

$(objects): %.o: %.c
        $(CC) -c $(CFLAGS) $< -o $@

Здесь ‘$<’ — автоматическая переменная, содержащая имя зависимости, а ‘$@’ — автоматическая переменная, содержащая имя цели; см. Автоматические переменные.

Каждая указанная цель должна соответствовать шаблону цели; для каждой цели, которая не соответствует, выводится предупреждение. Если у вас есть список файлов, только некоторые из которых будут соответствовать шаблону, вы можете использовать функцию filter, чтобы удалить имена несоответствующих файлов (см. Функции для подстановки строк и анализа):

files = foo.elc bar.o lose.o

$(filter %.o,$(files)): %.o: %.c
        $(CC) -c $(CFLAGS) $< -o $@
$(filter %.elc,$(files)): %.elc: %.el
        emacs -f batch-byte-compile $<

В этом примере результатом ‘$(filter %.o,$(files))’ является bar.o lose.o, и первое правило статического шаблона вызывает обновление каждого из этих файлов-объектов путём компиляции соответствующего исходного файла C. Результатом ‘$(filter %.elc,$(files))’ является foo.elc, поэтому этот файл создаётся из foo.el.

Другой пример показывает, как использовать $* в правилах статических шаблонов:

bigoutput littleoutput : %output : text.g
        generate text.g -$* > $@

Когда выполняется команда generate, $* будет расширено до основы, либо ‘big’, либо ‘little’.

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/Static-Usage.html

Spec-Zone.ru

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