【问题标题】:Scons command/explicit dependencyScons 命令/显式依赖
【发布时间】:2015-09-28 04:08:52
【问题描述】:

我有一个类似这样的代码sn-p:

# 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' 目录,最后通过'src' 中的SConscript 文件编译程序。

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

我知道在通常情况下,scons 应该“找出”依赖关系,但我不知道它在这里如何做到这一点。

谢谢!

【问题讨论】:

    标签: scons


    【解决方案1】:

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

    此外,我只能建议阅读更多用户指南 (http://www.scons.org/doc/production/HTML/scons-user.html),以便更好地了解如何以更“SConsy”的方式做事。如果您遇到困难,请随时通过 scons-users@scons.org(请参阅 http://www.scons.org/lists.php)在我们的邮件列表中提出更多问题。 最后,如果您有很多要串行执行的步骤,并且不需要任何特殊的输入/输出文件,那么 SCons 可能不是您当前任务的正确工具。它被设计为一个面向文件的构建系统,并考虑到了自动并行化,一个简单的(Python?)脚本可能更适合仅仅串行的东西......

    【讨论】:

    • 我也建议再读一遍catb.org/esr/faqs/smart-questions.html,尤其是关于“XY”问题...
    • 谢谢!我确实来自更多的制造背景。但是,我觉得我的用例在 scons 支持的范围内。我认为我的问题不是很清楚(上面已编辑)。抱歉,我不确定您所说的“XY”问题是什么意思...
    • 那你一定要阅读catb.org/esr/faqs/smart-questions.html 或者干脆在网上搜索这个表达式。
    • 我明白了,我还以为是文章里的。但是,这正是我将问题编辑为与我正在做的事情基本相同的原因(我想我应该从这个开始)。感谢Install() 的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多