2009-07-02 3 views
8

Zastanawiam się nad użyciem SCons dla nowego projektu. Wygląda naprawdę dobrze, choć uważam, że jest to bardzo mylące.Dlaczego program SCons VariantDir() nie umieszcza danych wyjściowych w podanym katalogu?

Mam prosty projekt z garścią plików źródłowych C w jednym katalogu i chcę budować w "normalnym" iw "profilu" trybie - z dwoma różnymi zestawami opcji do gcc. Chcę, aby wyjścia przechodziły odpowiednio w normalny/i profil/katalogi.

Do testowania, cofnąłem się do tylko jednego pliku źródłowego, t.c, który ma main() w nim. Mój plik SConstruct jest w tym samym katalogu, a wygląda to tak:

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']) 

Kiedy biegnę scons, ja spodziewałem się położyć do t.exe do zwalniania /, ale umieszcza je w bieżącym katalogu . I nie mogę go uruchomić w ogóle, z pominięciem 3 linii profilu - jeśli to zrobię, otrzymam ten błąd:

scons: *** Dla tego samego celu określono dwa środowiska z różnymi akcjami: na

W zasadzie nie jestem pewien, dlaczego moje wywołania VariantDir() nie mówią scons, aby umieścić dane wyjściowe w określonym katalogu wyjściowym, release.

(Czytałem trochę w dokumentach i grupach dyskusyjnych, ale nic, co by odpowiadało na to pytanie. Najbliższy, do którego przyszedłem, to this page, który opisuje podobną rzecz, ale wiąże się z oddzielnym katalogiem src/i dwoma osobne pliki scons i importowanie/eksportowanie zmiennych między nimi.) To nie wydaje się przyjemne.)

Odpowiedz

8

Tak, VariantDir jest mylący w scons. Chociaż nie jest dobrze reklamowane, można umieścić zarówno SConstruct i SConscript w tym samym katalogu, korzystając z aktualnego katalogu jako katalogu źródłowego

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

i

# SConscript 
Program('main.c') 

nigdy nie znaleźli sposób, aby uniknąć stosując dwa pliki zachowując moje zdrowie psychiczne próbując zrozumieć wariantowej dir :)

8

udało mi się oddzielić pliki binarne w katalogu build przy użyciu tego połączenia:

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

Jeśli chcesz umieścić pliki binarne w katalogu dwa poziomy niżej, to zrobić:

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

Zasadniczo dostarczyć parametr src_dir jako ścieżkę z katalogu build z powrotem do katalogu źródłowego.

3

Jak http://www.scons.org/wiki/VariantDir%28%29 powiedział

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']) 

gdy uruchomię go z scons Linux.

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. 

myślę, że to też działa na Win32

+0

Tak, jest to jedyny istotny moment, kiedy nie jest używany SConscript. –