CMake实战指南 - 3 最小工程

所有的CMake工程都始于一个叫CMakeLists.txt的文件,它位于源码树的顶端,你可以认为它是CMake工程的项目文件,这个文件里定义了构建过程中的所有内容,包括测试、打包以及其他客制化任务等等。当然,CMakeLists.txt的内容也可以仅仅几行,也可以非常复杂,并且它还能从子目录中囊括更多内容。CMakeLists.txt文件就是一个普通的文本文件,你可以像编辑其它源文件一样编辑它。
CMake像其他编程语言一样定义了自己的语言规则,其中有变量、函数、宏、条件逻辑、循环、代码注释等等,这些内容将在后续的第2部分介绍,现在我们的目标仅仅是让它简单编译能运行就可以了,下面是一个最小的CMakeLists.txt:

cmake_minimum_required(VERSION 3.2)
project(MyApp)
add_executable(MyExe main.cpp)

上述内容的每一行执行了CMake的内置命令,CMake中的命令类似其它编程语言的函数调用,虽然这些命令可以传参,但是并不会有返回值(但后面的章节将展示如何在其他函数中将值传递回调用者)。命令中的参数可以通过空格或者换行符分隔:

add_executable(MyExe
 main.cpp
 src1.cpp
 src2.cpp
)

CMake的命令不区分大小写,如下写法是等效的:

add_executable(MyExe main.cpp)
ADD_EXECUTABLE(MyExe main.cpp)
Add_Executable(MyExe main.cpp)

虽然CMake部分大小写,但是按照惯例还是建议小写,这也是CMake内置命令所遵循的管理。

3.1 管理CMake版本

CMake为了支持更多的工具、平台和特征一直在持续更新。CMake的开发者在每次释放新版时都会考虑对老版本的兼容,所以,当用户更新CMake版本时,已有的工程仍然可以保持和旧版本一样的构建方式。有的时候在新版本中CMake可能需要引入一些修改,或者进行更严格的进行相关检查,或者引入一些告警,但又不希望这些修改影响到已有的工程,为此CMake提供了策略(policy)机制,通过策略机制,CMake可以在内部修复Bug和开发新功能,并且仍保持任何特定过去版本的预期行为。
在项目中主要是通过cmake_minimum_required命令来指定CMake版本,这个命令总是位于CMakeList.txt文件的第一行,这样确保在其他任何事情之前检查和确定项目的要求,这个命令会做如下两件事情:

  • 指定项目所需的CMake最低版本。一般低于该指定版本的CMake处理CMakeLists.txt文件时,CMake就会立即报错,这样也可以保证CMake的功能可用性以继续后面的处理。
  • 它强制执行策略设置,使CMake行为与指定版本相匹配

如果在CMake执行其他命令前没有遇到cmake_minimum_required命令,那么cmake会发出告警信息给用户,只有这样,cmake才知道如何为后续的任务处理设置策略。cmake_minimum_required命令就如同它的名字一样,可以仅仅设置版本信息,这样CMake就会按照特定版本处理任务。在第13章节中,我们会更详细地讨论了策略设置,并解释如何根据需要定制此行为。

cmake_minimum_required命令的格式如下:

cmake_minimum_required(VERSION major.minor[.patch[.tweak]])

其中VERSION关键字是必须写的,提供的版本信息中必须有major.minor部分,如3.12,patch和tweak部分是可选项,这样做的原因是因为新功能的引入往往只更新minor值,而bug的修复则更新patch部分。由于在3.x版本中没有使用tweak,所以在项目中也不必指定这么个内容。
在项目中,开发者需要仔细考虑CMake支持的最低版本,由于3.5版本是一个非常古老的版本,所以开发者如果设置最低版本低于这个版本,最新的CMake版本会发出弃用警告。如果开发者面向的是类似iOS这种迭代非常快的平台,那么就必须考虑最近的版本以支持最新系统和Xcode版本。
作为经验,选择最新的版本并不会对项目产生显著影响。如果项目需要支持老平台,最大的挑战往往是系统提供了老版本的CMake。为此,开发者应当考虑在老平台上安装最新的CMake版本。另外,如果项目本身是其他项目的依赖项,那么选择较新的CMake版本可能会引入问题,这种情况下,要求最旧的CMake版本可能会有帮助,该版本仍然提供所需的最低CMake功能,但如果有机会,还是建议使用更高版本的CMake版本(通过策略机制实现),这样可以避免其他的项目被要求使用高于其环境所能提供的版本。如果他们愿意,依赖项目总是需要一个更新的版本,但他们不能需要一个旧的版本。使用最旧的可用版本的主要缺点是,它可能会导致更多的弃用警告,因为较新的CMake版本会警告旧的行为,以鼓励维护人员更新他们的项目。

3.2 project()命令

每个项目都应在cmake_minimum_required命令之后使用project()命令,该命令如下:

project(projectName
 [VERSION major[.minor[.patch[.tweak]]]]
 [LANGUAGES languageName ...]
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值