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