【发布时间】:2016-12-19 18:05:42
【问题描述】:
我们从 scons 2.4.1 更新到 2.5.1 并突然出现如下几个错误: scons: *** 找到依赖循环: 内部错误:找不到节点的循环...
我认为该问题与我们尝试自动更新的版本文件有关,如果我们的 SCM 检测到对源文件的编辑。该过程的要点是我们维护一个具有#defines 的文件“version.cfg”。该文件被检入我们的 SCM。如果文件已经更新过一次,则在文件提交到 SCM 之前不会再次更新。然后使用该文件自动生成名为“kb_version.hh”的 C++ 头文件。
什么是循环依赖,如何消除它? (注意,无论是什么问题,在 scons 2.4.1 中都没有引起问题(只有当我们使用新版本 2.5.1 时,它才会检测到循环依赖)。
相关的scons sn-p如下:
SRCDIR = '../../src'
SRCS = [
'kb.cc',
]
SOURCE = [ os.path.join(SRCDIR, s) for s in SRCS ]
SCRIPT_VERSION_GEN = os.path.join(env['_ROOT'], 'kb/build/scripts/versionGen.sh')
SCRIPT_VERSION_UPD = os.path.join(env['_ROOT'], 'kb/build/scripts/versionUpdate.sh')
FILE_VERSION_CFG = 'version.cfg'
FILE_VERSION_HH = 'kb_version.hh'
scriptVerGen = env.File(SCRIPT_VERSION_GEN)
scriptVerUpd = env.File(SCRIPT_VERSION_UPD)
verCfg = env.File(os.path.join(SRCDIR, FILE_VERSION_CFG))
verHH = env.File(os.path.join(SRCDIR, FILE_VERSION_HH))
## this command detects for change in source files, then updates, when necessary, the source version.cfg
env.Command(
target = verCfg,
source = [ SOURCE, scriptVerUpd ],
action = [ scriptVerUpd.path + ' ' + env['BS_DIR_SRCROOT'] + '/kb/foo' + verCfg.srcnode().path, Copy(verCfg.path, verCfg.srcnode().path) ]
)
env.Command(
target = verHH,
source = [ verCfg, scriptVerGen ],
action = scriptVerGen.path + ' ' + verHH.path + ' ' + verCfg.path
)
【问题讨论】:
-
2.5 版增强了依赖项扫描机制,如果您阅读发行说明,您会看到可能会发现新依赖项的说明。在您的情况下,循环依赖似乎很可能是通过 SCons 中增强逻辑的新发现的依赖找到的。
标签: scons