Avez-vous essayé export
directive de Make lui-même (en supposant que vous utilisez GNU Make) ?
export PATH := bin:$(PATH)
test all:
x
De plus, il y a un bogue dans votre exemple :
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
Premièrement, la valeur étant echo
ed est une extension de PATH
variable effectuée par Make, pas le shell. S'il imprime la valeur attendue, je suppose que vous avez défini PATH
variable quelque part plus tôt dans votre Makefile, ou dans un shell qui a invoqué Make. Pour éviter un tel comportement, vous devez échapper aux dollars :
test all:
PATH=bin:$$PATH
@echo $$PATH
x
Deuxièmement, dans tous les cas, cela ne fonctionnera pas car Make exécute chaque ligne de la recette dans un shell séparé. Cela peut être modifié en écrivant la recette sur une seule ligne :
test all:
export PATH=bin:$$PATH; echo $$PATH; x
Par conception make
l'analyseur exécute les lignes dans des invocations de shell séparées, c'est pourquoi changer de variable (par exemple PATH
) dans une ligne, la modification peut ne pas être appliquée pour les lignes suivantes (voir ce post).
Une façon de contourner ce problème consiste à convertir plusieurs commandes en une seule ligne (séparées par ;
), ou utilisez la cible spéciale One Shell (.ONESHELL
, à partir de GNU Make 3.82).
Vous pouvez également fournir PATH
variable au moment où le shell est appelé. Par exemple :
PATH := $(PATH):$(PWD)/bin:/my/other/path
SHELL := env PATH=$(PATH) /bin/bash
Ce que je fais habituellement, c'est de fournir explicitement le chemin vers l'exécutable :
EXE=./bin/
...
test all:
$(EXE)x
J'utilise également cette technique pour exécuter des binaires non natifs sous un émulateur comme QEMU si je compile de manière croisée :
EXE = qemu-mips ./bin/
Si make utilise le shell sh, cela devrait fonctionner :
test all:
PATH=bin:$PATH x
Les changements de chemin semblent être persistants si vous définissez d'abord la variable SHELL dans votre makefile :
SHELL := /bin/bash
PATH := bin:$(PATH)
test all:
x
Je ne sais pas si c'est un comportement souhaité ou non.