Estou escrevendo uma receita de Makefile que precisa ser executada SE E SOMENTE SE um determinado arquivo existir ...
Aqui está o que eu tenho:
clean:
$(if $(shell test -s ${MFN_LSTF}), \
$(foreach mfn, $(shell cat ${MFN_LSTF}), \
$(MAKE) -f mfd/${mfn} clean;), )
.PHONY: clean
${MFN_LSTF} contém um nome de arquivo que contém uma lista de uma coluna de nomes de makefile que são considerados no mesmo diretório local que esta receita de makefile.
O problema que encontrei é que a foreach
instrução é executada sempre. Eu quero que ele execute SOMENTE SE o nome do arquivo ${MFN_LSTF}
existir.
Eu tentei isso também:
clean:
[ test -s ${MFN_LSTF} ] &&
for mfn in $(shell cat ${MFN_LSTF}); do
$(MAKE) -f mfd/${mfn} clean
done
.PHONY: clean
Você pode simplesmente escrever a parte do shell em um recipie.
As coisas a serem observadas são que se você quiser que o shell veja um dólar, você precisa dobrá-lo e que você deseja que o programa seja uma linha lógica, então o make o fornece a um único shell.
O GNUmake possui uma extensão para permitir que você execute um recipie inteiro em um único shell.
Ler um arquivo com cat em um loop for não é uma prática recomendada, dá errado se houver espaços no arquivo por exemplo, mas não estou corrigindo isso aqui para manter o código próximo ao original.
Esta pode ser uma solução possível e mais simples, emulando o shell:
E, o seguinte funciona, sem emular o shell: