Você simplesmente não pode fazer isso. Não há como o processo make alterar o ambiente de seus pais (ou seu diretório atual, que você pode estar pensando em seguir).
Na verdade, ainda menos está acontecendo do que você pensa.
- Nem todas as implementações
make
refletem a atribuição à variável makePATH
no ambiente; O GNU make (encontrado no Linux e outros sistemas) faz, mas o BSD não faz. - Cada linha de comando sob um destino é executada em um subshell separado. (Exceto em alguns BSD mais antigos, faça implementações.) Portanto, a linha
export PATH
está sendo executada em um shell que termina imediatamente depois. Não que essa linha estivesse fazendo algo em primeiro lugar - sePATH
for definido nesse ponto, é porque já está no ambiente do shell.
Make é para criar coisas automaticamente. Se você quiser definir variáveis para o seu ambiente interativo, essa não é a ferramenta que você deveria estar olhando. Em vez disso, escreva um fragmento de shell e source no shell atual:
. ./define-my-variables.sh
No seu makefile, fonte o script em cada subshell . Você pode usar uma barra invertida para fazer um comando longo; lembre-se que
- A sequência da barra invertida e da nova linha é removida pelo make, portanto, o shell não verá uma nova linha lá.
- Lembre-se de prefixar cada linha por uma guia, no entanto.
- O comportamento de erro do Make é anulado se um comando falhar. O shell não fará isso por padrão, e a falha de qualquer comando, mas o último, passará despercebido por padrão, então você precisa executar
set -e
.
install:
set -e; \
. ./define-my-variables.sh; \
mkdir -p bin; \
…
¹ Nota obrigatória: nenhum modo sensato. Mesmo invocar remotamente chdir
via ptrace
de um depurador não funcionará como está com a maioria dos shells porque eles não gostam de ter seu diretório atual alterado sob seus pés.