Scons:如何为第三方编译结果指定文件依赖?

问题描述 投票:0回答:1

在我看来,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个回答
3
投票

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

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

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

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

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

您总是可以在SCons中编写自己的构建器和发射器,这是使SCons依赖性分析知道新工具/工具链的规范方法。在UserGuide,教派。 “18写你自己的建设者”,特别是我们的ToolsForFools Guide你可以找到更多这方面的信息。

© www.soinside.com 2019 - 2024. All rights reserved.