Нет необходимости в env.Dir ('moo'). Abspath где-нибудь в вашем SConscript. Так что это изменится на:
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)
Но это все равно приводит к той же ошибке:
scons: *** Found dependency cycle(s):
build/moo2/Makefile -> build/moo2 -> build/moo2/Makefile
build/moo2/libmoo.a -> build/moo2/Makefile -> build/moo2/libmoo.a
Так почему же это?
SCons автоматически делает каталог зависимым от всех файлов, содержащихся в нем.
Смотрите строку с комментарием "# Look Here". Вы добавили зависимость moo2 / Makefile теперь зависит от moo2. По умолчанию moo2 зависит от всего его содержимого и, следовательно, от вашего цикла.
Так как же это исправить?
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)
Я перешел от использования Copy () к env.Install (). Поскольку Copy не прикреплен к объекту build Environment (), он не будет знать о варианте dir. Install () и Copy () функционально эквивалентны, env.Install () осведомлен об env.
Кроме того, он копирует / зависит от всех файлов в каталоге, а не от самого каталога.
Теперь давайте попробуем:
/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.
Обратите внимание, что "--tree = prune" этот флаг будет заставлять SCons распечатывать дерево зависимостей и удалять дубликаты в дереве (поэтому, если 2 файла зависят от одного и того же дерева файлов, вы увидите его только один раз)