2010-09-15 6 views
11

He intentado obtener scons para generar archivos exe, obj, lib y dll en un directorio de compilación específico.Salida de Force Scons (exe, obj, lib & dll) al directorio de compilación específico

Mi estructura de archivos es el siguiente:

/projectdir 
    /build 
    /bin 
    /obj 
    /source 
    /subdirs 
    /.. 
    SConstruct 

Básicamente, lo que me pasa ahora es mi directorio de origen se está contaminada con archivos OBJ. Prefiero tenerlo todo en un solo lugar.

archivo La SConstruct se ve así:

env.VariantDir('build', 'source', duplicate = 0) 
env.Program('Hierarchy', source = ['source/sconstest.cpp', 'source/utils/IntUtil.cpp']) 

He leído algunas otras preguntas similares en este sitio, pero havn't encontrado una buena solución todavía.

Gracias

Respuesta

8

La manera más fácil que he encontrado es usar 2 archivos, un archivo SConstruct y un SConscript por separado.

En el SConstruct sólo tiene que llamar el otro archivo y especificar el directorio para la salida de construcción:

# content SConstruct 
SConscript('main.scons', variant_dir='build', duplicate=0) 

Luego, en main.scons '' que haces la carne de su construcción. Puede olvidarse de directorios variantes en este archivo.

# content of main.scons 
env = Environment() 
env.Program('Hierarchy', 
      source = ['source/sconstest.cpp', 'source/utils/IntUtil.cpp']) 
+0

Gracias, eso funcionó. Aunque solo tener un archivo es mucho más limpio. ¡Creo que tendré que vivir con él! –

3

Los VariantDir (también descrito en el user guide) le dice a scons a poner los archivos generados en un directorio independiente. En versiones anteriores de scons, esta función se llamaba BuildDir.

Es posible que también desee leer sobre cómo evitar la duplicación del directorio de origen (descrito tanto en la guía del usuario como en la wiki).

+1

sí, eso es lo que he intentado: env.VariantDir ('construir', 'fuente', duplicar = 0) env.Program (fuente = [ 'fuente/sconstest.cpp', 'fuente 'jerarquía' /utils/IntUtil.cpp ']) y esto no tiene ningún efecto en absoluto :( –

+0

El archivo para compilar no debe estar en la fuente, sino en la carpeta de compilación: 'env.Program (' Hierarchy ', source = [' build/sconstest.cpp ',' build/utils/IntUtil.cpp ']) ' – Phong

5

No es tan difícil de conseguir VariantDir trabajar con un solo archivo SConstruct (para un proyecto pequeño), pero es muy confuso ya que la configuración es diferente para el caso de uso de un archivo y dos archivos.

Sólo SConstruct:

env = Environment() 
env.VariantDir('build', 'src', duplicate=0) 
files = Glob('build\*.c') 
env.Program("build\program", files) 

Observe cómo los archivos de origen se encuentran en .\src pero .\build se especifica como la ubicación. La salida también debe estar "prefijada" con .\build; de lo contrario, el programa compilado residirá en el directorio del archivo SConstruct.

Cuando ejecuta la secuencia de comandos SCons compilará los archivos *.c desde .\src y colocará los objetos resultantes en .\build.

No es de extrañar que cambien el nombre de BuildDir a VariantDir para intentar evitar la confusión (sin mucho éxito).

1

Estaba usando un método de dos archivos como la respuesta de richq, pero aunque los productos de compilación final (libs, programas) se iban al directorio de variante correcto, los archivos de objetos seguían yendo al directorio de origen.

La solución resultó ser agrupar los archivos fuente por ruta relativa en lugar de absoluta. No tengo ni idea de porqué.

Mi segundo archivo scons se veía originalmente así. Observe globbing por ruta absoluta: cuando escribí esto por primera vez, no me di cuenta de que las rutas serían automáticamente relativas al archivo scons.

import os, inspect 
env = Environment() 
packageDir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 
src = Glob(os.path.join(packageDir, "src/*/*.c*"), strings=True, source=True) 
env.Program('Foo', source = src) 

Y eso dio como resultado * .obj terminando bajo src/y el programa bajo mi directorio de variante. Cuando me cambié a la siguiente, los archivos de objetos también fueron a la variante dir:

env = Environment() 
src = Glob("src/*/*.c*", strings=True, source=True) 
env.Program('Foo', source = src) 

El uso de rutas absolutas es probablemente un error novato - Soy relativamente nuevo en ambos scons y Python - pero pensé' d compartirlo en caso de que alguien más tenga el mismo problema frustrante.

+0

El motivo por el que los archivos intermedios estaban terminando en el directorio de origen porque los estaba pidiendo desde allí. Si los solicitó desde el directorio de variantes, o un directorio relativo, entonces S Contras poblará las fuentes en la variante y luego producirá la salida allí también. (por supuesto, si le preguntas a variant dir que no copie, entonces no copiará las fuentes allí, sino que generará los archivos de salida en el directorio variante) – bdbaddog

+0

Aha, eso tiene más sentido. Gracias por la pista! – Soleil

Cuestiones relacionadas