O comando shell inteiro está em uma única linha lógica porque a sintaxe de makefiles torna isso necessário. Em uma regra de makefile, cada linha de receita é executada em uma instância de shell separada. Antes que o analisador chegue a este ponto, sequências de barra invertida-nova linha são removidas, portanto, uma nova linha imediatamente precedida por uma barra invertida não conta como uma nova linha. Isso significa que você pode escrever isso (eu uso 8 espaços para representar uma tab):
target:
for x in $^; do \
somecommand $$x; \
done
e um comando shell como este será executado para construir target
:
for x in dependency1 dependency2 dependency3; do somecommand $x; done
O shell não recebe nenhuma nova linha aqui (é por isso que o ;
é necessário antes de done
).
Se você escreveu este makefile:
target:
for x in $^; do
somecommand $$x;
done
então cada um dos for x in …; do
, somecommand $x;
e done
seria executado em um shell separado, o que não funcionaria.
A variável installLibsTo
que você mostra é um exemplo maior com as mesmas restrições. Quando usado, expandirá para duas linhas de receita lógicas, uma que executa o comando construído pela chamada à função INSTALL_DIR
e outra que executa o loop for.