Estou aprendendo a usar makee 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 makee 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 makenão sabe sobre seus alvos.
Você pode executar o Makefile acima com, make stackoverflow.markdownpor 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)
SRCget é todos os arquivos de origem (aqueles que terminam em .html) via Makefile wildcard.
O TAR substitui cada arquivo de origem listado SRCpor um destino que termina com em .markdownvez de .html.
.PHONY lista destinos não físicos que estão sempre desatualizados e, portanto, são sempre executados - geralmente são alle clean.
O destinoall tem como dependência (arquivos listados no lado direito da :) todos os *.markdownarquivos. Isso significa que todos esses destinos são executados.
%.markdown: %.html
pandoc -o $< $@
Este trecho diz: Cada destino que termina com .markdowndepende 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 makedefine isso como um padrão.
Finalmente, o cleanalvo 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.
makefilecrie 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.markdownvai usar a receita para criar something.markdowna 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 alltem todos os arquivos que você deseja criar como pré-requisitos; portanto, quando você make allcriará todos os arquivos listados.
pandoccomando. Make é notoriamente exigente quanto a esses itens serem uma tabulação e não espaços.