Erreur "No target" avec Make

J'apprends à utiliser make et makefiles, alors j'ai écrit ce petit file:

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

Mais quand je cours make , tout ce que je reçois est de make: *** No targets. Stop. make: *** No targets. Stop. Que se passe-t-il?

Problème:

Votre problème est que make ne connaît pas vos cibles.

Vous pouvez exécuter votre Makefile ci-dessus avec make stackoverflow.markdown par exemple et cela fonctionnera.

make seulement, cependant, échouera, puisque vous avez seulement spécifié comment créer vos cibles, mais pas lequel.

Comme le sharepoint leiaz est hors la règle de model ci-dessus est appelée une règle implicite .

Makefile:

 SRC = $(wildcard *.html) TAR = $(SRC:.html=.markdown) .PHONY: all clean all: $(TAR) %.markdown: %.html pandoc -o $< $@ clean: rm -f $(TAR) 

Explication:

SRC get tous les files source (ceux se terminant en .html ) via le wildcard de Makefile.

TAR remplace chaque file source répertorié dans SRC par une cible se terminant par .markdown au lieu de .html .

.PHONY list les cibles non physiques qui sont toujours obsolètes et donc toujours exécutées – elles sont souvent all clean .

La cible a all comme dépendance (files listés sur le côté droit du *.markdown tous les files *.markdown . Cela signifie que toutes ces cibles sont exécutées.

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

Cet extrait dit: Chaque cible se terminant par .markdown dépend d'un file portant le même nom, sauf que la dépendance se termine par .html . Le caractère générique % doit être vu comme * comme en shell. Le % sur le côté droit, cependant, est comparé au match sur le côté gauche. Source .

Notez que la séquence d'espaces en face de pandoc est un TAB , car make définit cela comme un standard.

Enfin, la cible fausse clean dépeint comment nettoyer votre système à partir des files que vous avez créés avec ce Makefile. Dans ce cas, il supprime toutes les cibles (files nommés *.markdown .

Les règles de model sont des règles implicites.

Vous n'avez aucune cible définie dans votre Makefile. Vous pouvez spécifier la cible sur la command line: make something.markdown utilisera la recette pour créer something.markdown from something.html .

Ou vous pouvez append à votre Makefile une règle spécifiant les cibles par défaut.

 all: file1.markdown file2.markdown 

Ou avec un joker:

 all: *.markdown 

Lorsque vous exécutez simplement make , la première cible de la première règle est l'objective par défaut . Il n'a pas besoin d'être appelé all .

Donc ci-dessus, la cible a tous les files que vous voulez faire comme prérequirejs, donc quand vous make all , tous les files listés seront faits.