Haben Sie export
versucht Direktive von Make selbst (vorausgesetzt, Sie verwenden GNU Make)?
export PATH := bin:$(PATH)
test all:
x
Außerdem gibt es einen Fehler in Ihrem Beispiel:
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
Erstens ist der Wert echo
ed ist eine Erweiterung von PATH
Variable, die von Make ausgeführt wird, nicht von der Shell. Wenn es dann den erwarteten Wert ausgibt, haben Sie vermutlich PATH
eingestellt Variable irgendwo früher in Ihrem Makefile oder in einer Shell, die Make aufgerufen hat. Um ein solches Verhalten zu verhindern, sollten Sie Dollars entkommen:
test all:
PATH=bin:$$PATH
@echo $$PATH
x
Zweitens funktioniert das sowieso nicht, weil Make jede Zeile des Rezepts in einer separaten Shell ausführt. Dies kann geändert werden, indem das Rezept in einer einzigen Zeile geschrieben wird:
test all:
export PATH=bin:$$PATH; echo $$PATH; x
Mit Absicht make
Parser führt Zeilen in separaten Shell-Aufrufen aus, deshalb ändert sich die Variable (z.B. PATH
) in einer Zeile, die Änderung darf nicht für die nächsten Zeilen übernommen werden (siehe diesen Beitrag).
Eine Möglichkeit, dieses Problem zu umgehen, besteht darin, mehrere Befehle in eine einzige Zeile zu konvertieren (getrennt durch ;
), oder verwenden Sie das spezielle One Shell-Ziel (.ONESHELL
, ab GNU Make 3.82).
Alternativ können Sie PATH
angeben Variable zum Zeitpunkt des Shell-Aufrufs. Zum Beispiel:
PATH := $(PATH):$(PWD)/bin:/my/other/path
SHELL := env PATH=$(PATH) /bin/bash
Normalerweise gebe ich den Pfad zur ausführbaren Datei explizit an:
EXE=./bin/
...
test all:
$(EXE)x
Ich verwende diese Technik auch, um nicht-native Binärdateien unter einem Emulator wie QEMU auszuführen, wenn ich crosskompiliere:
EXE = qemu-mips ./bin/
Wenn make die sh-Shell verwendet, sollte dies funktionieren:
test all:
PATH=bin:$PATH x
Pfadänderungen scheinen dauerhaft zu sein, wenn Sie zuerst die SHELL-Variable in Ihrem Makefile setzen:
SHELL := /bin/bash
PATH := bin:$(PATH)
test all:
x
Ich weiß nicht, ob dies ein gewünschtes Verhalten ist oder nicht.