Estou aprendendo a usar make
e makefiles, então escrevi este pequeno arquivo:
%.markdown: %.html
pandoc -o $< $@
Mas quando corro make
, tudo o que recebo é o make: *** No targets. Stop.
que está acontecendo?
Estou aprendendo a usar make
e makefiles, então escrevi este pequeno arquivo:
%.markdown: %.html
pandoc -o $< $@
Mas quando corro make
, tudo o que recebo é o make: *** No targets. Stop.
que está acontecendo?
Respostas:
Seu problema é que make
não sabe sobre seus alvos.
Você pode executar o Makefile acima com, make stackoverflow.markdown
por exemplo, e ele funcionará.
make
somente, no entanto, falhará, pois você especificou apenas como criar seus destinos, mas não quais.
Como o leiaz aponta, a regra padrão acima é chamada de regra implícita .
SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)
.PHONY: all clean
all: $(TAR)
%.markdown: %.html
pandoc -o $< $@
clean:
rm -f $(TAR)
SRC
get é todos os arquivos de origem (aqueles que terminam em .html
) via Makefile wildcard
.
O TAR substitui cada arquivo de origem listado SRC
por um destino que termina com em .markdown
vez de .html
.
.PHONY lista destinos não físicos que estão sempre desatualizados e, portanto, são sempre executados - geralmente são all
e clean
.
O destinoall
tem como dependência (arquivos listados no lado direito da :
) todos os *.markdown
arquivos. Isso significa que todos esses destinos são executados.
%.markdown: %.html
pandoc -o $< $@
Este trecho diz: Cada destino que termina com .markdown
depende de um arquivo com o mesmo nome, exceto que a dependência está terminando com .html
. O curinga%
deve ser visto como um *
shell. O %
lado direito, no entanto, é comparado ao jogo do lado esquerdo. Fonte .
Observe que a sequência de espaço em branco na frente de pandoc
é a TAB, pois make
define isso como um padrão.
Finalmente, o clean
alvo falso mostra como limpar seu sistema dos arquivos que você criou com este Makefile. Nesse caso, está excluindo todos os destinos (os arquivos que foram nomeados *.markdown
.
makefile
crie arquivos do zero ou atualize apenas os arquivos existentes? Porque quando eu excluo os arquivos gerados, ele pára de funcionar. Pergunta boba, eu sei, mas isso é Terra Nova para mim ^^ "
Regras padrão são regras implícitas.
Você não possui destinos definidos no seu Makefile. Você pode especificar o alvo na linha de comando: make something.markdown
vai usar a receita para criar something.markdown
a partir something.html
.
Ou você pode adicionar ao seu Makefile uma regra especificando destinos padrão.
all: file1.markdown file2.markdown
all: *.markdown
Quando você executa apenas make
, o primeiro destino da primeira regra é o objetivo padrão . Não precisa ser chamado all
.
Portanto, o destino all
tem todos os arquivos que você deseja criar como pré-requisitos; portanto, quando você make all
criará todos os arquivos listados.
pandoc
comando. Make é notoriamente exigente quanto a esses itens serem uma tabulação e não espaços.