J'apprends à utiliser make
et à créer des fichiers, j'ai donc écrit ce petit fichier:
%.markdown: %.html
pandoc -o $< $@
Mais quand je cours make
, tout ce que je reçois, c'est make: *** No targets. Stop.
ce qui se passe?
J'apprends à utiliser make
et à créer des fichiers, j'ai donc écrit ce petit fichier:
%.markdown: %.html
pandoc -o $< $@
Mais quand je cours make
, tout ce que je reçois, c'est make: *** No targets. Stop.
ce qui se passe?
Réponses:
Votre problème est qu'il 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 lesquelles.
Comme le fait remarquer leiaz, la règle de modèle ci-dessus est appelée une règle implicite .
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
SRC
get tous les fichiers sources (ceux se terminant par .html
) via Makefile wildcard
.
TAR remplace chaque fichier source répertorié par SRC
par une cible se terminant par .markdown
au lieu de .html
.
.PHONY répertorie les cibles non physiques qui sont toujours obsolètes et sont donc toujours exécutées - ce sont souvent all
et clean
.
La cibleall
a comme dépendance (les fichiers répertoriés sur le côté droit de :
) tous les *.markdown
fichiers. Cela signifie que toutes ces cibles sont exécutées.
%.markdown: %.html
pandoc -o $< $@
Cet extrait indique: Chaque cible se terminant par .markdown
dépend d'un fichier du même nom, sauf que la dépendance se termine par .html
. Le caractère générique%
doit être vu comme un *
shell similaire. Le %
côté droit, cependant, est comparé au match du côté gauche. Source .
Notez que la séquence d'espaces devant pandoc
est un TAB, car make
définit cela comme une norme.
Enfin, la clean
cible bidon décrit comment nettoyer votre système des fichiers que vous avez créés avec ce Makefile. Dans ce cas, il supprime toutes les cibles (les fichiers qui ont été nommés *.markdown
.
makefile
créer des fichiers à partir de zéro ou ne met-il à jour que les fichiers existants? Parce que lorsque je supprime les fichiers générés, cela cesse de fonctionner. Question idiote je sais, mais c'est Terre-Neuve pour moi ^^ "
Les règles de modèle sont des règles implicites.
Vous n'avez aucun objectif défini dans votre Makefile. Vous pouvez spécifier la cible sur la ligne de commande: make something.markdown
utilisera la recette pour créer à something.markdown
partir de something.html
.
Ou vous pouvez ajouter à votre Makefile une règle spécifiant des cibles par défaut.
all: file1.markdown file2.markdown
Ou avec un caractère générique:
all: *.markdown
Lorsque vous exécutez simplement make
, la première cible de la première règle est l'objectif par défaut . Il n'a pas besoin d'être appelé all
.
Donc, ci-dessus, la cible all
a tous les fichiers que vous souhaitez créer comme prérequis, donc quand vous make all
, elle créera tous les fichiers répertoriés.
pandoc
commande. Make est notoirement pointilleux sur ceux qui sont un onglet et non des espaces.