Scons command/explicit 依赖

Scons command/explicit dependency

我有一个与此类似的代码片段:

# Compile protobuf headers
env.Protoc(...)
# Move headers to 'include' (compiled via protobuf)    
env.Command([include headers...], [headers...], move_func)
# Compile program (depends on 'include' files)
out2 = SConscript('src/SConscript')
Depends(out2, [include headers...])

基本上,我 Protoc() 编译 protobuf 文件,然后头文件被 env.Command() 移动到 'include' 目录,最后程序通过 SConscript 编译'src'.

中的文件

由于这些是正在移动的头文件(src 编译所依赖的头文件),它们没有被 scons 明确定义为依赖项(据我了解)。因此,编译运行,但头文件没有被移动,所以它失败了。我尝试通过 Depends()Requires() 公开依赖关系但没有成功。

我知道在通常情况下,scons 应该 "figure-out" 依赖项,但我不知道它如何在这里做到这一点。

谢谢!

您似乎以 "make" 方式思考您的构建过程,这在使用 SCons 时是错误的方法。您不能通过将它们放在不同的 SConscripts 中来排序单个构建步骤,然后以特殊顺序包含它们。您必须在实际源(例如 C/CPP 文件)和目标(例如程序或 PDF 文件)之间定义适当的依赖关系。然后 SCons 能够找出正确的构建顺序,并自动遍历项目的文件夹结构。如果需要,它会在依赖图 (DAG) 指示时多次进入子文件夹。通常使用 Builder 来定义输入和输出之间的这种依赖关系……在您的情况下, Install() 构建器将是一个不错的选择。另请注意 "most frequently-asked FAQs"(https://bitbucket.org/scons/scons/wiki/FrequentlyAskedQuestions)列表中 #2 的提示。

此外,我只能推荐多读一点用户指南 (http://www.scons.org/doc/production/HTML/scons-user.html ) to get a better feeling for how to do things in a more "SConsy" way. If you get stuck, feel free to ask further questions on our mailing list at scons-users@scons.org (see http://www.scons.org/lists.php)。 最后,如果您有很多要串行执行的步骤,并且不需要任何特殊的 input/output 文件,SCons 可能不是您当前任务的正确工具。它被设计为一个面向文件的构建系统,考虑到自动并行化,一个简单的(Python?)脚本可能更适合处理串行内容...