2017-01-31 11 views
0

Я пытаюсь написать правило, которое будет вызывать мой скрипт проверки на выходе каждого этапа моей программы, генерируя этот вывод, если он еще не существует, используя мое правило %.output : %.input.Makefile - требуется совпадение всех шаблонов

Я пробовал check : $(wildcard stage[1234].output), но это заставляет правило требовать только те, которые соответствуют выходным файлам, которые уже существуют .

Я мог бы просто определить переменную как TARGETS = stage1.output stage2.output ..., но есть ли способ генерировать все возможные совпадения шаблона, а затем требовать их?

ответ

1

для %.output : %.input правило применять, вам нужно как

  1. цель, которая требует промежуточный продукт, который соответствует шаблону %.output
  2. соответствующий %.input файл - либо существовавшие ранее, либо правило, чтобы построить его

Если в вашем файле stage*.input есть файлы, которые вы можете использовать:

INPUTS=$(wildcard stage[1234].input) 
TARGETS=$(INPUTS:%.input=%.output) 
check: $(TARGETS) 

Если ваши файлы stage*.input не существуют, но предполагается, что они будут созданы из аналогичных правил шаблонов, повторите тот же принцип.

Если ваш stage*.input произведен из более сложных средств, но при условии, что их имя может быть сгенерировано приложением шаблона замены, просто примените этот шаблон. В вашем примере это будет что-то вроде:

L:= 1 2 3 4 
TARGETS=$(L:%=stage%.output) 
0

Если вы хотите аналог seq Unix утилиты в Make, здесь:

seq = $(if $(word $1,$2),$2,$(call seq,$1,$2 $(words $2 1))) 
$(info seq(10)=$(call seq,10)) 

stage_sount:=7 
stages:=$(patsubst %,stage%.output,$(call seq,$(stage_sount))) 
$(info stages=$(stages)) 
all: 

Выход:

$ make 
seq(10)= 1 2 3 4 5 6 7 8 9 10 
stages=stage1.output stage2.output stage3.output stage4.output stage5.output stage6.output stage7.output 
make: Nothing to be done for 'all'.