SCons代码生成和VariantDir

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的限制/错误,还是我的方面存在根本的误解?

Bra*_*ady 3

我建议在 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 生成源代码的一些额外信息。