Ich möchte ein Makefile schreiben, das Tests ausführen würde. Der Test befindet sich in einem Verzeichnis './tests' und die zu testenden ausführbaren Dateien befinden sich im Verzeichnis './bin'.
Wenn ich die Tests ausführe, werden die exec-Dateien nicht angezeigt, da sich das Verzeichnis ./bin nicht im $ PATH befindet.
Wenn ich so etwas mache:
EXPORT PATH=bin:$PATH
make test
funktioniert alles. Allerdings muss ich den $ PATH im Makefile ändern.
Einfacher Makefile-Inhalt:
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
Der Pfad wird korrekt gedruckt, die Datei x wird jedoch nicht gefunden.
Wenn ich das manuell mache:
$ export PATH=bin:$PATH
$ x
dann ist alles in ordnung.
Wie könnte ich den $ PATH im Makefile ändern?
../test/test_to_run
? Entschuldigung, wenn ich die Frage falsch verstanden habe..
. Dies ist jedoch wahrscheinlich unpraktisch.Antworten:
Haben Sie die
export
Direktive von Make selbst ausprobiert (vorausgesetzt, Sie verwenden GNU Make)?Außerdem gibt es in Ihrem Beispiel einen Fehler:
Erstens ist der Wert, der
echo
bearbeitet wird, eine Erweiterung derPATH
Variablen, die von Make ausgeführt wird, nicht die Shell. Wenn der erwartete Wert ausgegeben wird, haben Sie vermutlichPATH
irgendwo früher in Ihrem Makefile oder in einer Shell, die Make aufgerufen hat, eine Variable festgelegt. Um ein solches Verhalten zu verhindern, sollten Sie Dollars entkommen:Zweitens funktioniert dies in keinem Fall, da Make jede Zeile des Rezepts in einer separaten Shell ausführt . Dies kann geändert werden, indem das Rezept in eine einzelne Zeile geschrieben wird:
quelle
$(PATH)
wird auf den WertPATH
der Shell gesetzt, die make aufruft. Im Handbuch heißt es: "Jede Umgebungsvariable, die make beim Start sieht, wird in eine make-Variable mit demselben Namen und Wert umgewandelt."PATH
wird in Variablen korrekt wiedergegeben (echo $(PATH)
) und in Befehlen Umgebungen (env
,which python
,bash -c python
), aber scheint nicht verwendet zu werden , wenn die ausführbare Datei für den Befehl Ortung: Der Befehlpython
noch läuft die Python ausführbar auf dem OriginalPATH
.Durch den Design-
make
Parser werden Zeilen in separaten Shell-Aufrufen ausgeführt. Wenn Sie die Variable (z. B.PATH
) in einer Zeile ändern, wird die Änderung möglicherweise nicht für die nächsten Zeilen angewendet (siehe diesen Beitrag ).Eine Möglichkeit, dieses Problem zu umgehen, besteht darin, mehrere Befehle in eine einzige Zeile (getrennt durch
;
) zu konvertieren oder ein spezielles One Shell- Ziel zu verwenden (.ONESHELL
ab GNU Make 3.82).Alternativ können Sie eine
PATH
Variable zum Zeitpunkt des Aufrufs der Shell angeben. Beispielsweise:quelle
$(shell)
Aufrufen funktioniert ! : D Beispiel: pastebin.com/Pii8pmkDPfadänderungen scheinen dauerhaft zu sein, wenn Sie zuerst die SHELL-Variable in Ihrem Makefile festlegen:
Ich weiß nicht, ob dies das gewünschte Verhalten ist oder nicht.
quelle
which
undenv
jetzt den neuen PATH aufnehmen, aber die direkte Ausführung einer Binärdatei wird im modifizierten PATH immer noch nicht gefunden, sondern nur im ursprünglichen.Normalerweise gebe ich den Pfad zur ausführbaren Datei explizit an:
Ich verwende diese Technik auch, um nicht native Binärdateien unter einem Emulator wie QEMU auszuführen, wenn ich Cross-Compilieren:
Wenn make die sh-Shell verwendet, sollte dies funktionieren:
quelle
PATH
Verwenden Sie zum Festlegen der Variablen nur im Makefile Folgendes:quelle