我有一个看起来像这样的建设者:
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",
我的问题是,这是否是预期的行为?
是否有任何建议(除了修复使用过的二进制文件)如何解决这种情况?不幸的是,我无法找到任何涉及上述情况的文档。
提前致谢!
答案 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),但看起来有点乱。