背景
我有一个大项目,我目前正在重构。其中一个问题是产品使用的公共路径(即对/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
标头。在每个需要使用其中一个宏的文件中使用该标头。确保程序员知道这是应该使用的。可能强制使用签入前的代码检查,或定期扫描代码库?当标头更改时,重新编译受影响的文件。不要做不必要的改变。