O valor da variável PROJNAME
é
'pwd | grep -oP '(\w|-)+' | tail -n 2 | head -n 1 | tr '[:upper:]' '[:lower:]''
O caractere backquote não é especial no make. Se você usar a variável em um comando shell, o shell verá os backquotes e os analisará como uma substituição de comando. Mas se você usar a variável em um lugar onde ela é interpretada por make, as backquotes não fazem nada de especial. A linha onlinepresent: $(PROJNAME).html
torna-se, após a expansão da variável,
onlinepresent: 'pwd | grep -oP '(\w|-)+' | tail -n 2 | head -n 1 | tr '[:upper:]' '[:lower:]''.html
que faz análises como onlinepresent
, dois pontos, 'pwd
, \
, grep
, -oP
, '(\w|-)+'
, |
, tail
, -n
, 2
, |
, head
, -n
, 1
, |
, tr
, '[
, dois pontos, upper
, dois pontos, ]'
, '[
, dois pontos, lower
, dois pontos ]''.html
. Existem várias palavras à esquerda do cólon mais à direita, portanto, "vários padrões de destino".
Se você quiser usar a saída de um comando shell em um lugar onde o make irá lê-lo, você precisará invocar o % funçãoshell
. Este é um recurso do GNU make, não funcionará em outras implementações do make.
PROJNAME = $(shell pwd | grep -oP '(\w|-)+' | tail -n 2 | head -n 1 | tr '[:upper:]' '[:lower:]'')
Isso define a variável PROJNAME
como o próximo ao último componente do diretório de trabalho transformado em minúsculas.
Observe que o uso do diretório atual é frágil: significa que seu makefile não funcionará se chamado de um diretório diferente como o destino. Seria mais robusto calcular PROJNAME
do caminho para o destino. Se não fosse pela parte em minúscula, você poderia fazê-lo inteiramente (se complicado) com funções de criação (suponho que a intenção do seu código de divisão é realmente extrair componentes do nome do caminho):
$(notdir $(patsubst %/,%,$(dir $(patsubst %/,%,$(dir $(abspath $@))))))
mas o GNU make não possui um recurso de conversão de caso. Se você for invocar um shell de qualquer maneira, você pode simplificar.
PROJNAME = $(shell set -x; echo '$(abspath $@)' | awk -F/ '{$$0=tolower($$0); print $$(NF-2)}')
onlinepresent: $(PROJNAME).html
cp $< $$HOME/Share/index.html
Observe o uso de $$
no makefile, que se torna $
nos comandos do shell. Isso funciona porque a variável PROJNAME
é calculada em cada uso, não no momento da definição (as definições de variável no make são expandidas em cada uso se usarem =
e quando a atribuição for lida se usar :=
) .