考虑一个包含数百个 C 文件的项目,这些文件可以以不同的配置构建。
可以通过发送到编译器的附加 -D
来区分配置即 -DHARDWARE_FOO
或 -DHARDWARE_BAR
。当配置更改时,我通常需要通过这样做来清理所有对象文件:
make clean all
否则 make
不会重建项目,因为没有任何依赖关系发生变化。
避免手动清理项目的简单解决方案是使用名为 configuration
的文本文件,其中包含当前配置的名称。在 Makefile
中,我们会发现:
%o:%c $(CONFIGURATION)
$(cc) -c $< -o $@ -D$(shell cat $(CONFIGURATION))
不幸的是,这仍然需要在每次配置更改时重新构建整个项目。
如果我能够告诉 make 只重建依赖于声明 $(CONFIGURATION)
i.e. HARDWARE_xxx 的文件,我觉得这个解决方案可以得到优化
。
这可以节省大量时间,尤其是当不同硬件的数量很大时。在我的具体案例中,我谈论的是可以在不同硬件平台上运行的嵌入式固件。硬件平台由发送给编译器的定义标识。所以在源代码中我们会发现大量的#ifdef ... #elif ... #endif
指令
关于这个问题,我最初的想法是使用脚本 getdependencies
来检查所有 C 文件(及其包含),以确定哪些文件依赖于配置。
所以在 Makefile
中我会发现:
-import configurations.d
configurations.d: configuration
getdependencies --configuration=$< $(SRCS)
我对此进行了一些研究,看看是否已经存在类似的解决方案,因为我不想重新发明轮子。不幸的是我没有找到这样的东西。
有什么想法吗?
最佳答案
我认为这种情况下的标准方法是在 makefile
中为每个配置定义一个目标并配置工具(编译器、链接器、库管理器、汇编器、资源构建器/编译器等)创建他们为每个配置生成的文件放在单独的目录中(使用配置名称作为目录名称)。
此更改为您的构建例程带来了副作用改进:您只需在命令行中运行带有关联目标的 make
即可构建配置(不再更改文件)。然而,主要的改进是编译器将只重新编译被修改的文件(因为配置不再共享目标文件和可执行文件)。
关于c - 配置更改时如何节省构建时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30418119/