Unc*_*eiv 7 code-generation scons
我希望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',
])
Run Code Online (Sandbox Code Playgroud)
此错误与以下消息:
src/foobar.cc找不到来源,目标需要build/variant1/foobar.o
考虑到我确实提供了构建命令,我认为这是不正确的src/foobar.cc.
现在,我尝试了一些解决方法:
如果我build/variant1/foobar.cc在程序中替换src/foobar.cc它,它确实有效,但显然foobar.o是创建src/而不是build/variant1
如果我src/foobar.cc在命令中替换build/variant1/foobar.cc它,它确实有效,但我希望生成代码src/; (也因为包含目录中的相对路径之类的东西不起作用,除非duplicate=1)
如果duplicate=1,我得到一个类似的错误信息,但这次提到变种目录:
build/variant1/foobar.cc找不到来源,目标需要build/variant1/foobar.o
有没有解决的办法?这是SCons的限制/错误,还是我的方面存在根本的误解?
我建议在 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")
Run Code Online (Sandbox Code Playgroud)
或者您可以将 Command() 中的目标指定为 Program() 源的一部分,如下所示:
target1 = env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder)
env.Program('bin/test', [
target1,
'build/variant1/test.cc',
])
Run Code Online (Sandbox Code Playgroud)
我还没有测试过这个,所以我不确定它如何与 VariantDir() 的调用结合使用
以下是有关使用 SCons 生成源代码的一些额外信息。
| 归档时间: |
|
| 查看次数: |
1659 次 |
| 最近记录: |