Hai provato export
direttiva di Make stesso (supponendo che tu usi GNU Make)?
export PATH := bin:$(PATH)
test all:
x
Inoltre, c'è un bug nel tuo esempio:
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
Innanzitutto, il valore è echo
ed è un'espansione di PATH
variabile eseguita da Make, non dalla shell. Se stampa il valore previsto allora, immagino, hai impostato PATH
variabile da qualche parte prima nel tuo Makefile o in una shell che ha invocato Make. Per prevenire tale comportamento dovresti sfuggire ai dollari:
test all:
PATH=bin:$$PATH
@echo $$PATH
x
In secondo luogo, in ogni caso questo non funzionerà perché Make esegue ogni riga della ricetta in una shell separata. Questo può essere cambiato scrivendo la ricetta in una sola riga:
test all:
export PATH=bin:$$PATH; echo $$PATH; x
In base alla progettazione make
parser esegue le righe in invocazioni di shell separate, ecco perché cambiare variabile (ad es. PATH
) in una riga, la modifica potrebbe non essere applicata alle righe successive (vedi questo post).
Un modo per aggirare questo problema è convertire più comandi in una singola riga (separata da ;
), o usa il bersaglio speciale One Shell (.ONESHELL
, a partire da GNU Make 3.82).
In alternativa puoi fornire PATH
variabile nel momento in cui viene richiamata la shell. Ad esempio:
PATH := $(PATH):$(PWD)/bin:/my/other/path
SHELL := env PATH=$(PATH) /bin/bash
Quello che faccio di solito è fornire esplicitamente il percorso dell'eseguibile:
EXE=./bin/
...
test all:
$(EXE)x
Uso questa tecnica anche per eseguire binari non nativi sotto un emulatore come QEMU se eseguo la compilazione incrociata:
EXE = qemu-mips ./bin/
Se make utilizza la shell sh, dovrebbe funzionare:
test all:
PATH=bin:$PATH x
Le modifiche al percorso sembrano essere persistenti se imposti prima la variabile SHELL nel tuo makefile:
SHELL := /bin/bash
PATH := bin:$(PATH)
test all:
x
Non so se questo è un comportamento desiderato o meno.