据我了解,您只想在任何源文件更改时生成 version.cc,并且您只想在 version.cc 更改或任何库源文件更改时构建库。也就是说,将 version.cc 视为该库的源文件之一。
如果是这种情况,您可以考虑 2 组依赖项,这两组依赖项都将由 SCons 依赖项检查控制。
目前尚不清楚 version.cc 生成由什么组成,但我们假设 python 函数GenerateVersionCode() 会执行此操作:生成 version.cc,但不会有任何依赖项检查相关逻辑。
这是 SConscript 代码:
def GenerateVersionCode(env, target, source):
# fill in generation code here
# The version.cc checking
env.Command(target='version.cc',
source=['a.cc', 'b.cc'],
action=GenerateVersionCode)
# The library
env.Library(target='test', source=['version.cc', 'a.cc', 'b.cc'])
这应该不是必需的,但可以通过使用 SCons Depends() 函数显式设置从 Library 目标到 version.cc 目标的依赖关系来更进一步。
这是我构建时得到的输出,我没有使用GenerateVersionCode()函数,而是使用了一个简单的shell脚本versionGen.sh,从而将对Command()的调用更改为:
env.Command(target='version.cc',
source=['a.cc', 'b.cc'],
action='./versionGen.sh')
这是第一个构建:
> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o a.o -c a.cc
g++ -o b.o -c b.cc
./versionGen.sh
g++ -o version.o -c version.cc
ar rc libtest.a version.o a.o b.o
ranlib libtest.a
scons: done building targets.
然后,在没有更改任何内容的情况下,我再次构建,但它什么也没做:
> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
scons: done building targets.
然后,我修改a.cc,并再次构建,它生成了新版本的version.cc:
> vi a.cc
> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o a.o -c a.cc
./versionGen.sh
g++ -o version.o -c version.cc
ar rc libtest.a version.o a.o b.o
ranlib libtest.a
scons: done building targets.