SCons: циклы зависимости? - PullRequest
       9

SCons: циклы зависимости?

6 голосов
/ 12 сентября 2011

Я пытаюсь заставить SCons скопировать проект Makefile из исходного каталога в каталог сборки и запустить несколько команд для создания libmoo.a, но я сталкиваюсь с ошибкой цикла зависимости. Подробности следуют:

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

Ошибка запуска сконов:

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

Также пробовал без использования .abspath, но это не должно иметь значения, верно?

Я не вижу циклов:

  • build / moo2 / libmoo.a требует build / moo2 / Makefile
  • build / moo2 / Makefile требует build / moo2
  • build / moo2 требует (источник /) moo

Как сыновья видят цикл? Кажется, кажется, что build / moo2 / Makefile зависит от build / moo2 / libmoo.a, а это не то, что я намеревался указать.

Любые связанные предложения также приветствуются: -)

1 Ответ

5 голосов
/ 16 сентября 2011

Нет необходимости в 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 файла зависят от одного и того же дерева файлов, вы увидите его только один раз)

...