2011-09-12 12 views
5

Próbuję uzyskać SCons do skopiowania projektu Makefile z katalogu źródłowego do katalogu kompilacji i uruchomienia niektórych poleceń w celu utworzenia biblioteki libmoo.a, ale pojawia się błąd cyklu zależności. Szczegóły poniżej:SCONS: Cykle zależności?

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

Błąd uruchomiony 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 

też próbował bez korzystania .abspath, ale że powinnam ma znaczenie, prawda?

nie widzę żadnych cykli:

  • build/MoO2/libmoo.a wymaga budowania/MoO2/Makefile
  • build/MoO2/Makefile wymaga build/MoO2
  • build/MoO2 wymaga (źródło /) moo

W jaki sposób scons widzą cykl? Wydaje się, że build/moo2/Makefile zależy od build/moo2/libmoo.a, co nie jest tym, co zamierzałem określić.

wszelkich powiązanych sugestie są mile widziane :-)

Odpowiedz

5

Nie ma potrzeby, aby env.Dir ('moo'). Abspath gdziekolwiek w SConscript. Tak, by go zmienić na:

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) 

Ale to wciąż daje ten sam błąd:

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

tak to dlaczego? SCons automatycznie tworzy katalog zależny od wszystkich zawartych w nim plików. Zobacz wiersz z komentarzem "# Look Here". Dodałeś zależność moo2/Makefile teraz zależy od moo2. moo2 domyślnie zależy od całej jego zawartości, a tym samym od twojego cyklu.

Jak to naprawić?

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) 

Zmieniłem z użycia Copy() na env.Install(). Ponieważ Copy nie jest dołączony do zbudowanego obiektu Environment(), nie będzie wiedział o wariancie dir. Install() i Copy() są funkcjonalnie równoważne, przy czym env.Install() jest świadomym istnienia. Dodatkowo mam to kopiowanie/w zależności od wszystkich plików w katalogu, a nie sam katalog.

Teraz dajmy że Spróbuj:

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

zanotować „--tree = przycinać” ta flaga będzie miał SCons wydrukować drzewa zależności i przycinać powielania w drzewie (więc jeśli zależy 2 pliki na tym samym drzewie plików, zobaczysz je tylko raz)

+0

Dzięki za wpis. Po prostu skopiuj niektóre pliki do mojego katalogu variant, plik SConscript z dwoma komendami pracował dla mnie: Import ('env') env.Install ('', Glob ('# jądra/*. Cl')) – NoahR

Powiązane problemy