Как совпадают шаблоны
Целевой шаблон состоит из символа ‘%’ между префиксом и суффиксом, каждый из которых может быть пустым. Шаблон соответствует имени файла только в том случае, если имя файла начинается с префикса и заканчивается суффиксом без перекрытия. Текст между префиксом и суффиксом называется основой. Таким образом, когда шаблон ‘%.o’ соответствует имени файла test.o, основой является ‘test’. Предварительные условия правила шаблона преобразуются в фактические имена файлов путем подстановки основы вместо символа ‘%’. Таким образом, если в том же примере одно из предварительных условий записано как ‘%.c’, оно расширяется до ‘test.c’.
Когда целевой шаблон не содержит слеша (и обычно не содержит), имена каталогов в именах файлов удаляются из имени файла перед сравнением его с целевым префиксом и суффиксом. После сравнения имени файла с целевым шаблоном имена каталогов вместе с завершающим их слешем добавляются к именам файлов, сгенерированным из шаблонов предварительных условий правила шаблона, и имени файла. Каталоги игнорируются только для поиска правила по умолчанию, а не для его применения. Таким образом, ‘e%t’ соответствует имени файла src/eat, с ‘src/a’ в качестве основы. Когда предварительные условия преобразуются в имена файлов, каталоги из основы добавляются в начало, а остальная часть основы подставляется вместо ‘%’. Основа ‘src/a’ с шаблоном предварительного условия ‘c%r’ дает имя файла src/car.
Правило шаблона может быть использовано для построения заданного файла только в том случае, если существует целевой шаблон, который соответствует имени файла, и все предварительные условия в этом правиле либо существуют, либо могут быть построены. Правила, которые вы пишете, имеют приоритет над теми, которые создаются. Однако правило, которое может быть удовлетворено без цепочки других неявных правил (например, правило без предварительных условий или с предварительными условиями, которые уже существуют или упоминаются), всегда имеет приоритет над правилом с предварительными условиями, которые должны быть созданы путем цепочки других неявных правил.
Возможны случаи, когда более одного правила шаблона будут удовлетворять этим критериям. В этом случае make выберет правило с самой короткой основой (то есть шаблон, который наиболее точно соответствует). Если более одного правила шаблона имеет самую короткую основу, make выберет первое из найденных в файле makefile.
Этот алгоритм приводит к тому, что более конкретные правила имеют приоритет над более общими; например:
%.o: %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
%.o : %.f
$(COMPILE.F) $(OUTPUT_OPTION) $<
lib/%.o: lib/%.c
$(CC) -fPIC -c $(CFLAGS) $(CPPFLAGS) $< -o $@
Учитывая эти правила и задачу построения bar.o, где существуют как bar.c, так и bar.f, make выберет первое правило и скомпилирует bar.c в bar.o. В той же ситуации, если bar.c отсутствует, make выберет второе правило и скомпилирует bar.f в bar.o.
Если make необходимо построить lib/bar.o, и существуют как lib/bar.c, так и lib/bar.f, то будет выбрано третье правило, так как основа этого правила (‘bar’) короче, чем основа первого правила (‘lib/bar’). Если lib/bar.c отсутствует, то третье правило не подходит, и будет использовано второе правило, даже если основа длиннее.
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/Pattern-Match.html