如何在配置更改时节省构建时间?

时间:2015-05-23 22:18:09

标签: c makefile

考虑一个可以在不同配置中构建的数百个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)

我对此进行了一些研究,看看是否已经存在类似的解决方案,因为我不想重新发明轮子。不幸的是我没有找到这样的东西。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为在这种情况下的标准方法是在makefile中为每个配置定义一个目标并配置工具(编译器,链接器,库管理器,汇编器,资源构建器/编译器等)创建它们生成的文件到每个配置的单独目录中(使用配置名称作为目录名称)。

此更改为构建例程带来了副作用改进:您可以通过在命令行中使用关联目标运行make来构建配置(不再需要更改文件)。但是,主要的改进是编译器将仅重新编译被修改的文件(因为配置不再共享对象和可执行文件)。