Estou tentando escrever um makefile onde tenho uma lista de arquivos .asy que estão gerando um .png ou .pdf.
Estou obtendo a extensão correta examinando o arquivo, então tenho a lista de fontes e objetos que eles geram:
asy_to_ext = $(shell sed -n \
's#^settings.outformat *= *"\([a-z]*\)" *;#\1#p' \
$(file) | tail -1)
ASY_SRC := $(wildcard *.asy)
ASY_EXT := $(foreach file,$(ASY_SRC),$(asy_to_ext))
ASY_OBJ := $(ASY_SRC:.asy=.$(ASY_EXT))
Minha pergunta é: agora, como dizer ao make que todo objeto depende da fonte correspondente? Com uma única extensão, uma regra de padrão estático está bem:
$(ASY_OBJ) : %.png: %.asy
asy -noView -nointeractiveView $<
Mas não consegui encontrar nada no manual que se assemelhasse a uma regra de padrão com um curinga como $(ASY_OBJ) : %.*: %.asy
ou usando a lista de fontes que tenho como
$(ASY_OBJ) : $(ASY_SRC)
.
Eu também tentei regras de dois pontos, mas eles só processam o primeiro objeto até que uma das regras não corresponda, e também, idealmente, estou procurando algo que funcione mesmo que ASY_OBJ acabe tendo uma extensão diferente de .pdf ou . png.
$(ASY_OBJ) :: %.png: %.asy
asy -noView -nointeractiveView $<
$(ASY_OBJ) :: %.pdf: %.asy
asy -noView -nointeractiveView $<
Indo me responder já que acabei achando o caminho: a solução é com expansão secundária , que permite usar variáveis automáticas na lista de pré-requisitos. Dessa forma, qualquer que seja a extensão do alvo, ela pode ser removida e substituída por .asy.
Também me escapou que minha função para obter ASY_EXT não estava funcionando corretamente, e isso foi resolvido usando a função map fornecida no manual .