Das kann man einfach nicht. Der make-Prozess kann auf keinen Fall¹ die Umgebung des übergeordneten Elements (oder das aktuelle Verzeichnis, an das Sie möglicherweise als Nächstes denken) ändern.
In der Tat passiert noch weniger als Sie denken.
- Nicht alle
make
Implementierungen spiegeln die Zuordnung zur PATH
Variablen make in der Umgebung wider . GNU make (auf Linux und anderen Systemen verfügbar) tut dies, BSD make jedoch nicht.
- Jede Befehlszeile unter einem Ziel wird in einer separaten Unterschale ausgeführt. (Außer in einigen älteren BSD-Implementierungen.) Die
export PATH
Leitung läuft also auf einer Shell, die unmittelbar danach endet. Nicht, dass diese Zeile überhaupt etwas tun würde - wenn PATH
sie an diesem Punkt definiert ist, liegt es daran, dass sie sich bereits in der Umgebung der Shell befindet.
Make dient zum automatischen Erstellen von Dingen. Wenn Sie Variablen für Ihre interaktive Umgebung festlegen möchten, ist dies nicht das Tool, das Sie sich ansehen sollten. Stattdessen schreibt einen Shell - Schnipsel und Quelle es in der aktuellen Shell:
. ./define-my-variables.sh
Geben Sie in Ihrem Makefile das Skript in jeder Subshell ein . Sie können einen Backslash verwenden, um einen langen Befehl auszuführen. erinnere dich daran
- Die Backslash-Newline-Sequenz wird von make entfernt, sodass die Shell dort keine Newline sieht.
- Denken Sie daran, jeder Zeile dennoch eine Registerkarte voranzustellen.
- Das Fehlerverhalten von Make besteht darin, den Vorgang abzubrechen, wenn ein Befehl fehlschlägt. Die Shell macht das standardmäßig nicht und der Fehler eines Befehls, aber der letzte, bleibt standardmäßig unbemerkt, sodass Sie ihn ausführen müssen
set -e
.
install:
set -e; \
. ./define-my-variables.sh; \
mkdir -p bin; \
…
¹ Obligatorische Anmerkung: kein vernünftiger Weg. Selbst das Remote-Aufrufen von chdir
via über ptrace
einen Debugger funktioniert nicht wie bei den meisten Shells, da sie nicht möchten, dass ihr aktuelles Verzeichnis unter ihren Füßen geändert wird.
Gilles 'SO - hör auf böse zu sein'
quelle
Das kannst du nicht. Es ist nicht möglich, dass ein Unterprozess (wie
make
) die Umgebung seines übergeordneten Prozesses ändert.Sie könnten so etwas tun
Wo das
pathupdate
Ziel aussieht:quelle
Ihre Antwort finden Sie hier: https://stackoverflow.com/a/8942216/367461
Grundsätzlich sollten Sie dies tun:
Ich habe dies auf Fedora 23 mit GNU Make 4.0 getestet und es funktioniert gut für mich.
quelle
.SHELL: name=sh path=/path/to/wrapper-script
ein Wrapper-Skript wieexport FOO=bar; exec bash "$@"
Ich werde die gleiche Frage stellen, weil ich das andere Antwortbeispiel nicht zum Laufen bringen konnte.
Es gelang mir jedoch, die funktionierende Lösung für mich mithilfe eines
eval
Befehls zu erreichen. Ich bin mir nicht sicher, warum dies nicht früher gepostet wurde.quelle
export PATH=…
auf derdo_something:
Linie, die Sie nicht benötigeneval
.Sie können dazu führen, dass Make sich rekursiv in einer geänderten Umgebung aufruft:
Wenn Sie ein Shell-Snippet verwenden möchten:
quelle