2010-09-16 25 views
5

Ich habe ein Projekt, das ich mit SCons (und MinGW/gcc abhängig von der Plattform) erstellen. Dieses Projekt hängt von mehreren anderen Bibliotheken ab (wir nennen sie libfoo und libbar), die an verschiedenen Orten für verschiedene Benutzer installiert werden können.SCons Konfigurationsdatei und Standardwerte

Derzeit enthält meine SConstruct Datei einen hartcodierten Pfad zu diesen Bibliotheken (sagen wir mal so etwas wie: C:\libfoo).

Nun, würde Ich mag eine Konfigurationsoption meiner SConstruct Datei hinzufügen, so dass ein Benutzer, der libfoo an einem anderen Ort installiert ist (sagen wir C:\custom_path\libfoo) so etwas wie tun:

> scons --configure --libfoo-prefix=C:\custom_path\libfoo 

Oder:

> scons --configure 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
### Environment configuration ### 
Please enter location of 'libfoo' ("C:\libfoo"): C:\custom_path\libfoo 
Please enter location of 'libbar' ("C:\libfoo"): C:\custom_path\libbar 
### Configuration over ### 

Einmal ausgewählt, sollten diese Konfigurationsoptionen in eine Datei geschrieben und jedes Mal neu eingelesen werden, wenn scons ausgeführt wird.

Bietet scons einen solchen Mechanismus? Wie würde ich dieses Verhalten erreichen? Ich beherrsche Python nicht wirklich, daher sind selbst offensichtliche (aber vollständige) Lösungen willkommen.

Danke.

Antwort

5

SCons hat eine Funktion namens "Variables". Sie können es so einrichten, dass es sehr einfach von Befehlszeilenargumentvariablen liest. Also in Ihrem Fall würden Sie so etwas wie dies von der Kommandozeile tun:

scons LIBFOO=C:\custom_path\libfoo 

... und die Variable würde zwischen den Läufen in Erinnerung bleiben. Also das nächste Mal, wenn Sie einfach scons ausführen und es den vorherigen Wert von LIBFOO verwendet.

In Code verwenden Sie es wie folgt:

# read variables from the cache, a user's custom.py file or command line 
# arguments 
var = Variables(['variables.cache', 'custom.py'], ARGUMENTS) 
# add a path variable 
var.AddVariables(PathVariable('LIBFOO', 
     'where the foo library is installed', 
     r'C:\default\libfoo', PathVariable.PathIsDir)) 

env = Environment(variables=var) 
env.Program('test', 'main.c', LIBPATH='$LIBFOO') 

# save variables to a file 
var.Save('variables.cache', env) 

Wenn Sie wirklich verwenden wollen „-“ Stil Optionen, die Sie dann mit der AddOption Funktion des oben kombinieren könnten, aber es ist komplizierter.

This SO question behandelt die Probleme beim Abrufen von Werten aus dem Variablen-Objekt, ohne sie durch eine Umgebung zu leiten.

+0

Danke, das scheint den Trick zu machen;) Gibt es einen anderen Weg, um den Wert einer Variablen zu erhalten? So etwas wie 'print var.getVariable ('LIBFOO')' '? – ereOn

+0

@ereOn Ich habe die Dokumentation durchforstet, aber da scheint es keinen Weg zu geben. Ziemlich asymmetrisch. Sie müssen die Variablen in eine Umgebung schieben und vorlesen. Ich werde den Beitrag aktualisieren, wenn ich es jemals herausfinden werde. – richq