1

我目前正在尝试围绕 Scons 创建一个构建系统,它将使用 Boost Wave 驱动程序作为自定义 C++ 代码预处理器。预处理后,代码使用 MSVC 编译。目前,我从 Sconscript 文件中为 Scons 看到的每个源文件启动 wave。这可行,但有一个问题 - 它非常慢,因为它没有利用 Scons 编译缓存。

您如何建议将自定义预处理步骤集成到 SCons 构建系统中,以使用编译缓存的方式?显然,我还需要适当的#include 依赖项扫描、并行编译等。我对 SCons 的经验不是很丰富,所以我正在寻找可以为我指明正确方向的人。

我目前的两个研究领域是:

  • 找到某种方法来手动调用 put/retrieve 缓存函数,但这是有风险的——我不想用无效条目污染缓存。
  • 创建一个自定义工具/pseudobuilder/something,这将允许我执行两个命令。或者尝试让 scons 使用两个工具/pseudobuilders。这似乎很复杂。
  • Tom Tanner 的回答,似乎受到未正确检测到 #include 依赖项的影响。
4

1 回答 1

3

要使用 scons 缓存,您必须有一个目标。scons 根据贡献文件和构建命令缓存目标。

即使没有构建器,您也可以像这样为自己编写一个命令处理器。

out_cc = env.Command('file.wave.cpp', 'file.cpp', 'wave command < $SOURCE > $TARGET')
env.Program('myprog', ['this.cc', 'that.cc', out_cc])

这将使用缓存。

您可以根据需要添加构建器,这样您就可以一步完成。构建器非常适合您在多个地方使用相同的命令或具有比简单命令描述的更复杂的要求。但是,它们对于缓存的工作并不是必不可少的。

编辑:更新以包含 liosan 的解决方案,用于获取 .cpp 文件并生成 .cpp 文件,从而获得正确的包含依赖项。对名声绝望的我...

于 2013-08-16T11:09:29.253 回答