Ich lerne, wie man verwendet makeund wie man Makefiles erstellt, also habe ich diese kleine Datei geschrieben:
%.markdown: %.html
pandoc -o $< $@
Aber wenn ich renne make, bekomme ich nur make: *** No targets. Stop.was ist los?
Ich lerne, wie man verwendet makeund wie man Makefiles erstellt, also habe ich diese kleine Datei geschrieben:
%.markdown: %.html
pandoc -o $< $@
Aber wenn ich renne make, bekomme ich nur make: *** No targets. Stop.was ist los?
Antworten:
Ihr Problem ist, dass Sie makenichts über Ihre Ziele wissen.
Sie können Ihr obiges Makefile make stackoverflow.markdownzum Beispiel mit ausführen und es wird funktionieren.
make Nur dies schlägt jedoch fehl, da Sie nur angegeben haben, wie Ihre Ziele erstellt werden sollen, nicht jedoch welche.
Wie Leiaz hervorhebt, wird die obige Musterregel als implizite Regel bezeichnet .
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
SRCHolen Sie sich alle Quelldateien (die mit enden .html) über Makefile's wildcard.
TAR ersetzt jede aufgelistete Quelldatei SRCdurch ein Ziel, das mit .markdownstatt endet .html.
.PHONY listet nicht-physische Ziele auf, die immer veraltet sind und daher immer ausgeführt werden - dies sind häufig allund clean.
Das Zielall hat als Abhängigkeit (Dateien auf der rechten Seite der Liste :) alle *.markdownDateien. Dies bedeutet, dass alle diese Ziele ausgeführt werden.
%.markdown: %.html
pandoc -o $< $@
In diesem Snippet heißt es: Jedes Ziel, das mit endet, .markdownhängt von einer Datei mit demselben Namen ab, mit der Ausnahme, dass die Abhängigkeit mit endet .html. Der Platzhalter% ist als *Like in Shell zu sehen. Das %auf der rechten Seite wird jedoch mit dem Spiel auf der linken Seite verglichen. Quelle .
Beachten Sie, dass die Leerzeichenfolge vor a pandocist TAB, da dies makeals Standard definiert wird.
Schließlich zeigt das falsche cleanZiel, wie Sie Ihr System von den Dateien reinigen, die Sie mit diesem Makefile erstellt haben. In diesem Fall werden alle Ziele gelöscht (die benannten Dateien) *.markdown.
makefileKönnen Sie Dateien von Grund auf neu erstellen oder aktualisieren Sie nur vorhandene Dateien? Denn wenn ich die generierten Dateien lösche, funktioniert es nicht mehr. Dumme Frage, die ich kenne, aber das ist Neufundland für mich ^^ "
Musterregeln sind implizite Regeln.
In Ihrem Makefile sind keine Ziele definiert. Sie können das Ziel in der Befehlszeile angeben: make something.markdownverwendet das Rezept zum Erstellen something.markdownaus something.html.
Oder Sie können Ihrem Makefile eine Regel hinzufügen, die Standardziele angibt.
all: file1.markdown file2.markdown
all: *.markdown
Wenn Sie nur ausführen make, ist das erste Ziel der ersten Regel das Standardziel . Es muss nicht aufgerufen werden all.
Das Ziel allhat also oben alle Dateien, die Sie als Voraussetzungen erstellen möchten. Wenn Sie make alldies tun , werden alle aufgelisteten Dateien erstellt.
pandocBefehl. Make ist notorisch wählerisch, wenn es sich um Tabulatoren und keine Leerzeichen handelt.