我希望SCons在我的src/
目录中为我生成一些源文件,然后将它们构建为我的构建目录build/variantX
中的任何其他源文件。
这是我的SCons文件:
import SCons
def my_builder(env, target, source):
# do stuff
pass
env = Environment()
env.VariantDir('build/variant1/', 'src', duplicate=0)
env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder)
env.Program('bin/test', [
'build/variant1/foobar.cc',
'build/variant1/test.cc',
])
此错误,显示以下消息:
考虑到我确实提供了构建目标
src/foobar.cc
需要找不到来源build/variant1/foobar.o
src/foobar.cc
的命令,我认为这是不正确的。
现在,我尝试了一些解决方法:
如果我用build/variant1/foobar.cc
替换程序中的src/foobar.cc
,它确实有效,但显然foobar.o
创建了src/
而不是build/variant1
< / p>
如果我用src/foobar.cc
替换Command中的build/variant1/foobar.cc
,它确实有用,但我希望代码在src/
中生成; (也是因为包含目录中的相对路径之类的东西不起作用,除非duplicate=1
)
如果duplicate=1
,我收到类似的错误消息,但这次提到了variant目录:
目标
build/variant1/foobar.cc
需要找不到来源build/variant1/foobar.o
有解决方法吗?这是SCons的限制/错误,还是我的基本误解?
答案 0 :(得分:2)
我建议在Command()和Program()调用之间创建一个显式依赖项,如下所示:
target1 = env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder)
target2 = env.Program('bin/test', [
'build/variant1/foobar.cc',
'build/variant1/test.cc',
])
Depends(target2, target1)
# This should work too
# Depends(target2, "src/foobar.cc")
或者你可以从Command()中指定目标作为Program()源的一部分,如下所示:
target1 = env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder)
env.Program('bin/test', [
target1,
'build/variant1/test.cc',
])
我没有对此进行测试,因此我不确定它如何与VariantDir()的调用一起使用
Here是关于使用SCons生成源代码的一些额外信息。
答案 1 :(得分:1)
我知道已经有一段时间了,但我碰到了同一堵墙。通过对“测试用例”的微小修改。和解决方案(见下文)代码是:
import SCons
env = Environment()
env.VariantDir('build/variant1/', 'src', duplicate=0)
env.Command('src/foobar.cc', 'src/foobar.input', action="cp src/foobar.input src/foobar.cc", shell=True )
env.Depends("build/variant1/foobar.cc", "src/foobar.cc")
env.Program('bin/test', [
'build/variant1/foobar.cc',
])
添加的&env.Depends&#39;关于&#39; variantdir-source&#39;生成源&#39;是关键。不知道为什么需要这样做。我会把它称为一个错误,但我想它的特色(基于你得到的错误反馈..)
干杯,