SCons:未指定$ TARGET的构建器在src目录中创建构建器输出而不是变量目录

时间:2010-11-14 19:40:56

标签: scons

我有一个看起来像这样的建设者:

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",

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

提前致谢!

1 个答案:

答案 0 :(得分:2)

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' )

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

foo_binary foo.foo
mv foo.c variant_dir

既然构建器按照你的说法做了(在变量目录中创建foo.c)它应该按预期工作。

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

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