Fehler "Kein Ziel" mit Make

12

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?

ahmed
quelle
Sind diese Leerzeichen oder eine Registerkarte vor dem pandocBefehl. Make ist notorisch wählerisch, wenn es sich um Tabulatoren und keine Leerzeichen handelt.
slm
@slm: Es ist eine Registerkarte. Ich habe irgendwo gelesen, dass Windows EOL nicht kompatibel ist, also habe ich in eine ganze Datei zu Unix-kompatiblem EOL konvertiert.
Ahmed

Antworten:

17

Problem:

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 .

Makefile:

SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)

.PHONY: all clean

all: $(TAR)

%.markdown: %.html
    pandoc -o $< $@

clean:
    rm -f $(TAR)

Erläuterung:

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.

polym
quelle
1
Tolle Antwort und dies sind andere Links, die ich gefunden habe, als ich versucht habe, sie besser zu verstehen: Platzhalterfunktion , Substitutionsreferenzen und falsche Ziele .
Ahmed
Noch eine Frage: 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 ^^ "
ahmed
1
Sie meinen, wenn es keine .markdown-Dateien gibt, werden sie erstellt? Ja, das sollte es tun, soweit ich weiß
Polym
1
Alles klar dann. Ich werde noch etwas graben. Vielen Dank für Ihre Antworten, dank Ihnen bin ich jetzt auf dem richtigen Weg
:)
1
Ich wollte mich nur für die tolle Antwort bedanken. Die Art und Weise, wie Sie erklärt haben, ist sehr leicht zu verstehen, warum der Befehl nicht funktioniert hat, und es gibt sehr detaillierte Anweisungen zum weiteren Vorgehen. Danke noch einmal.
Zanona
5

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

Oder mit einem Platzhalter:

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.

Leiaz
quelle