Adicionando o diretório ao PATH através do Makefile

7

Estou tendo problemas para exportar o PATH que modifiquei dentro do Makefile para o terminal atual. Eu estou tentando adicionar ao PATH, a pasta bin dentro onde quer que o diretório Makefile esteja.

Aqui está a faixa relevante do makefile:

PATH := $(shell pwd)/bin:$(PATH)

install:
    mkdir -p ./bin 
    export PATH
    echo $(PATH)

O eco imprime corretamente, mas se eu refazer o eco no terminal, o PATH permanecerá o mesmo.

    
por Tshepang 17.04.2011 / 23:04

5 respostas

13

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 make PATH 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 - se PATH 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.

    
por 17.04.2011 / 23:29
7

Você não pode. Não é possível que um subprocesso (como make ) altere o ambiente de seu processo pai.

Você poderia fazer algo como

$ eval 'make pathupdate'

Onde o alvo pathupdate se parece:

pathupdate:
    @echo PATH=\"$(PATH)\"
    
por 17.04.2011 / 23:24
4

Sua resposta pode ser encontrada aqui: link

Basicamente, você deve fazer isso:

export PATH := $(shell pwd)/bin:$(PATH)

test:
    mkdir -p ./bin
    @echo $(PATH)

Eu testei isso no Fedora 23 com o GNU Make 4.0, e funciona bem para mim.

    
por 12.02.2016 / 19:01
1

Você pode fazer com que o Make se chame recursivamente com um ambiente modificado, como tal:

dummy: build_all

all: 
    PATH=/new/directory:$(PATH) $(MAKE) build_all

build_all:
    your make rules 

Se você quiser usar um snippet de shell:

dummy: build_all

all:
    . ./define-my-variables.sh ; $(MAKE) build_all

build_all:
   your make rules
    
por 15.07.2014 / 19:46
1

Estou prestes a fazer a mesma pergunta porque não consegui fazer com que o outro exemplo de resposta funcionasse.

No entanto, consegui alcançar a solução de trabalho para mim usando o comando eval . Não tenho muita certeza de por que isso não foi postado antes.

do_something: 
    $(eval export PATH=$(shell pwd)/bin:$(PATH))
    @echo $(PATH)

Note: the PATH changes is temporary within the make itself. After exit from the make, the PATH is reset to the earlier value.

    
por 25.06.2016 / 00:08