Erro "Não alvo" usando Make

11

Estou aprendendo como usar make e makefiles, então escrevi este pequeno arquivo:

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

Mas quando executo make , tudo que eu obtenho é make: *** No targets. Stop. O que está acontecendo?

    
por ahmed 05.07.2014 / 15:49

2 respostas

17

Problema:

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 apenas, no entanto, falhará, desde que você tenha especificado apenas como criar seus destinos, mas não quais.

Como a saída do ponto de vista , a regra padrão acima é chamada de regra implícita .

Makefile:

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

.PHONY: all clean

all: $(TAR)

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

clean:
    rm -f $(TAR)

Explicação:

SRC get são todos os arquivos de origem (aqueles que terminam em .html ) por meio do wildcard do Makefile.

TAR substitui cada arquivo de origem listado em SRC com um destino que termina com .markdown em vez de .html .

.PHONY lista alvos não físicos que estão sempre desatualizados e, portanto, são sempre executados - eles são geralmente all e clean .

O destino all tem como dependência (arquivos listados no lado direito do : ) todos% arquivos*.markdown. Isso significa que todos esses alvos 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 * como no shell. O % no lado direito, no entanto, é comparado com a correspondência no lado esquerdo. Fonte .

Note que a sequência de espaços em branco na frente de pandoc é uma TAB , pois make define isso como um padrão.

Por fim, o alvo phony clean descreve como limpar seu sistema dos arquivos que você criou com este Makefile. Nesse caso, está excluindo todos os destinos (os arquivos que receberam o nome *.markdown .

    
por 05.07.2014 / 21:00
5

Regras padrão são regras implícitas.

Você não tem destinos definidos no seu Makefile. Você pode especificar o alvo na linha de comando: make something.markdown usará a receita para criar something.markdown de something.html .

Ou você pode adicionar ao seu Makefile uma regra especificando os destinos padrão.

all: file1.markdown file2.markdown

Ou com um curinga:

all: *.markdown

Quando você executa apenas make , o primeiro alvo da primeira regra é o meta padrão . Não precisa ser chamado all .

Por isso, o destino all tem todos os arquivos que você deseja criar como pré-requisitos, portanto, quando você make all , ele criará todos os arquivos listados.

    
por 05.07.2014 / 21:00

Tags