2010-10-26 4 views
6

Ich habe ein C++ Projekt mit Scons erstellt. Zuerst habe ich nur die optimierte Version zu kompilieren, es funktioniert einwandfrei. Dann brauche ich auch eine Debug-Version, dann füge ich eine andere Umgebung hinzu. Hier ist der Scons Code:Wie verwende ich Scons, um gleiche Objekte in verschiedenen Umgebungen mit Glob zu kompilieren?

env = Environment() 

opt = env.Clone(CCFLAGS=['-pthread', '-O3', '-Wall']) 
opt_objs = opt.Glob('src/*.cpp') 
prog = opt.Program('prog', opt_objs) 

dbg = env.Clone(CCFLAGS=['-pthread', '-Wall', '-g', '-O0']) 
dbg_objs = dbg.Glob('src/*.cpp') 
dbg_prog = dbg.Program('dbg_prog', dbg_objs) 

Mit diesem Code, lief ich in die Irre:

scons: *** Two environments with different actions were specified for the same target: 
src/CometReadService.o 

Wie Sie sehen können, diese .o Dateien Ziele erstellt von opt.Glob ('src/. cpp ') und dbg.Glob (' src/ .cpp ') genau den gleichen Namen. Durch das Lesen des Dokuments Multiple Construction Environments weiß ich, dass ich das Objekt wie "opt.Object ('xxx-opt', 'xxx.c')" umbenennen kann, aber es ist Glob Object. Wie kann ich dieses Problem lösen?

Antwort

7

Die scons manual beschreibt, wie die Funktion VariantDir (oder Argument beim Hinzufügen von SConscripts) verwendet wird, um verschiedene Build-Verzeichnisse einzurichten. Im einfachsten Fall trennt VariantDir die Build-Ausgabe von den Quelldateien, kann aber auch dazu verwendet werden, die Build-Ausgabe verschiedener Umgebungen zu trennen.

env = Environment() 

opt = env.Clone(CCFLAGS=['-pthread', '-O3', '-Wall']) 
opt.VariantDir('gen-opt', 'src', duplicate=0) 
opt_objs = opt.Glob('gen-opt/*.cpp') 
prog = opt.Program('prog', opt_objs) 

dbg = env.Clone(CCFLAGS=['-pthread', '-Wall', '-g', '-O0']) 
dbg.VariantDir('gen-dbg', 'src', duplicate=0) 
dbg_objs = dbg.Glob('gen-dbg/*.cpp') 
dbg_prog = dbg.Program('dbg_prog', dbg_objs) 

Die Verwendung von VariantDir kann etwas experimentieren. Beachten Sie zum Beispiel, dass das Glob-Argument geändert wurde - ohne den Parameter duplicate=0 ist das Standardverhalten für VariantDir, die Quelldateien im Build-Verzeichnis zu duplizieren.

+1

schwer zu verstehen-Konzepte wie diese, mit Vornamen, die Sie nie die Idee haben, googeln für die Reduzierung der Macht der Scons ... Persönlich würde ich nur env.TemporaryObjectDir und alle meine nennen wollen .os wird dort gespeichert werden ... Statt dieser seltsamen Problemumgehung ... Aber wie auch immer, vielen Dank, ich habe ewig gesucht :-) –

+1

Das ist von Scons, der Idee von Globbing für Dateien an einem Ort völlig zurückgeblieben nicht existieren (besonders mit dem Duplikat = 0) ist massiv kontraintuitiv. Ich habe meinen Boss mit Scons verkauft, anstatt mit dem schrecklichen Makefile, das wir hatten, aber jetzt bereue ich es. –

Verwandte Themen