SCons代码生成和VariantDir

时间:2013-05-14 14:09:00

标签: 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',
    ])

此错误,显示以下消息:

  

目标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的限制/错误,还是我的基本误解?

2 个答案:

答案 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;是关键。不知道为什么需要这样做。我会把它称为一个错误,但我想它的特色(基于你得到的错误反馈..)

干杯,