如果您曾经维护过构建和安装软件包的过程,您将对 CMake 感兴趣。CMake 是一个用于软件项目的开源构建(build)系统生成器,允许开发人员在简单、可移植的文本文件(即 CMakeLists.txt)中指定构建的参数格式。然后,CMake 使用 CMakeLists.txt 来生成服务于本机构建工具的工程文件,这些本机构建工具包括像 Microsoft Visual Studio 或 Apple Xcode,以及 UNIX、Linux、 NMake 和 Ninja这样的集成开发环境 (IDE)。CMake以一种简单的方式处理构建软件方面的困难(如跨平台构建、系统自检和用户自定义构建),使用户能够轻松地为复杂的硬件和软件系统定制构建。
对于任何项目,尤其是跨平台项目,都需要一个统一的构建系统。许多非基于 CMake 的项目都附带了UNIX Makefile(或Makefile.in)和Microsoft Visual Studio workspace。这要求开发人员不断尝试保持两个构建系统的最新状态和一致性。要针对其他构建系统(如Xcode),需要更多这些文件的自定义副本,这会产生更大的问题。如果您尝试支持可选组件则会使此问题更加复杂,例如,如果系统上有libjpeg,则需要包括(including) JPEG支持。CMake通过将这些不同的操作整合到一个简单、易于理解的文件格式中来解决这个问题。
如果你有多个开发人员在一个项目或多个目标平台上工作,那么软件必须在多台计算机上构建。鉴于安装现代计算机所涉及的安装软件和自定义选项范围广泛,运行相同操作系统的两台计算机可能会略有不同。CMake为单平台、多机开发环境提供了许多好处,包括:
- 自动搜索正在构建的软件可能需要的程序、库和头文件的能力。这包括在搜索时考虑环境变量和Window注册表设置的能力。
- 在源代码树之外构建目录树的能力。这是许多UNIX平台上的一个有用功能;CMake在Windows上也提供了此功能。这允许开发人员删除整个构建目录,而不必担心删除源文件。
- 能够为自动生成的文件(如Qt的moc() 或SWIG包装生成器)创建复杂的自定义命令。这些命令用于在构建过程中生成新的源文件,这些源文件又被编译到软件中。
- 在配置时选择可选组件的能力。例如,VTK的几个库是可选的,CMake为用户提供了一种选择构建哪些库的简单方法。
- 从简单的文本文件自动生成工作区和项目的能力。这对于具有许多程序或测试用例的系统来说非常方便,每个程序或测试案例都需要一个单独的项目文件,通常是使用IDE创建的繁琐的手动过程。
- 在静态和共享构建之间轻松切换的能力。CMake知道如何在所有支持的平台上创建共享库和模块。处理复杂的特定于平台的链接器标志,许多UNIX系统支持共享库的内置运行时搜索路径等高级功能。
- 自动生成文件依赖关系,并支持大多数平台上的并行构建。
在开发跨平台软件时,CMake提供了许多附加功能:
- 测试机器字节顺序和其他硬件特定特性的能力。
- 一组适用于所有平台的构建配置文件。这避免了开发人员必须在项目内以多种不同格式维护相同信息的问题。
- 支持在支持它的所有平台上构建共享库。
- 使用系统相关信息(如数据文件的位置和其他信息)配置文件的能力。CMake可以创建头文件,其中包含数据文件的路径等信息以及#define宏形式的其他信息。系统特定的标志也可以放置在配置的头文件中。这比编译器的命令行-D选项更有优势,因为它允许其他构建系统使用CMake构建库,而无需指定构建过程中使用的完全相同的命令行选项。