Makefile с краткими правилами, использующими один и тот же рецепт

Я хотел бы знать, можно ли написать Makefile с несколькими правилами, каждый из которых определяет свои собственные предпосылки и выполняет все из них один и тот же рецепт, не дублируя рецепт. Пример:

TARGETS= file1 file2 file3

all: $(TARGETS)

file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1
    cat $^ > [email protected]

Спасибо!

Ответы

Ответ 1

Да, это написано довольно очевидным образом:

TARGETS= file1 file2 file3

all: $(TARGETS)

file1: dep1 dep2
file2: dep2 dep3 dep4
file3: dep2 dep1

$(TARGETS):
    cat $^ > [email protected]

UPD.

Просто уточнить.

Общий make rule выглядит следующим образом:

targets... : prerequisites...
    recipe
    ...

Любая часть правила может быть опущена. Без рецепта можно заполнить список предварительных условий в любом месте make файла, в левой части нескольких инструкций правила может быть указана цель.

Например, следующее приведенное выше эквивалентно приведенному выше примеру (ну, предположив, что Makefile правильно спроектирован так, что порядок предварительных условий не имеет значения):

file1 file3       : dep1
file1 file2 file3 : dep2
file2             : dep3 dep4

В отличие от предварительных условий перечисления, может быть не более одного явного рецепта для каждой цели. Внутри рецепта вы можете использовать автоматические переменные для получения целевого имени, списка предварительных условий и т.д.

UPD. 2

Как отмечает @Calmarius в комментариях, это не относится к правилам шаблонов, например %.txt: %.foo. Несколько шаблонов в пределах целей означают, что правило создает все эти цели сразу.

Это правило шаблона имеет две цели:

%.tab.c %.tab.h: %.y
    bison -d $<

Это говорит о том, что рецепт bison -d x.y сделает как x.tab.c, так и x.tab.h. Если файл foo зависит от файлы parse.tab.o и scan.o, а файл scan.o зависит от файл parse.tab.h, когда parse.y изменен, рецепт bison -d parse.yбудет выполняться только один раз, и предпосылки обоих parse.tab.o и scan.o.

Можно указать несколько предварительных условий в правиле шаблона (т.е. при условии, что его целевые объекты содержат ствол %, иначе это будет регулярное правило).