GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich dir $PATH in Makefile hinzufügen?

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.


Linux
  1. Wie kann man `sudo` dazu bringen, $path beizubehalten?

  2. Wie fügt man sauber zu $path hinzu?

  3. So ändern Sie die Shell unter Linux

  4. Wie füge ich einen standardmäßigen Include-Pfad für GCC in Linux hinzu?

  5. Wie setze ich $PATH dauerhaft unter Linux/Unix?

So fügen Sie ein Verzeichnis zu PATH in Linux hinzu

So fügen Sie ein Verzeichnis zu PATH in Linux hinzu [mit Beispielen]

So fügen Sie ein Yum-Repository hinzu

So fügen Sie ein Verzeichnis zu PATH in Linux hinzu [Kurztipp]

Linux:Fügen Sie PATH ein Verzeichnis hinzu

ldd findet keinen Pfad, wie man hinzufügt