我正在为五个不同的嵌入式控制器开发 C 代码。过去,我曾经为每个控制器创建一个单独的项目,但共享代码量约为 98%。因此,我合并了所有项目,并通过预处理器宏抽象了硬件访问。例子:
编译器:
gcc ... -D FS_CONTROLLER_A=STD_ON
代码:
#if FS_CONTROLLER_A == STD_ON
int8_t accessPin = 0;
#else
int8_t accessPin = 1;
#endif
这种解决方案节省了大量时间,而且效果很好。不幸的是,迭代构建不起作用。如果我构建控制器 A,我的构建环境 'sCons' 的决策者会为其构建的每个文件创建一个 MD5 校验和。当我切换到控制器 B 时,只更改了预处理器宏。因此,MD5 校验和保持不变,并且决定程序没有检测到任何更改并拒绝重建文件。
我可以在 sCons 中实现并注册一个自定义决策器,但这听起来很麻烦。这个问题已经有解决方案了吗?如果他们提供原生解决方案,我会毫不犹豫地切换到 cMake 或 Gradle。从我的角度来看,任何解决方案都需要在调用决策者之前运行预处理器。
PS:我知道 Keil Arm IDE 自带这个功能,但是我想要并且需要使用我自己的构建环境。