2009-07-02 10 views
8

Estoy pensando en usar SCons para un nuevo proyecto. Se ve muy bien, aunque estoy encontrando VariantDir bastante confuso.¿Por qué SCons VariantDir() no pone salida en el directorio dado?

Tengo un proyecto simple con un puñado de archivos fuente C en un directorio, y quiero construir en modo "normal" y en modo "perfil" - con dos conjuntos diferentes de opciones para gcc. Quiero que las salidas vayan en los directorios normal/y perfil /, respectivamente.

Para las pruebas, he reducido a un solo archivo fuente, t.c, que tiene un main() en él. Mi archivo SConstruct está en el mismo directorio, y se ve así:

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

Cuando corro scons, estoy esperando que se ponga a t.exe y en la salida /, pero los pone en el directorio actual . Y no puedo ejecutarlo en absoluto con las 3 líneas de perfil sin comentarios: si lo hago, obtengo este error:

scons: *** Se especificaron dos entornos con diferentes acciones para el mismo objetivo: a

Básicamente, no estoy seguro de por qué mis llamadas a VariantDir() no indican a scons que coloque la salida en el directorio de salida especificado, release.

(He leído bastante en los documentos y grupos de noticias, pero nada que responda a esta pregunta. Lo más parecido que he venido es this page, que describe algo similar, pero implica un directorio src/independiente y dos archivos Scons separados, e importar/exportar variables entre ellos. Eso no parece agradable.)

Respuesta

8

Sí, VariantDir es confuso en scons. Aunque no se ha anunciado, se puede poner tanto SConstruct y SConscript en el mismo directorio, utilizando el directorio actual como el directorio de origen

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

y

# SConscript 
Program('main.c') 

nunca he encontrado una manera de evitar el uso de dos archivos, manteniendo la cordura tratando de entender variante dir :)

8

yo era capaz de separar los binarios en un directorio de construcción utilizando esta llamada:

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

Si usted quiere poner los binarios en un directorio dos niveles más abajo, hacer esto:

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

Básicamente, proporcionará el parámetro src_dir como una ruta desde su directorio de construcción de nuevo a su directorio de origen.

3

Como se ha dicho http://www.scons.org/wiki/VariantDir%28%29,

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

cuando corro con scons en 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. 

supongo que también funcionaría en Win32

+0

Sí, ese es el único punto relevante cuando no se utiliza SConscript. –

Cuestiones relacionadas