Типы предварительных условий
Существует два типа предварительных условий, понимаемых GNU make: обычные предварительные условия, описанные в предыдущем разделе, и предварительные условия только для порядка. Обычное предварительное условие делает два утверждения: во-первых, оно накладывает порядок, в котором будут вызваны рецепты: рецепты всех предварительных условий целевого объекта будут выполнены до начала рецепта для целевого объекта. Во-вторых, оно накладывает зависимость: если любое предварительное условие новее, чем целевой объект, то целевой объект считается устаревшим и должен быть перестроен.
Обычно это именно то, что вам нужно: если предварительное условие объекта обновляется, то объект также должен быть обновлен.
Иногда вам может потребоваться убедиться, что предварительное условие построено до целевого объекта, но без принудительного обновления целевого объекта, если предварительное условие обновляется. Предварительные условия только для порядка используются для создания этого типа отношений. Предварительные условия только для порядка можно указать, поместив символ «|» (|) в список предварительных условий: все предварительные условия слева от символа «|» являются обычными; все предварительные условия справа — предварительные условия только для порядка:
targets : normal-prerequisites | order-only-prerequisites
Раздел обычных предварительных условий, конечно, может быть пустым. Кроме того, вы по-прежнему можете объявлять несколько строк предварительных условий для одного и того же целевого объекта: они добавляются соответствующим образом (обычные предварительные условия добавляются в список обычных предварительных условий; предварительные условия только для порядка добавляются в список предварительных условий только для порядка). Обратите внимание, что если вы объявляете один и тот же файл как обычное, так и предварительное условие только для порядка, обычное предварительное условие имеет приоритет (поскольку они представляют собой строгое надмножество поведения предварительного условия только для порядка).
Предварительные условия только для порядка никогда не проверяются при определении, является ли целевой объект устаревшим; даже предварительные условия только для порядка, помеченные как фиктивные (см. Фиктивные целевые объекты), не приведут к перестройке целевого объекта.
Рассмотрим пример, когда ваши целевые объекты должны быть размещены в отдельном каталоге, и этот каталог может отсутствовать до того, как make будет выполнен. В этой ситуации вам нужно, чтобы каталог был создан перед размещением в нем каких-либо целевых объектов, но поскольку метки времени каталогов изменяются всякий раз, когда файл добавляется, удаляется или переименовывается, мы определенно не хотим перестраивать все целевые объекты всякий раз, когда меняется метка времени каталога. Один из способов управления этим — использовать предварительные условия только для порядка: сделайте каталог предварительным условием только для порядка для всех целевых объектов:
OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)
$(OBJDIR)/%.o : %.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
all: $(OBJS)
$(OBJS): | $(OBJDIR)
$(OBJDIR):
mkdir $(OBJDIR)
Теперь правило для создания каталога objdir будет выполнено, если это необходимо, перед построением любого файла ‘.o’, но никакой файл ‘.o’ не будет построен, потому что метка времени каталога objdir изменилась.
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/Prerequisite-Types.html