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

Posted

技术标签:

【中文标题】Scons - 使用带有 scons 缓存的自定义预处理器【英文标题】:Scons - using custom preprocessor with scons cache 【发布时间】:2013-08-16 10:07:40 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

要使用 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 文件,从而正确获取包含依赖项。对名声绝望的我......

【讨论】:

看起来很有希望,我正在研究它。但是 SCons 怎么知道它应该编译预处理文件呢? 嗯,也许我没有正确阅读它,但是在我将您的 sn-p 应用到我们的构建系统之后,我收到了一个错误,类似于“我不知道该怎么做” X.wave" 文件,意外扩展 'wave'" ... 我实际上使用了 env.Command('out.cpp.wave', 'out.cpp', ...),这样就可以解释了。我目前使用 env.Command('out.cpp.cpp', 'out.cpp', ...) 使您的解决方案正常工作,如果不完美,这是可以接受的。有没有办法让 scons 知道“.wave”文件就像“.cpp”文件一样? 不幸的是我发现这个解决方案没有检测到隐式依赖项发生了变化:((意思是#include文件)。所以它没用(意思是需要更多的研究)。 好吧,如果波形文件有一个 cpp 扩展名,这将是相当困难的,诚然。您必须编写一个扫描仪(或至少告诉 SCons 它需要对波形文件使用 C 扫描仪)。

以上是关于Scons - 使用带有 scons 缓存的自定义预处理器的主要内容,如果未能解决你的问题,请参考以下文章

使用 SCons 着色编译器诊断

SCons - 为 CUDA、CORBA 等集成自定义构建器

scons安装和使用

SCons的使用

如何卸载scons?

linux自动化构建工具-scons指南