2011-09-12 10 views
5

Estoy tratando de hacer que SCons copie un proyecto de Makefile desde el directorio de origen al directorio de compilación y ejecute algunos comandos para producir libmoo.a, pero me estoy encontrando con un error de ciclo de dependencia. Detalles siguen:SCons: Ciclos de dependencia?

./SConstruct:

env = Environment() 
Export('env') 

dirs = ['.'] 

variant_dir = 'build' 

for dir in dirs: 
     SConscript(dir + '/' + 'SConscript', variant_dir=variant_dir + '/' + dir, duplicate=0) 

./SConscript:

import os 
Import('env') 

env.Command(env.Dir('moo2').abspath, env.Dir('#moo').abspath, ["echo copying moo to the build dir", Copy("$TARGET", "$SOURCE")]) 

env.Command(env.Dir('moo2/Makefile').abspath, env.Dir('moo2').abspath, 'echo would run moo2.configure') 

moolib = env.Command(env.Dir('moo2/libmoo.a').abspath, env.Dir('moo2/Makefile').abspath, 'echo would run make') 

Default(moolib) 

Error al ejecutar scons:

scons: *** Found dependency cycle(s): 
    build/moo2/Makefile -> build/moo2 -> build/moo2/Makefile 
    build/moo2/libmoo.a -> build/moo2 -> build/moo2/Makefile -> build/moo2/libmoo.a 

también trató sin utilizar .abspath, pero que no deben no importa, ¿verdad?

no veo ningún ciclos:

  • acumulación/moo2/libmoo.a requiere construir/moo2/Makefile
  • acumulación/moo2/Makefile requiere la acumulación/moo2
  • acumulación/moo2 requiere (fuente /) moo

¿Cómo está scons seeing a cycle? Parece pensar que build/moo2/Makefile depende de build/moo2/libmoo.a, que no es lo que pretendía especificar.

Cualquier sugerencia relacionados también son bienvenidos :-)

Respuesta

5

No hay necesidad de que el env.Dir ('moo'). Abspath cualquier lugar de su SConscript. Por lo que sería cambiarlo a:

Import('env') 
env.Command('moo2', '#moo', ["echo copying moo to the build dir", Copy("$TARGET", "$SOURCE")]) 
env.Command('moo2/Makefile', 'moo2', 'echo would run moo2.configure') # Look Here 
moolib = env.Command('moo2/libmoo.a', 'moo2/Makefile', 'echo would run make') 
Default(moolib) 

Pero que todavía da el mismo error:

scons: *** Found dependency cycle(s): 
build/moo2/Makefile -> build/moo2 -> build/moo2/Makefile 
build/moo2/libmoo.a -> build/moo2/Makefile -> build/moo2/libmoo.a 

¿Por qué es eso? SCons hace que un directorio dependa automáticamente de todos los archivos que contiene. Vea la línea con el comentario "# Look Here". Has agregado una dependencia moo2/Makefile ahora depende de moo2. moo2 depende de todos sus contenidos por defecto, y por lo tanto de su ciclo.

Entonces, ¿cómo solucionarlo?

Import('env') 
env.Install('moo2',Glob('#moo/*')) 
env.Command('moo2/Makefile', env.Glob('moo2/*'), 'echo would run moo2.configure') 
moolib = env.Command('moo2/libmoo.a', 'moo2/Makefile', 'echo would run make') 
Default(moolib) 

He cambiado desde el uso de Copiar() a env.Install(). Como Copy no está adjuntado al objeto build Environment(), no sabrá sobre el directorio variante. Install() y Copy() son funcionalmente equivalentes, con env.Install() como env. Además lo tengo copiando/dependiendo de todos los archivos en el directorio, en lugar del directorio en sí.

Ahora vamos a darle una oportunidad de que:

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python /Users/bdbaddog/devel/scons/trunk/bootstrap/src/script/scons.py --tree=prune 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
Install file: "moo/abc.c" as "build/moo2/abc.c" 
Install file: "moo/configure" as "build/moo2/configure" 
Install file: "moo/def.c" as "build/moo2/def.c" 
echo would run moo2.configure 
would run moo2.configure 
echo would run make 
would run make 
+-build/moo2/libmoo.a 
    +-build/moo2/Makefile 
    | +-build/moo2/abc.c 
    | | +-moo/abc.c 
    | +-build/moo2/configure 
    | | +-moo/configure 
    | +-build/moo2/def.c 
    | | +-moo/def.c 
    | +-/bin/echo 
    +-/bin/echo 
scons: done building targets. 

Nota del "--tree = podar" esta bandera tendrá SCons imprimen el árbol de dependencias y podar las duplicaciones en el árbol (por lo que si un 2 archivos dependen en el mismo árbol de archivos, solo lo verás una vez)

+0

Gracias por la publicación. Demasiado simplemente copie algunos archivos en mi directorio de variantes, un archivo SConscript con dos comandos trabajados para mí: Importar ('env') env.Install ('', Glob ('# kernels/*. Cl')) – NoahR

Cuestiones relacionadas