对于大型C/C++项目,在编译时使用GNU m4

Use GNU m4 at compile time for large C/C++ project

本文关键字:编译 m4 GNU 于大型 C++ 项目      更新时间:2023-10-16

背景

我有一个大项目,我目前正在重构。其中一个问题是产品使用的公共路径(即对/opt/dev和该位置的子路径的引用)的字符串文本(300+个实例)在各地被大量滥用,包括:

  • C/C++源文件和头文件
  • python脚本
  • bash脚本
  • systemd脚本
  • 二进制图像(驱动程序)

目标

我想使用GNU m4来定义一个带有一组通用宏的文件,这样我们就可以";写一次,处处用";,因此,如果我们的代码是分支的(对于新产品来说是典型的),我们可以只更改一个文件中的宏,而不是查找重复的字符串文本并调试它们好几天。对于像脚本这样的简单事情来说,这很容易,因为我只需在构建输出路径中创建源树的副本,并直接在脚本上运行M4。


问题

到目前为止,唯一的缺点是,对于C/C++项目来说,这将是一项巨大的工作,因为我只想在编译时执行M4宏扩展/替换。这意味着,为了避免修改从git签出的源文件,我将不得不修改我的构建脚本(许多Makefile),以处理代码的临时副本,而不是原始源文件本身。否则,直接在版本控制的源代码上运行M4将对本地工作副本产生更改,开发人员可能会将此M4评估的代码副本提交给版本控制,从而破坏M4的工作。


问题

是否可以指示gcc在编译过程中评估m4宏/扩展,无论是通过某种外部工具还是gcc本身的某些功能?如果没有,我的构建脚本可能需要进行大规模的大修才能支持M4宏。

使用m4为C和/或C++代码生成project-config.h标头。在每个需要使用其中一个宏的文件中使用该标头。确保程序员知道这是应该使用的。可能强制使用签入前的代码检查,或定期扫描代码库?当标头更改时,重新编译受影响的文件。不要做不必要的改变。