2009-07-02 7 views
8

Ich denke darüber nach, 10 für ein neues Projekt zu verwenden. Es sieht wirklich gut aus, obwohl ich VariantDir ziemlich verwirrend finde.Warum setzt SCons VariantDir() keine Ausgabe in das angegebene Verzeichnis?

Ich habe ein einfaches Projekt mit einer Handvoll C-Quelldateien in einem Verzeichnis, und ich möchte im "normalen" und im "Profil" -Modus erstellen - mit zwei verschiedenen Optionen auf gcc. Ich möchte, dass die Ausgaben in den normalen/und Profil/Verzeichnis gehen.

Zum Testen habe ich zurück zu nur einer einzigen Quelldatei, t.c, die eine main() enthält. Meine SConstruct Datei ist im selben Verzeichnis, und sieht wie folgt aus:

normal = DefaultEnvironment(tools=['mingw'], CCFLAGS = '-O2') 
normal.VariantDir('release', '.', duplicate=0) 
normal.Program('t', ['t.c']) 

#profile = normal.Clone(CCFLAGS='-O2 -pg', LINKFLAGS = '-pg') 
#profile.VariantDir('profile', '.', duplicate=0) 
#profile.Program('t', ['t.c']) 

Als ich scons laufen, ich bin es erwartet zu setzen und t.exe in Release /, aber es setzt sie im aktuellen Verzeichnis . Und ich kann es überhaupt nicht mit den 3 Profillinien unkommentiert ausführen - wenn ich das tue, bekomme ich diesen Fehler:

scons: *** Zwei Umgebungen mit verschiedenen Aktionen wurden für das gleiche Ziel angegeben: bis

Grundsätzlich bin ich mir nicht sicher, warum meine VariantDir() - Aufrufe Scons nicht sagen, die Ausgabe in das angegebene Ausgabeverzeichnis zu setzen, release.

(Ich habe ein wenig in den Dokumenten und Newsgroups gelesen, aber nichts, was diese Frage beantwortet. Die nächste, die ich gekommen bin, ist this page, die eine ähnliche Sache beschreibt, aber es umfasst ein separates src/Verzeichnis und zwei separate scons-Dateien, und Import/Export von Variablen zwischen ihnen. Das scheint nicht angenehm.)

Antwort

8

Ja, VariantDir ist in Scons verwirrend. Obwohl es nicht gut ausgeschrieben, können Sie beide SConstruct und SConscript im selben Verzeichnis, das aktuelle Verzeichnis als Quellverzeichnis mit

# SConstruct 
SConscript('SConscript', build_dir='build', src='.') 

und

# SConscript 
Program('main.c') 

Ich habe noch nie einen Weg, um zwei zu vermeiden, mit Dateien, während meine geistige Gesundheit zu halten versucht Variante dir zu verstehen :)

8

konnte ich Binärdateien in einem Build-Verzeichnis mit diesem Aufruf trennen:

# SConstruct 
SConscript('SConscript', variant_dir='build', src_dir='..', duplicate=0) 

Wenn Sie Binärdateien in ein Verzeichnis zwei Ebenen unten setzen wollen, dies tun:

# SConstruct 
SConscript('SConscript', variant_dir='build/release', src_dir='../..', duplicate=0) 

Grundsätzlich bieten die src_dir Parameter als Pfad von Ihrem Build-Verzeichnis zurück zu Ihrem Quellverzeichnis.

3

Wie http://www.scons.org/wiki/VariantDir%28%29 sagte

Note that when you're not using an SConscript file in the src subdirectory, you must actually specify that the program must be built from the build/hello.c file that SCons will duplicate in the build subdirectory.

VariantDir('release','.',duplicate=0) 
env=Environment() 
env.Program('release/t',['release/t.c']) 

, wenn ich es mit scons auf Linux laufen.

scons -u . 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
scons: building associated VariantDir targets: release 
gcc -o release/t.o -c t.c 
gcc -o release/t release/t.o 
scons: done building targets. 

Ich denke, es auch auf Win32

+0

Ja funktionieren würde, das ist der einzig relevante Punkt, wenn nicht SConscript verwendet wird. –

Verwandte Themen