Considere um makefile
item multilinha:
define ITEM
line $$ONE
line $$TWO
endef
item:
echo '$(ITEM)' | ... > $@
O problema é que, à medida que o ITEM fica complexo, corro o risco de obter erros de cotação e outros problemas ao repetir o item.
Eu também poderia executar com uma exportação:
export ITEM
item:
print "%s\n" '$${ITEM}' | ...
Mas não tenho certeza se haverá os mesmos bugs.
Existe alguma função make que injetará o conteúdo de uma variável diretamente no shell, como se fosse enviado para /dev/stdin
?
# e.g. something like:
$(info $ITEM) | ...
Entendo que posso escrever o valor diretamente em um arquivo, que poderei processar via shell. Mas ser capaz de escrevê-lo diretamente em um pipeline causaria um curto-circuito nisso.
- isso terá uma série de comandos ou introduzirá requisitos como
sponge
- isso também pode fazer com que eu tenha que mudar de coisas simples
envsubst
para coisas mais pesadas, comosed
permitir modificações no local (para evitar a instalação de esponjas)
Também entendo que posso exportar o valor para todos os subshells:
- isso pode ser problemático se minha extensão estiver incluída em um projeto make recursivo ou em um projeto make com uma grande quantidade de sobrecarga de exportação (por exemplo,
parameter?=vars
aquele padrão para valores env introduz uma grande quantidade de sobrecarga quando.SECONDEXPANSION
está habilitado) - em particular, exportar muito pode prejudicar o desempenho da
zsh
conclusão de tabulação para make, que é um requisito básico para usuários de Mac
Mas não tenho provas de exportação e echo "$$ITEM"
ou print("%s/\n") "$$ITEM"
terei escapes adequados. Então terei que testar.
O que não é "uma maneira", mas a melhor prática pretendida para fazer isso?
Se a resposta for: use $(file ..)
e modifique o arquivo no local a partir daí, então que assim seja; só quero ter certeza de que é o ideal.
A solução usual para uma expansão de variável complexa é apenas escrever um arquivo shell externo. Ou um script (perl/python/awk). Ou mesmo uma ferramenta especial compilada para produzir algo que é necessário para a compilação real. Não é obrigatório que tudo faça parte de
makefile
.A regra geral aqui é: "se você está tendo dificuldades com variáveis, cifrões e aspas, talvez seja hora de pensar em um script externo?"
Depois de revisar a resposta aceita, vou adaptar a convenção do manual :
E no meu caso, o arquivo intermediário que terei que criar para manter a simplicidade
envsubst
(em vez de )sed
se tornará o análogo para o[email protected]
:O que será algo que terei grandes chances de fazer da mesma forma na próxima vez.