make - zig ähnliche Regeln zusammenfassen - wie?
MudGuard
- programmiertechnik
0 Henryk Plötz0 MudGuard
0 MudGuard
Hallo,
ich habe ein Makefile, dessen entscheidender Ausschnitt wie folgt aussieht:
$(src)/Anton.xml : $(src)/namen.xml $(src)/namen.xsl $(dependencies)
msxsl $< $(src)/namen.xsl dername="Anton" >$@
$(src)/Berta.xml : $(src)/namen.xml $(src)/namen.xsl $(dependencies)
msxsl $< $(src)/namen.xsl dername="Berta" >$@
$(src)/Caesar.xml : $(src)/namen.xml $(src)/namen.xsl $(dependencies)
msxsl $< $(src)/namen.xsl dername="Caesar" >$@
Das funktioniert auch wunderbar, $(src) und $(dependencies) sind weiter oben definiert.
Aber irgendwie gefällt mir das nicht, weil zigmal die "gleiche" Regel drinsteht.
Ich hätte das gerne verkürzt (z.B. mit Hilfe von foreach),
aber meine Versuche führten nicht zum Erfolg.
$(foreach dername,Anton Berta Caesar,$(src)/$(dername).xml : $(src)/namen.xml $(src)/namen.xsl $(dependencies)
msxsl $< $(src)/namen.xsl dername="$(dername)" >$@)
erzeugt den Fehler
Makefile:71: *** unterminated call to function foreach': missing )'. Stop.
(wobei Zeile 71 genau die mit dem foreach ist)
Dann habe ich versucht, den Zeilenumbruch/Tabulator wie üblich durch \n und \t zu ersetzen.
$(foreach dername,Anton Berta Caesar,$(src)/$(dername).xml : $(src)/namen.xml $(src)/namen.xsl $(dependencies)\n\tmsxsl $< $(src)/namen.xsl dername="$(dername)" >$@)
erzeugt einen Fehler:
Makefile:71: *** multiple target patterns. Stop
Das verwendete make-Utility ist GNU Make version 3.79.1
Gibt es eine Möglichkeit?
Vielen Dank im Voraus,
Andreas
Moin,
Mach daraus
$(src)/%.xml : $(src)/namen.xml $(src)/namen.xsl $(dependencies)
msxsl $< $(src)/namen.xsl dername="%" >$@
und erfreue dich deines Lebens.
--
Henryk Plötz
Grüße aus Berlin
Hi,
Mach daraus
$(src)/%.xml : $(src)/namen.xml $(src)/namen.xsl $(dependencies)
msxsl $< $(src)/namen.xsl dername="%" >$@
Hm. Aber woher weiß das make, welche Werte für % einzusetzen sind?
cu,
Andreas
Moin,
Hm. Aber woher weiß das make, welche Werte für % einzusetzen sind?
Naja, ich schätze mal es wird merken wenn es Anton.xml machen soll und keine Regel dafür findet, daß da noch eine Regel für %.xml rumschwirrt und dann für % Anton einsetzen. Ich habe das auch erst kürzlich von unserem Tutor Praktische Informatik erfahren, aber wenn du nachlesen willst: info make im Abschnitt Pattern Rules.
--
Henryk Plötz
Grüße aus Berlin
Hi,
die Lösung:
dienamen = Anton Berta Caesar
$(foreach dername,$(dienamen),$(src)/$(dername).xml) : $(src)/namen.xml $(src)/namen.xsl $(dependencies)
msxsl $< $(src)/namen.xsl dername="$(subst .xml,,$(@F))" >$@
cu,
Andreas