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 := ) .