Scons-使用带有Scons缓存的自定义预处理器

Scons - using custom preprocessor with scons cache

本文关键字:自定义 预处理 处理器 缓存 Scons Scons-      更新时间:2023-10-16

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

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

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

  • 找到一些手动调用放入/检索缓存函数的方法,但这是有风险的——我不想用无效条目污染缓存
  • 创建一个自定义工具/pudobuilder/something,这将允许我执行两个命令。或者试着用两种工具/伪构建器制作烤饼。这似乎很复杂
  • Tom Tanner的答案,似乎是#include依赖关系没有被正确检测到

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

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

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文件,从而获得正确的include依赖项。我渴望名誉…