Ich lerne, wie man verwendet make
und 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 make
und 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 make
nichts über Ihre Ziele wissen.
Sie können Ihr obiges Makefile make stackoverflow.markdown
zum 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)
SRC
Holen Sie sich alle Quelldateien (die mit enden .html
) über Makefile's wildcard
.
TAR ersetzt jede aufgelistete Quelldatei SRC
durch ein Ziel, das mit .markdown
statt endet .html
.
.PHONY listet nicht-physische Ziele auf, die immer veraltet sind und daher immer ausgeführt werden - dies sind häufig all
und clean
.
Das Zielall
hat als Abhängigkeit (Dateien auf der rechten Seite der Liste :
) alle *.markdown
Dateien. Dies bedeutet, dass alle diese Ziele ausgeführt werden.
%.markdown: %.html
pandoc -o $< $@
In diesem Snippet heißt es: Jedes Ziel, das mit endet, .markdown
hä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 pandoc
ist TAB, da dies make
als Standard definiert wird.
Schließlich zeigt das falsche clean
Ziel, 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
.
makefile
Kö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.markdown
verwendet das Rezept zum Erstellen something.markdown
aus 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 all
hat also oben alle Dateien, die Sie als Voraussetzungen erstellen möchten. Wenn Sie make all
dies tun , werden alle aufgelisteten Dateien erstellt.
pandoc
Befehl. Make ist notorisch wählerisch, wenn es sich um Tabulatoren und keine Leerzeichen handelt.