在大型 C/C++ 项目的编译时使用 GNU m4
Use GNU m4 at compile time for large C/C++ project
背景
我有一个大型项目,目前正在重构。问题之一是产品使用的公共路径(即对 /opt/dev
和该位置的子路径的引用)在整个地方大量滥用字符串文字(300 多个实例),包括:
- C/C++ 源文件和头文件。
- python 个脚本。
- bash 个脚本。
- systemd 脚本。
- 二进制映像(驱动程序)。
目标
我想使用 GNU m4 来定义一个包含一组通用宏的文件,这样我们就可以“一次编写,随处使用”,这样如果我们的代码是分支的(典型的新product),我们可以只更改那个文件中的宏,而不是寻找重复的字符串文字并调试它们好几天。这对于像脚本这样的简单事情来说已经足够简单了,因为我只是在构建输出路径中创建源代码树的副本,并直接在脚本上创建 运行 M4。
问题
到目前为止唯一的缺点是,这看起来对 C/C++ 项目来说是一项巨大的工作,因为我只想在 expansion/substitution 处执行 M4
宏编译时间。这意味着,为了避免修改从 git 签出的源文件,我将不得不修改我的构建脚本(很多 Makefile)以处理代码的临时副本而不是原始源文件他们自己。否则,运行ning M4
直接在受版本控制的源代码上将生成对本地工作副本的更改,并且开发人员很可能将此代码的 M4 评估副本提交到版本控制,从而破坏M4 努力。
问题
是否可以指示 gcc 在编译期间评估 m4 macros/expansions,或者通过某些外部工具或 GCC 本身的某些功能?否则,我的构建脚本可能需要大修才能支持 M4 宏。
使用 m4
为 C and/or C++ 代码生成 project-config.h
header。在每个需要使用其中一个宏的文件中使用 header。确保程序员知道应该使用什么。可能在签入之前强制使用代码检查,或定期扫描代码库?当 header 更改时重新编译受影响的文件。不要不必要地改变它。
背景
我有一个大型项目,目前正在重构。问题之一是产品使用的公共路径(即对 /opt/dev
和该位置的子路径的引用)在整个地方大量滥用字符串文字(300 多个实例),包括:
- C/C++ 源文件和头文件。
- python 个脚本。
- bash 个脚本。
- systemd 脚本。
- 二进制映像(驱动程序)。
目标
我想使用 GNU m4 来定义一个包含一组通用宏的文件,这样我们就可以“一次编写,随处使用”,这样如果我们的代码是分支的(典型的新product),我们可以只更改那个文件中的宏,而不是寻找重复的字符串文字并调试它们好几天。这对于像脚本这样的简单事情来说已经足够简单了,因为我只是在构建输出路径中创建源代码树的副本,并直接在脚本上创建 运行 M4。
问题
到目前为止唯一的缺点是,这看起来对 C/C++ 项目来说是一项巨大的工作,因为我只想在 expansion/substitution 处执行 M4
宏编译时间。这意味着,为了避免修改从 git 签出的源文件,我将不得不修改我的构建脚本(很多 Makefile)以处理代码的临时副本而不是原始源文件他们自己。否则,运行ning M4
直接在受版本控制的源代码上将生成对本地工作副本的更改,并且开发人员很可能将此代码的 M4 评估副本提交到版本控制,从而破坏M4 努力。
问题
是否可以指示 gcc 在编译期间评估 m4 macros/expansions,或者通过某些外部工具或 GCC 本身的某些功能?否则,我的构建脚本可能需要大修才能支持 M4 宏。
使用 m4
为 C and/or C++ 代码生成 project-config.h
header。在每个需要使用其中一个宏的文件中使用 header。确保程序员知道应该使用什么。可能在签入之前强制使用代码检查,或定期扫描代码库?当 header 更改时重新编译受影响的文件。不要不必要地改变它。