Ответ 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
.
Можно указать несколько предварительных условий в правиле шаблона (т.е. при условии, что его целевые объекты содержат ствол %
, иначе это будет регулярное правило).