【问题标题】:SCons: Builder with $TARGET not specified creates builder output in src dir instead of variant dirSCons:未指定 $TARGET 的构建器在 src 目录而不是变体目录中创建构建器输出
【发布时间】:2011-05-09 22:06:06
【问题描述】:

我有一个看起来像这样的构建器:

sFooBuilder = Builder( action = os.path.join(rBuildPath, 'foo_binary') + ' $SOURCE',        
                        suffix = '.c',
                        src_suffix = '.foo'
        )

由于我所依赖的二进制文件不接受 $TARGET 参数并且会产生执行错误,否则我只指定 $SOURCE 参数。 发生的情况是二进制文件的输出文件被放置在 src 目录而不是变体目录中。但是 SCons 期望输出文件位于变体目录中。

每次调用 scons 时,都会执行上面的构建目标,原因如下:

scons: building `variant_dir/foo.c' because it doesn't exist

仅通过命令生成器将文件复制到变体目录也不起作用

scons: warning: Two different environments were specified for target foo.c,
        but they appear to have the same action: foo_binary $SOURCE
File "sconscript", 
scons: *** Multiple ways to build the same target were specified for: foo.c  foo.foo'] and from ['foo.c'])
File "/sconscript",

我的问题是这是否是预期的行为?
有什么建议(除了修复使用的二进制文件)如何解决这种情况吗?不幸的是,我找不到任何涉及上述案例的文档。

提前致谢!

【问题讨论】:

  • 你有逻辑错误。您有多个构建命令来创建相同的目标。我不能说更多,因为在处理完构建脚本的完整列表后可能会发现某些错误。

标签: scons


【解决方案1】:

foo_binary 接受 input.foo 并在与输入相同的目录中生成 output.c?你怎么称呼建造者?像这样? env.FooBuilder('foo.c', 'foo.foo')。

当使用variant dir 时,scons 期望构建器的输出到variant_dir/foo.c。当失败时,它认为您已删除该文件并在下一次构建时重新创建它。我敢打赌,第一个构建也失败了,但第二个工作正常,因为 scons 找到了源代码树中的“foo.c”。

听起来最简单的方法是让 foo_binary 在源目录中生成输出,然后再移动它。你说你试过这个,但你可能是作为一个单独的步骤来做的,而不是在同一个构建器中。在那种情况下,它会在路径上搞得一团糟。这应该可以解决问题:

sFooBuilder = Builder(action=[
            os.path.join(rBuildPath, 'foo_binary') + ' $SOURCE',
            Move('$TARGET.dir', '$TARGET.srcpath')],
            suffix = '.c', src_suffix = '.foo' )

这会在同一个构建器操作中运行 2 个步骤:

foo_binary foo.foo
mv foo.c variant_dir

既然构建器按照您说的做了(在变体目录中创建 foo.c),它应该都能按预期工作。

另一种解决方案是将输入文件复制到构建目录,但在源目录和构建目录中使用相同的文件名是不可能的。 SCons 有点糊涂,先把源目录文件拉进去。

如果您使用不同的名称,这将是可行的(foo.foo.in 复制到变体目录中的 foo.foo,然后将其转换为 foo.c),但看起来有点混乱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多