2017-02-16 1 views
1

Ich habe folgende Regeln in einem MakefileWildcards in Makefile-Regeln

%.00.png: %.dat 
    genimg.py $< [email protected] 

%.10.png: %.dat 
    genimg.py $< [email protected] 

%.20.png: %.dat 
    genimg.py $< [email protected] 

%.30.png: %.dat 
    genimg.py $< [email protected] 

wo genimg.py ist ein Skript, das ein Bild auf die Daten in einer *.dat Datei und ein Parameter basierend erzeugt, die im Namen der gespeichert wird Zieldatei (00, 10, 20, 30). Ist es möglich, alle diese Regeln zu einem zu kombinieren? Ich habe versucht, das Offensichtliche:

%.*.png: %.dat 
    genimg.py $< [email protected] 

aber das funktioniert nicht.

Antwort

2

Nein, es gibt keine Möglichkeit, dies zu einer Regel zusammenzufassen.

Aber Sie könnten die Regeln automatisch generieren. Vorausgesetzt, dass Sie es als eine einzige Zeile schreiben können Sie so etwas wie verwenden können:

SIZES := 00 10 20 30 

$(foreach S,$(SIZES),$(eval %.$S.png: %.dat ; genimg.py $$< [email protected])) 
0

Sie erreichen können, etwas ganz in der Nähe dieser mit secondary expansion, die automatic variable$* und die basename Funktion:

.SECONDEXPANSION: 
%.png: $$(basename $$*).dat 
    genimg.py $< [email protected] 

Aber diese hat die folgende Einschränkung, dass eine Datei mit dem Namen foo.png immer noch von dieser Regel angepasst wird und von foo.dat abhängig ist. Ist dies nicht akzeptables Verhalten für Ihre Anwendung ist, können Sie die aufwendigere Version verwenden:

.SECONDEXPANSION: 
# This relies on the assumption that there's no file named '/-' 
%.png: $$(if $$(word 2,$$(subst ., ,$$*)),$$(word 1,$$(subst ., ,$$*)).dat,/-) 
    genimg.py $< [email protected] 

Aber das kommt mit der zusätzlichen Einschränkung, dass eine Datei a.b.10.png genannt wird als Voraussetzung a.dat statt der erwarteten a.b.dat bekommen.