Sto imparando come usare make
e 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 make
e 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 make
non conosce i tuoi obiettivi.
Puoi eseguire il tuo Makefile sopra con make stackoverflow.markdown
per 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)
SRC
ottieni tutti i file sorgente (quelli che finiscono in .html
) tramite Makefile wildcard
.
TAR sostituisce ogni file sorgente elencato SRC
con una destinazione che termina con .markdown
invece di .html
.
.PHONY elenca obiettivi non fisici che sono sempre obsoleti e quindi sempre eseguiti - questi sono spesso all
e clean
.
Il targetall
ha come dipendenza (i file elencati sul lato destro del :
) tutti i *.markdown
file. Ciò significa che tutti questi obiettivi vengono eseguiti.
%.markdown: %.html
pandoc -o $< $@
Questo frammento dice: Ogni destinazione che termina con .markdown
dipende 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 make
definisce come standard.
Infine, il clean
target 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
.
makefile
creare 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.markdown
utilizzerà la ricetta per creare something.markdown
da 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 all
ha tutti i file che si desidera creare come prerequisiti, quindi quando si make all
crea tutti i file elencati.
pandoc
comando. Make è notoriamente schizzinoso sul fatto che quelli siano una scheda e non spazi.