Platzhalter in GNU verwenden Musterregel erstellen


7

Angenommen, doc.pdfist das Ziel.

Die folgende Regel löst eine Regeneration aus, doc.pdfwenn sie doc.referaktualisiert wird, freut sich aber auch, wenn sie doc.referüberhaupt nicht vorhanden ist:

doc.pdf: doc.mom $(wildcard doc.refer)
    pdfmom -e -k < $< > $@

Die folgende Musterregel bewirkt jedoch nicht dasselbe (das PDF wird korrekt generiert, aber beim Ändern wird keine Neuerstellung ausgelöst doc.refer):

%.pdf: %.mom Makefile $(wildcard %.refer)
    pdfmom -e -k < $< > $@

Ich vermute, dass der wildcardBefehl ausgeführt wird, bevor das %Zeichen erweitert wird. Wie kann ich das umgehen?

Antworten:


12

Die GNU Make-Funktion verwendetwildcard ein Shell-Globbing-Muster und erweitert es auf die Dateien, die diesem Muster entsprechen. Das Muster %.referenthält keine Shell-Globbing-Muster.

Sie wollen wahrscheinlich so etwas

%.pdf: %.mom %.refer
        pdfmom -e -k < $< > $@

%.pdf: %.mom
        pdfmom -e -k < $< > $@

Das erste Ziel wird aufgerufen, um PDF-Dateien zu erstellen, wenn eine .mom und eine .referDatei für den Basisnamen des Dokuments verfügbar sind. Das zweite Ziel wird aufgerufen, wenn keine .referDatei verfügbar ist.

Die Reihenfolge dieser Ziele ist wichtig.


1

GNU Lassen Sie alle Funktionen auswerten, um eine interne Darstellung der Musterregeln zu generieren.

So $(wildcard %.refer)ausgewertet, um Zeichenfolge für Ihre Regel zu leeren.

Der einzige Weg, um Ihr Ziel zu erreichen, besteht darin, die Reihenfolge der Regeln zu nutzen, wie es die Lösung von Kusalananda nahe legt(info "(make)Pattern Match") :

10.5.4 How Patterns Match

   It is possible that more than one pattern rule will meet these
criteria.  In that case, 'make' will choose the rule with the shortest
stem (that is, the pattern that matches most specifically).  If more
than one pattern rule has the shortest stem, 'make' will choose the
first one found in the makefile.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.