2011-09-12 6 views
5

Sto cercando di ottenere da SCons la copia di un progetto Makefile dalla directory di origine alla directory di build ed eseguire alcuni comandi per produrre libmoo.a, ma sto correndo in un errore di ciclo delle dipendenze. Dettagli seguono:SCons: cicli di dipendenza?

./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) 

Errore durante l'esecuzione 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 

provato anche senza l'utilizzo di .abspath, ma che shouldn non importa, vero?

non vedo alcun cicli:

  • build/moo2/libmoo.a richiede costruire/moo2/Makefile
  • build/moo2/Makefile richiede build/moo2
  • build/Moo2 richiede (source /) moo

In che modo gli scons vedono un ciclo? Sembra che build/moo2/Makefile dipenda da build/moo2/libmoo.a, che non è quello che intendevo specificare.

Eventuali suggerimenti relativi sono i benvenuti :-)

risposta

5

Non c'è bisogno per l'env.Dir ('moo'). Abspath in qualsiasi punto della SConscript. In modo che cambiare 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) 

Ma che produce ancora lo stesso errore:

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

Allora perché? SCons rende automaticamente una directory dipendente da tutti i file contenuti all'interno. Vedere la riga con il commento "# Guarda qui". Hai aggiunto una dipendenza moo2/Makefile ora dipende da moo2. moo2 dipende da tutti i suoi contenuti per impostazione predefinita, e quindi dal tuo ciclo.

Quindi come lo ripariamo?

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) 

Sono passato dall'uso di Copy() a env.Install(). Poiché Copy non è collegato all'oggetto build Environment(), non sarà a conoscenza della dir della variante. Install() e Copy() sono funzionalmente equivalenti, con env.Install() che è env aware. Inoltre ho copiato/a seconda di tutti i file nella directory, piuttosto che la directory stessa.

Ora diamo una prova che:

/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. 

Annotare il "--tree = potare" questo flag avrà SCons stampano l'albero delle dipendenze e potare duplicazioni nella struttura (quindi se un 2 file dipendono sullo stesso albero di file, lo vedrai solo una volta)

+0

Grazie per il post. Copia semplicemente alcuni file nella mia variante, un file SConscript con due comandi ha funzionato per me: Import ('env') env.Install ('', Glob ('# kernel/*. Cl')) – NoahR