Usando o curinga no GNU Make regra de padrão

7

Suponha que doc.pdf seja o alvo.

A regra a seguir aciona uma regeneração de doc.pdf sempre que doc.refer é atualizado, mas também fica feliz quando doc.refer não existe:

doc.pdf: doc.mom $(wildcard doc.refer)
    pdfmom -e -k < $< > $@

No entanto, a regra de padrão a seguir não é a mesma (o PDF é gerado corretamente, mas a reconstrução não é acionada ao alterar doc.refer ):

%.pdf: %.mom Makefile $(wildcard %.refer)
    pdfmom -e -k < $< > $@

Eu suspeito que o comando wildcard seja executado antes que o caractere % seja expandido. Como posso contornar isso?

    
por not-a-user 21.07.2016 / 08:28

2 respostas

10

A função GNU Make wildcard leva um padrão de globalização e expande-o para os arquivos correspondentes a esse padrão. O padrão %.refer não contém padrões de globalização.

Você provavelmente quer algo como

%.pdf: %.mom %.refer
        pdfmom -e -k < $< > $@

%.pdf: %.mom
        pdfmom -e -k < $< > $@

O primeiro destino será invocado para fazer arquivos PDF quando houver um arquivo .mom e a .refer disponível para o nome base do documento. O segundo destino será invocado quando não houver um arquivo .refer disponível.

A ordem desses alvos é importante.

    
por 21.07.2016 / 08:48
0

GNU Make avalia todas as funções para gerar representação interna das regras padrão.

Assim, $(wildcard %.refer) foi avaliado como string vazia para sua regra.

A única maneira de alcançar seu objetivo é explorar a ordenação de regras, como a solução da Kusalananda sugere (info "(make)Pattern Match") :

10.5.4 How Patterns Match

   It is possible that more than one pattern rule will meet these
criteria.  In that case, 'make' will choose the rule with the shortest
stem (that is, the pattern that matches most specifically).  If more
than one pattern rule has the shortest stem, 'make' will choose the
first one found in the makefile.
    
por 15.10.2016 / 10:02

Tags