MudGuard: make - zig ähnliche Regeln zusammenfassen - wie?

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" >$@

hier folgen noch zig weitere Einträge, die aber eigentlich alle identisch aufgebaut sind, nur "Anton" ist immer durch was anderes ersetzt.

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

  1. 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

    1. 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

      1. 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

  2. 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