Errore "Nessun target" durante l'utilizzo di Make


12

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?


Sono quegli spazi o una scheda davanti al pandoccomando. Make è notoriamente schizzinoso sul fatto che quelli siano una scheda e non spazi.
slm

@slm: è una scheda. Ho letto da qualche parte che l'EOL di Windows non è compatibile, quindi ho convertito in un intero file in EOL compatibile con Unix.
Ahmed

Risposte:


17

Problema:

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 .

Makefile:

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

.PHONY: all clean

all: $(TAR)

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

clean:
    rm -f $(TAR)

Spiegazione:

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.


1
Ottima risposta e questi sono altri collegamenti che ho trovato quando ho cercato di comprenderlo ulteriormente: funzione jolly , riferimenti di sostituzione e target fasulli .
Ahmed

Un'altra domanda per favore: puoi 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 ^^ "
ahmed

1
vuoi dire se non ci sono file .markdown, allora verranno creati? sì, per quanto ne so, dovrebbe farlo
polym

1
Bene allora. Farò qualche altro scavo. Grazie per le tue risposte, grazie a te sono sulla buona strada ora
:)

1
Volevo solo ringraziarti per l'ottima risposta. Il modo in cui hai spiegato è molto facile da capire il motivo alla base del comando non funzionava e istruzioni molto dettagliate su come procedere. Grazie ancora.
zanona,

5

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

O con un carattere jolly:

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.