Wie wird die Einrichtung der Umgebung in Makefile gehandhabt?

7

Um meine ausführbare Datei zu kompilieren, müssen die Speicherorte der Bibliothek korrekt eingerichtet sein. Das Problem ist, dass das Setup von einer Reihe von Skripten kommt, die die exv-Variable exportieren, und was eingerichtet werden muss, kann sich ändern (außerhalb meiner Kontrolle), also muss ich diese Skripte verwenden, anstatt ihre Funktionalität zu kopieren. Um in der regulären Befehlszeile zu kompilieren, muss ich etwas tun wie:

%Vor%

Wie würde ich ein Makefile schreiben, das das leistet? Soweit ich es versucht habe, wird der exv-Export nicht übernommen (d. H. "Export VAR = remember; echo $ VAR" wird nicht funktionieren)

    
polyglot 09.10.2009, 23:28
quelle

6 Antworten

5

Wenn der Variablenexport nicht so funktioniert wie in der Befehlszeile, deutet das darauf hin, dass Make eine andere Shell wählt als die, die Sie verwenden, mit einer anderen Syntax für den Umgang mit Variablen ( export VAR=remember; echo $VAR funktioniert gut für mich) . Verwenden Sie standardmäßig /bin/sh , aber Sie können dies mit der Shell-Variablen überschreiben, die Make nicht aus der Umgebung importiert. Ich schlage vor, SHELL (im Makefile) auf alles einzustellen, was Sie in Ihrer Umgebung verwenden, und das export VAR=remember -Experiment erneut auszuprobieren.

    
Beta 10.10.2009, 00:00
quelle
11

Sie können auch Umgebungsvariablen korrekt mit der GNU make-Maschine hinzufügen:

%Vor%

Das (glaube ich) hat eine andere Semantik als:

%Vor%

Was (wieder, denke ich) die Substitution innerhalb macht, bevor es zur Shell weitergeht. Beachten Sie, dass der Befehl export nicht in einem Zielblock funktioniert, sondern nur als sofort ausgeführter Befehl nicht eingerückt ist.

    
Dav Clark 16.02.2011 17:56
quelle
3

Letztendlich müssen Sie die Variable definieren und den Compiler in einer Shell-Liste oder sogar in einem Skript ausführen, anstatt in separaten make -Befehlen. Es gibt jedoch ein paar Verbesserungen, die Sie hinzufügen könnten. Sie könnten make über das Skript sagen:

%Vor%

Eine andere Sache wäre, all diese Sachen einfach in der gleichen Shell auszuführen

%Vor%

Ich glaube, dass alle make -Versionen eine ; -Liste in derselben Shell ausführen, aber Sie können immer eine Untershell mit (list) erzwingen oder indem Sie speziell ein Shell-Skript als Compiler-Befehls-Wrapper aufrufen.

Vergessen Sie nicht, die entsprechenden Ziele von Ihren Skripten abhängig zu machen. Übrigens können einige make Versionen ( pmake aka bsd make ) einen Befehl ausführen, wenn sie eine make Variable definieren, und alle Versionen von make exportieren diese dann. Aber ich denke nicht, dass gmake das kann.

    
DigitalRoss 09.10.2009 23:43
quelle
1

Sie könnten ein weiteres Shell-Skript schreiben, das all diese Befehle ausführt und dann Variablenzuweisungen ausgibt, die make verwenden kann. Führen Sie das Skript aus, leiten Sie seine Ausgabe in eine Datei um und fügen Sie diese Datei dann in Ihr Makefile ein. Zum Beispiel:

Makefile:

%Vor%

test.sh

%Vor%

Das Ausführen von "make" in dem Verzeichnis, das dieses Makefile enthält, erzeugt:

%Vor%

make erstellt test.mk, indem es das Shell-Skript ausführt und schließt es ein. test.mk enthält die Ausgabe von test.sh und wird als Makefile geparst. Weitere Informationen finden Sie Ссылка .
Wir verwenden eine Variante davon in Mozillas client.mk, um Optionen in einer "mozconfig" -Datei zu definieren: Ссылка

    
Ted Mielczarek 13.10.2009 15:36
quelle
0
___ answer5020195 ___

Sie können auch Umgebungsvariablen korrekt mit der GNU make-Maschine hinzufügen:

%Vor%

Das (glaube ich) hat eine andere Semantik als:

%Vor%

Was (wieder, denke ich) die Substitution innerhalb macht, bevor es zur Shell weitergeht. Beachten Sie, dass der Befehl export nicht in einem Zielblock funktioniert, sondern nur als sofort ausgeführter Befehl nicht eingerückt ist.

    
___ qstntxt ___

Um meine ausführbare Datei zu kompilieren, müssen die Speicherorte der Bibliothek korrekt eingerichtet sein. Das Problem ist, dass das Setup von einer Reihe von Skripten kommt, die die exv-Variable exportieren, und was eingerichtet werden muss, kann sich ändern (außerhalb meiner Kontrolle), also muss ich diese Skripte verwenden, anstatt ihre Funktionalität zu kopieren. Um in der regulären Befehlszeile zu kompilieren, muss ich etwas tun wie:

%Vor%

Wie würde ich ein Makefile schreiben, das das leistet? Soweit ich es versucht habe, wird der exv-Export nicht übernommen (d. H. "Export VAR = remember; echo $ VAR" wird nicht funktionieren)

    
___ answer1546616 ___

Wenn der Variablenexport nicht so funktioniert wie in der Befehlszeile, deutet das darauf hin, dass Make eine andere Shell wählt als die, die Sie verwenden, mit einer anderen Syntax für den Umgang mit Variablen ( %code% funktioniert gut für mich) . Verwenden Sie standardmäßig %code% , aber Sie können dies mit der Shell-Variablen überschreiben, die Make nicht aus der Umgebung importiert. Ich schlage vor, SHELL (im Makefile) auf alles einzustellen, was Sie in Ihrer Umgebung verwenden, und das %code% -Experiment erneut auszuprobieren.

    
___ answer1546572 ___

Letztendlich müssen Sie die Variable definieren und den Compiler in einer Shell-Liste oder sogar in einem Skript ausführen, anstatt in separaten %code% -Befehlen. Es gibt jedoch ein paar Verbesserungen, die Sie hinzufügen könnten. Sie könnten %code% über das Skript sagen:

%Vor%

Eine andere Sache wäre, all diese Sachen einfach in der gleichen Shell auszuführen

%Vor%

Ich glaube, dass alle %code% -Versionen eine %code% -Liste in derselben Shell ausführen, aber Sie können immer eine Untershell mit %code% erzwingen oder indem Sie speziell ein Shell-Skript als Compiler-Befehls-Wrapper aufrufen.

Vergessen Sie nicht, die entsprechenden Ziele von Ihren Skripten abhängig zu machen. Übrigens können einige %code% Versionen ( %code% aka %code% ) einen Befehl ausführen, wenn sie eine make Variable definieren, und alle Versionen von %code% exportieren diese dann. Aber ich denke nicht, dass %code% das kann.

    
___ answer 14819597 ___

Restatement: Wie bekomme ich eine Shell-Variable in eine Make-Datei?

Etwas wie:

%Vor%

Also definiert dies MYVAR in einem MAKEFILE, wenn eine Umgebungsvariable namens MYVAR ebenfalls gesetzt ist.

    
___ answer21018092 ___

Interessant ist, dass %code% , um eine bereits in einem Makefile definierte Option zu überschreiben, die Option %code% unterstützt (ich beziehe mich auf GNU Make 3.82, aber wahrscheinlich auch andere Version). Beispiel:

Makefile:

%Vor%

Ausführen:

%Vor%

verwendet gcc-4.7 anstelle von gcc.

    
___ qstnhdr ___ Wie wird die Einrichtung der Umgebung in Makefile gehandhabt? ___ answer1561038 ___

Sie könnten ein weiteres Shell-Skript schreiben, das all diese Befehle ausführt und dann Variablenzuweisungen ausgibt, die make verwenden kann. Führen Sie das Skript aus, leiten Sie seine Ausgabe in eine Datei um und fügen Sie diese Datei dann in Ihr Makefile ein. Zum Beispiel:

Makefile:

%Vor%

test.sh

%Vor%

Das Ausführen von "make" in dem Verzeichnis, das dieses Makefile enthält, erzeugt:

%Vor%

make erstellt test.mk, indem es das Shell-Skript ausführt und schließt es ein. test.mk enthält die Ausgabe von test.sh und wird als Makefile geparst. Weitere Informationen finden Sie Ссылка .
Wir verwenden eine Variante davon in Mozillas client.mk, um Optionen in einer "mozconfig" -Datei zu definieren: Ссылка

    
___
ingyhere 11.02.2013 19:42
quelle
0

Interessant ist, dass make , um eine bereits in einem Makefile definierte Option zu überschreiben, die Option -e unterstützt (ich beziehe mich auf GNU Make 3.82, aber wahrscheinlich auch andere Version). Beispiel:

Makefile:

%Vor%

Ausführen:

%Vor%

verwendet gcc-4.7 anstelle von gcc.

    
user1240076 09.01.2014 10:50
quelle

Tags und Links