Eu quero escrever um Makefile que executaria testes. Os testes estão em um diretório './tests' e os arquivos executáveis a serem testados estão no diretório './bin'.
Quando eu executo os testes, eles não veem os arquivos exec, pois o diretório ./bin não está no $ PATH.
Quando eu faço algo assim:
EXPORT PATH=bin:$PATH
make test
tudo funciona. No entanto, preciso alterar o $ PATH no Makefile.
Conteúdo simples de Makefile:
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
Ele imprime o caminho corretamente, porém não encontra o arquivo x.
Quando eu faço isso manualmente:
$ export PATH=bin:$PATH
$ x
está tudo bem então.
Como eu poderia mudar o $ PATH no Makefile?
../test/test_to_run
? Desculpe se eu entendi mal a pergunta..
. No entanto, isso provavelmente não é prático.Respostas:
Você tentou a
export
diretiva do próprio Make (assumindo que você usa GNU Make)?Além disso, há um bug em seu exemplo:
Primeiro, o valor que
echo
está sendo ed é uma expansão daPATH
variável realizada pelo Make, não pelo shell. Se ele imprimir o valor esperado, eu acho, você definiu aPATH
variável em algum lugar anteriormente em seu Makefile, ou em um shell que invocou o Make. Para evitar tal comportamento, você deve escapar dos dólares:Segundo, em qualquer caso, isso não funcionará porque o Make executa cada linha da receita em um shell separado . Isso pode ser alterado escrevendo a receita em uma única linha:
fonte
$(PATH)
será definido com o valor dePATH
do shell que invoca o make. De acordo com o manual , "Cada variável de ambiente que o make vê ao iniciar é transformada em uma variável do make com o mesmo nome e valor."PATH
é refletida corretamente no variáveis (echo $(PATH)
) e dentro de ambientes dos comandos (env
,which python
,bash -c python
), mas não parece ser usado quando localizar o executável para o comando: o comandopython
ainda corre o Executável Python no originalPATH
.Por projeto, o
make
analisador executa linhas em invocações de shell separadas, é por isso que a alteração da variável (por exemploPATH
) em uma linha, a alteração pode não ser aplicada nas próximas linhas (veja este post ).Uma maneira de contornar esse problema é converter vários comandos em uma única linha (separados por
;
) ou usar o destino especial One Shell (.ONESHELL
partir do GNU Make 3.82).Alternativamente, você pode fornecer
PATH
variáveis no momento em que o shell é chamado. Por exemplo:fonte
$(shell)
invocações! : D Exemplo: pastebin.com/Pii8pmkDAs mudanças de caminho parecem ser persistentes se você definir a variável SHELL em seu makefile primeiro:
Não sei se esse comportamento é desejado ou não.
fonte
which
eenv
agora pegue o novo PATH, mas a execução direta de um binário ainda não é encontrada no PATH modificado, apenas no original.O que geralmente faço é fornecer o caminho para o executável explicitamente:
Também uso essa técnica para executar binários não nativos em um emulador como o QEMU se estou compilando de forma cruzada:
Se o make estiver usando o shell sh, isso deve funcionar:
fonte
Para definir a
PATH
variável, apenas dentro do Makefile, use algo como:fonte