Legen Sie ein temporäres Umfeld ($PFAD)
Kann ich fallen in ein X-Y-problem mit dieser Frage, und ich möchte Sie ermutigen, Jungs, mich zu korrigieren, wenn ich falsch bin.
Ich würde gerne konfigurieren einer toolchain-Umgebung arbeiten können, die auf verschiedenen Plattform-und andere compiler-version. Ich anfangs schrieb ein langes Perl-Skript generieren, dass die Konfiguration Makefile enthalten nur Variablen. Ich wollte zu KÜSSEN, damit ich nicht zu schreiben, komplexe Dinge automake oder autoconf. Zudem wollte ich den Umbau-Prozess sehr schnell. In meinem Fall, dass meine home made ./configure
tut alles, was in weniger als 1 Sekunde. Ich bin sehr glücklich damit.
Aber ich fülle die ich verwenden kann, ein besserer Ansatz ist die Verwendung von environment-Variablen. Statt zu schreiben ein Makefile mit den Variablen kann ich die aktuelle shell-Umgebung direkt. Zum Beispiel:
export cc=gcc
Leider einige Variablen sind bereits erklärt im $PATH. Die Lösung ist das hinzufügen der neuen $PATH in die front des anderen:
export PATH=/new/toolchain/path:$PATH
echo $PATH
/new/toolchain/path:/old/toolchain/path:/usr/bin:/bin...
Fülle ich aus, das ist hässlich ich würde, wie um die alte Weg, bevor Sie die neue.
Schließen:
- Ist es besser, auf die Umwelt, anstatt der custom makefiles um eine build-Konfiguration?
- Wie man richtig passen Sie die vorhandenen Umgebungsvariablen?
- Haben Sie versucht, zu verwenden, high-level-build-Systeme wie SCons, CMake, autoconf?
- Gut, CMake verwendet machen und ich will, dass die Dinge so einfach wie möglich. So machen wäre besser in meinem Fall. Autoconf scheint ziemlich Komplex und ich sollte wirklich finden eine gute Anleitung. Ich bin immer noch mit ihm verloren. Ich sollte wirklich nehmen Sie einen Blick auf SCons. Ich weiß es nicht.
- Nur eine Anmerkung: Der export-Befehl, den Sie geschrieben hat nicht dazu führen, den Pfad, den Sie geschrieben (fehlende
$
- Zeichen). - Recht, ich habe es behoben.
Rake
odertup
sind ziemlich gut. Stellen Sie saugt für nichts, aber die meisten grundlegenden Sachen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich mehrere Variablen zu setzen, Schreibe ich einen wrapper Skript, welches ich dann als Präfix für den Befehl, den ich ändern möchte. Dass lässt mich mit dem prefix entweder
make
oderIch benutze Wrapper für
clang
aus, um dieCC
variable, so dass configure-Skripte "sehen" Sie, wie die gewählten compiler),C
versusen_US
versusen_US.UTF-8
usw.cron
.Jeder der Wrapper macht, was ist notwendig, um die richtige
PATH
,LD_LIBRARY_PATH
und ähnliche Variablen.Zum Beispiel, schrieb ich diese ad-hoc-Skript vor etwa zehn Jahren, um einen test mit einer lokalen build von python:
und verwendet es als
with-python-2.4.2
myscript.Einige Wrapper rufen Sie einfach ein anderes script.
Ich zum Beispiel verwende diese Hülle um das configure script die setup-Variablen für die cross-Kompilierung:
wo
choose-mingw32
undcfg-normal
sind Skripts, die (a) finden Sie die verfügbaren target-name für den cross-compiler und (b) stellen Sie zusätzliche Optionen für das configure-Skript.Andere können darauf hindeuten shell Aliase oder Funktionen. Ich glaube nicht, verwenden diese für diesen Zweck, weil meine Befehlszeilen-shell ist in der Regel
tcsh
, während ich führe diese Befehle aus (a) auch andere shell-scripts, (b) directory editor, oder (c) text-editor. Diese verwenden die POSIX-shell (außer natürlich, für Skripte, die spezielle Funktionen), erstellen von Aliassen oder Funktionen kaum nutzen.Können Sie eine individuelle Umgebung für einen bestimmten Befehl Aufruf:
Ich finde das sauberer, als das zu tun:
sei denn, Sie sind in einem wrapper-Skript und vielleicht sogar dann mit
VAR1=val1 VAR2=val2 VAR3=val3 make
derVAR
Variablen wird das sein, was Sie waren, bevor das make-Aufruf (einschließlich, aber nicht beschränkt auf unexported und nicht existent).Langen Linien ist ein nicht-Problem, Sie können immer split über mehrere Zeilen:
Können Sie Umgebungsvariablen einrichten, wie dies für jeden Unix-Befehl.
Die shell wird alle es einrichten.
Einige Anwendungen (wie
make
oderrake
) wird ändern Ihre Umgebung, basierend auf Argumenten, die Aussehen wie die Variablen-Definitionen (siehe prodev_paris Antwort), aber das hängt von der Anwendung ab.Die besten Praxis für build-Systeme ist nicht abhängig von Umgebungsvariablen an alle. So, dass nichts mehr ist notwendig, um erstellen Sie Ihr Projekt als:
Dass das setzen von Umgebungsvariablen ist fehleranfällig und kann zu inkonsistenten baut.
Können Sie nicht anpassen müssen, um diese überhaupt. Durch die Verwendung von vollständigen Pfade zu den tools wie Compiler Sie entwirren Sie Ihre build-system von der Umwelt.
./configure
wenn das basecode ist nur ein paar C-Dateien../configure
ein paar mal, speichern Sie die Ergebnisse und stellen Sie ein shell-Skript aufruftmake
mit einer bestimmten config, z.B.make-arm-v7.sh
,make-arv-v8.sh
etc.. Bauen, out-of-tree, so dass Sie nicht haben, zu reinigen das build-Verzeichnis beim wechseln zwischen verschiedenen Ziel-Architekturen.Wie wir alle wissen, ist es vorzuziehen, um die Integration von standard-tools für eine Aufgabe wie den Aufbau Ihrer Produkte erstellen, anstatt Ihren eigenen Ansatz. Der Aufwand in der Regel zahlt sich langfristig aus.
Diesem wird gesagt, ist ein einfacher Ansatz wäre zu definieren, die verschiedene Umwelt-Dateien (z.B.
build-phone.env
) Einstellung ArbeitsverzeichnisPATH
,CC
etc. für Ihre unterschiedlichen Produkte und die Quelle Ihrer Umwelt-Dateien interaktiv auf Nachfrage:Denke ich, können Sie die Vorteile von direkten Variablen-definition, wenn Sie anrufen, Ihr makefile, wie in der folgenden:
Wo
FOO
ist die variable, die Sie wollen, zu setzen mit Wertbar
.Beachten Sie, dass es in diesem Fall Vorrang vor Umwelt-definition! So können Sie problemlos überschreiben Sie Ihre PATH-variable...
Bitte haben Sie einen Blick auf dieses detail Thema für mehr info: https://stackoverflow.com/a/2826178/4716013
config.mak
verwendet, die von der Haupt-Makefile.