2009-03-24 12 views
5

Ist es möglich, die Umgebung von einem Makefile zu aktualisieren? Ich möchte in der Lage sein, ein Ziel zu erstellen, um die Client-Umgebungsvariablen für sie festzulegen. Etwas wie folgt aus:Kann ein Makefile die aufrufende Umgebung aktualisieren?

AXIS2_HOME ?= /usr/local/axis2-1.4.1 
JAVA_HOME ?= /usr/java/latest 
CLASSPATH := foo foo 

setenv: 
    export AXIS2_HOME 
    export JAVA_HOME 
    export CLASSPATH 

Damit kann der Kunde einfach tun:

make setenv all 
java MainClass 

und nutzen, ohne sie zu benötigen den Klassenpfad für die Java-Ausführung selbst zu setzen.

Oder suche ich das falsch und es gibt einen besseren Weg?

Antwort

5

Nein, Sie können die Umgebung im aufrufenden Prozess nicht auf diese Weise aktualisieren. Im Allgemeinen kann ein Unterprozess die Umgebung des übergeordneten Prozesses nicht ändern. Eine bemerkenswerte Ausnahme sind Batch-Dateien unter Windows, wenn sie von einer Cmd-Shell ausgeführt werden. Basierend auf dem Beispiel, das Sie zeigen, laufen Sie nicht unter Windows.

In der Regel wird mit einem Shell-Skript gearbeitet, das die Umgebung einrichtet und dann den beabsichtigten Prozess aufruft. Zum Beispiel könnten Sie ein go.sh Skript wie folgt schreiben:

!#/bin/sh 
AXIS2_HOME=/usr/local/axix2-1.4.1 
JAVA_HOME=/usr/java/latest 
CLASSPATH=foo foo 
export AXIS2_HOME 
export JAVA_HOME 
export CLASSPATH 
java MainClass 

Make go.sh ausführbar und jetzt können Sie Ihre App als ./go.sh laufen. Sie können Ihr Skript auch komplizierter gestalten, wenn Sie möchten - zum Beispiel möchten Sie vielleicht "MainClass" zu einem Parameter für das Skript machen, anstatt es hart zu codieren.

+0

Alternativ können Sie die letzte Zeile ('java MainClass') weglassen und dann Ihren Benutzern sagen, dass * source * das Skript genau für Ihre Situation der Einstellung von Umgebungsvariablen im Haupt-Shell-Prozess bestimmt ist. – JasonSmith

+0

Trivia: .BAT- und .CMD-Dateien in Windows werden in derselben Instanz von CMD.EXE verarbeitet, die interaktive Befehle fordert und ausführt. Dies entspricht dem Quellbefehl in csh oder dem. Befehl in sh. – RBerteig

-5

Die schnelle Antwort ist ja, aber in Ihrem Code müssten Sie die Variablen in der setenv: Direktive definieren. Wenn Sie es am Anfang des Makefiles machen, wird es zum Makefile. Ich würde LOCAL _... am Anfang der Datei verwenden, dann setze es in der setenv: Direktive mit VAR = LOCAL_VAR etc ... Beachten Sie auch, dass Sie das Makefile nur mit make setenv aufrufen müssen. Ich würde das wirklich in einem Bash-Skript machen, da die Variable außerhalb des Makefiles erstellt werden muss. Sobald die Variable in der Umgebung generiert wurde, sollte es möglich sein, sie aus dem Makefile zuzuweisen und zu exportieren.

4

Von Ihrer Frage nehme ich an, dass Sie die Bash-Shell verwenden.

Sie können die Variablendefinitionen in einem Shell-Skript platzieren, etwa so:

AXIS2_HOME=/usr/local/axis2-1.4.1 
export AXIS2_HOME 
#etc 

Und dann source das Skript in die aktuelle Umgebung, mit

source <filename> 

oder nur

. <filename> 

Das führt das Skript in der aktuellen sh ell (d.h. kein untergeordneter Prozess), so dass jede Umgebungsänderung das Skript ändert.

+0

Danke. Ich mag diesen Weg.Ich werde dem Makefile ein Ziel hinzufügen, um diese Datei zu generieren, um den Klassenpfad festzulegen und dem Dokument hinzuzufügen, dass es stammen soll. – brofield

Verwandte Themen