Sto imparando come usare makee makefile, quindi ho scritto questo piccolo file:
%.markdown: %.html
pandoc -o $< $@
Ma quando corro make, tutto ciò che ottengo è make: *** No targets. Stop.Cosa sta succedendo?
Sto imparando come usare makee makefile, quindi ho scritto questo piccolo file:
%.markdown: %.html
pandoc -o $< $@
Ma quando corro make, tutto ciò che ottengo è make: *** No targets. Stop.Cosa sta succedendo?
Risposte:
Il tuo problema è che makenon conosce i tuoi obiettivi.
Puoi eseguire il tuo Makefile sopra con make stackoverflow.markdownper esempio e funzionerà.
make solo, tuttavia, fallirà, poiché hai specificato solo come creare i tuoi obiettivi, ma non quale.
Come sottolineato da Leiaz, la regola del modello sopra è chiamata una regola implicita .
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
SRCottieni tutti i file sorgente (quelli che finiscono in .html) tramite Makefile wildcard.
TAR sostituisce ogni file sorgente elencato SRCcon una destinazione che termina con .markdowninvece di .html.
.PHONY elenca obiettivi non fisici che sono sempre obsoleti e quindi sempre eseguiti - questi sono spesso alle clean.
Il targetall ha come dipendenza (i file elencati sul lato destro del :) tutti i *.markdownfile. Ciò significa che tutti questi obiettivi vengono eseguiti.
%.markdown: %.html
pandoc -o $< $@
Questo frammento dice: Ogni destinazione che termina con .markdowndipende da un file con lo stesso nome, tranne per il fatto che la dipendenza termina con .html. Il carattere jolly% deve essere visto come un *like nella shell. Il %lato destro, tuttavia, viene confrontato con il match sul lato sinistro. Fonte .
Si noti che la sequenza di spazi bianchi davanti a pandocè a TAB, poiché la makedefinisce come standard.
Infine, il cleantarget fasullo descrive come ripulire il sistema dai file creati con questo Makefile. In questo caso, sta eliminando tutte le destinazioni (quei file che sono stati nominati *.markdown.
makefilecreare file da zero o aggiorna solo i file esistenti? Perché quando elimino i file generati, smette di funzionare. Domanda sciocca, lo so, ma questa è Terranova per me ^^ "
Le regole del modello sono regole implicite.
Non hai obiettivi definiti nel tuo Makefile. È possibile specificare la destinazione nella riga di comando: make something.markdownutilizzerà la ricetta per creare something.markdownda something.html.
Oppure puoi aggiungere al tuo Makefile una regola che specifica le destinazioni predefinite.
all: file1.markdown file2.markdown
all: *.markdown
Quando si esegue solo make, il primo obiettivo della prima regola è l'obiettivo predefinito . Non ha bisogno di essere chiamato all.
Quindi, sopra, la destinazione allha tutti i file che si desidera creare come prerequisiti, quindi quando si make allcrea tutti i file elencati.
pandoccomando. Make è notoriamente schizzinoso sul fatto che quelli siano una scheda e non spazi.