我目前正在尝试围绕 Scons 构建一个构建系统,它将使用 Boost Wave 驱动程序作为自定义 C++ 代码预处理器。预处理后,代码使用 MSVC 进行编译。目前,我从 Sconscript 文件中为 Scons 看到的每个源文件启动 wave。这可行,但有一个问题 - 它非常慢,因为它没有利用 Scons 编译缓存。
您建议如何以使用编译缓存的方式将自定义预处理步骤集成到 SCons 构建系统中?显然,我还需要适当的 #include 依赖项扫描、并行编译等。我对 SCons 不太有经验,所以我正在寻找有人为我指明正确的方向。
我目前的两个研究领域是:
- 寻找某种方法来手动调用放置/检索缓存函数,但这有风险 - 我不想用无效条目污染缓存。
- 创建一个自定义工具/伪构建器/东西,这将允许我执行两个命令。或者尝试让 scons 使用两个工具/伪构建器。这看起来很复杂。
- Tom Tanner 的答案,似乎由于未正确检测到 #include 依赖项而受到影响。
最佳答案
要使用 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 文件,从而获得正确的包含依赖项。我渴望名誉...
关于c++ - Scons - 使用带有 scons 缓存的自定义预处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18270827/