2017-01-31 2 views
0

Ich versuche, eine Regel zu schreiben, die mein Prüfskript auf der Ausgabe jeder Stufe meines Programms aufrufen wird, diese Ausgabe erzeugend, wenn es nicht schon existiert, meine %.output : %.input Regel verwendend.Makefile - erfordern alle Musterübereinstimmungen

Ich versuchte check : $(wildcard stage[1234].output), aber dies bewirkt, dass die Regel nur die übereinstimmenden Ausgabedateien erfordert, die bereits vorhanden sind.

Ich könnte einfach eine Variable wie TARGETS = stage1.output stage2.output ... definieren, aber gibt es eine Möglichkeit, alle möglichen Übereinstimmungen eines Musters zu generieren und sie dann zu benötigen?

Antwort

1

für die %.output : %.input Regel anzuwenden, müssen Sie sowohl

  1. ein Ziel, das ein Zwischen erfordert, dass das Muster passt %.output
  2. eine entsprechende %.input Datei - entweder bereits existierende oder eine Regel, es zu bauen

Wenn Ihre stage*.input Dateien bereits vorhanden sind, können Sie:

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

Wenn Ihre stage*.input Dateien nicht existieren, aber von ähnlichen Musterregeln erwartet werden, wenden Sie das gleiche Prinzip an.

Wenn Ihre stage*.input aus komplizierteren Mitteln hergestellt werden, aber angenommen, dass ihr Name durch die Anwendung eines Substitutionsmusters generiert werden kann, wenden Sie einfach dieses Muster an. In Ihrem Beispiel wäre es so etwas wie:

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

Wenn Sie analog seq Unix-Dienstprogramm in möchten, hier ist es:

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: 

Ausgang:

$ 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'.