【问题标题】:Scons: how to specify file dependency for 3rd party compile result?Scons:如何为第 3 方编译结果指定文件依赖项?
【发布时间】:2018-09-14 00:40:22
【问题描述】:

在我看来,scons 目标不是按声明顺序生成的。我的问题是,我需要先生成一些代码,我正在使用 protoc 将 my.proto 文件处理为 .h 和 .cc 文件,我需要一些这样的伪代码(工作代码应该是什么样的?)

import os
env=Environment(ENV=os.environ,LIBPATH='/usr/local/lib')
env.ShellExecute('protoc', '--outdir=. --out-lang=cpp', 'my.proto')//produces my.cc
myObj=Object('my.cc')//should wait until 'my.cc' is generated by protoc
Dependency(myObj, 'my.cc')
mainObj=Object('main.cpp')

我的问题是:

  1. 如何在SConstruct/SConscript中指定protoc的ShellExecution?

  2. 如何确保'main.cpp'的编译依赖'my.cc'的存在,也就是等'my.cc'生成后再执行?

【问题讨论】:

    标签: shell dependencies execute scons protoc


    【解决方案1】:

    您的观察和假设是正确的,SCons 不会按照您在 SConstruct 文件中列出的顺序执行单个构建命令。它将根据构建中目标和源文件的依赖关系运行它们,无论是隐式定义(例如 C++ 中的头文件)还是显式定义(通过 Depends() 方法)。

    因此,您必须正确定义和设置依赖项,以便 SCons 提供您想要的输出。对于您示例中的特殊 protoc 案例,存在一个特殊的 Builder 可以帮助您正确获取依赖关系图。它在我们的ToolsIndex 中提供,在那里还可以找到对各种其他语言和方言的支持。

    这些特殊的构建器会发出正确的目标节点,例如当给定一个*.proto 输入文件时,SCons 能够自动检测 protoc 输入文件和你的main 程序之间的依赖关系,如果你这样说的话:

    env=Environment(tools=['default','protoc'])
    env.Protoc([], "test.proto")
    env.Program('main', ['main.cpp'] + Glob('*.cc'))
    

    Glob('*.cc') 将检测来自 protoc 工具的 *.cc 文件,并将它们作为最终目标 main 的依赖项。

    您始终可以在 SCons 中编写自己的构建器和发射器,这是使 SCons 依赖分析了解新工具/工具链的规范方法。在UserGuide,教派。 “18 Writing Your Own Builders”,尤其是我们的ToolsForFools Guide,您可以找到更多相关信息。

    【讨论】:

    • 谢谢,但除了这些外部工具,Scons 本身如何支持我的要求?谢谢。
    • 我已在项目文档中添加了参考。添加一个新的 Builder,可能还有一个 Emitter,这是您的情况所需要的。提供的链接将详细说明如何执行此操作。
    猜你喜欢
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    相关资源
    最近更新 更多