项目RFC 7:丢弃自动工具,维护CMake

作者

迈克·塔夫斯

联系

mwtoews@gmail.com

状态

采用

实施目标

项目9.0

最后更新

2021-10-27

总结

这个RFC提议放弃AutoTools for Proj 9.0,并维护用于构建自动化、测试和打包的CMake。这将减少项目的总体维护,并使库能够集成到使用CMake的其他项目中。

背景

以下是用于项目的构建工具的简短时间表:

  • 在整个20世纪90年代中期,Gerald Evenden维护了一个Unix构建系统,其中包含一些脚本(其中一些是从Autoconf派生的)和Makefile模板。

  • 2000年,Frank Warmeram为Proj 4.4.0编写了Autoconf和Automake配置。

  • 然后是NMake配置,以构建Windows版的Proj 4.4.2。

  • 2014年,Howard Butler为Proj 4.9.0RC1引入了CMake构建设置。CMake配置在4.9.1版中得到了改进,但当时没有考虑到与AutoTools版本的功能对等。

  • 对于Proj 6.0.0,删除了NMake构建设置,因为它的功能已被CMake取代。

动机

删除AutoTools的主要动机是减少维护多个构建配置的负担,这需要开发人员熟悉不同的工具和配置文件。维护单一构建系统还有其他几个好处:

  • 从源库中删除额外的配置和M4宏文件,

  • 简化用于运行CI服务测试的脚本(GitHub操作、TravisCI)、

  • 减少用于CI服务测试的编译时间(和碳足迹),

  • 简化开发工作,特别是使用新的贡献者。

为什么要放弃AutoTools?

GNU构建系统或AutoTools由一套工具组成,包括Autoconf和Automake,可用于在类Unix系统上构建软件。这些工具不是跨平台的,也不会天真地与Microsoft Windows上的开发环境集成。此外,现有的项目自动工具版本不安装从使用CMake的其他项目中查找项目所需的CMake配置文件 (#2546 )。

为什么使用CMake?

CMake是一个开源的跨平台工具,用于构建自动化、测试和打包软件。它不直接编译软件,而是使用生成器管理构建过程,生成器包括Unix Makefile和忍者以及其他基于命令的工具和IDE工具。CMake软件自2000年诞生以来一直在积极开发中。CMake语言是通过向后兼容的策略精心开发的,旨在提供跨不同版本的一致行为。CMake目前是Proj的首选构建工具,原因如下:

  • 它自2014年以来一直存在于项目代码库中,并为活跃的项目贡献者所熟悉,

  • 它可以安装配置文件,其他使用CMake查找项目以通过链接的软件可以使用这些配置文件 find_package()

  • Proj的第三方二进制包中使用了CMake配置,包括conda-forge和vcpkg。

  • 它可以用来在所有主要操作系统和编译器组合(在兼容的情况下)上构建项目,

  • 它集成了现代的IDE和工具,包括Microsoft Visual Studio和Qt Creator。

为什么不是CMake呢?

还有其他现代跨平台构建系统,包括Meson和Bazel,它们比CMake有许多优势。然而,它们目前并没有被积极的项目贡献者广泛使用。这个RFC不应该限制未来的构建系统配置被引入到项目中,如果随着时间的推移,它们被证明对CMake有优势。

潜在影响

目前依赖AutoTools的二进制打包程序显然需要使用CMake转换构建和测试项目。与Proj的多拱门构建相关的问题可能会变得很明显,可以对其进行修补和/或报告给Proj开发人员。AutoTools的一个功能是构建静态和动态(共享)库,打包人员可以分发这些库。此功能当前未针对Proj进行设置,因为它需要配置和构建两次。

使用Proj二进制程序包的最终用户不应受到影响。Proj应该可以通过pkg-config和CMake发现 find_package() 。其他使用AutoTools的项目将继续按预期工作,静态或动态链接到由CMake构建的项目。

过渡计划

如果该提案获得批准,应完成以下任务:

  • 重写CI测试以仅使用CMake进行打包、构建、测试、安装和安装后测试,

  • 删除仅由AutoTools使用的文件,还会更新 .gitignore

  • 更新文档和 HOWTORELEASE 笔记。

相关问题将在GitHub上使用标签进行跟踪 RFC7: Autotools→CMake

收养状况

RFC于2021-10-26通过,来自以下PSC成员的+1

  • 克里斯蒂安·埃弗斯

  • 甚至鲁奥

  • 霍华德巴特勒

  • 托马斯·克努森

  • 库尔特·施韦尔

  • 查尔斯·卡尼

  • 托马斯·克努森