在学习QGIS源码过程中,根据CMakeLists学习QGIS项目目录结构关系,顺带学习CMake使用。
文件:
QGIS-3.12.0 源码 根目录 CMakeLists.txt
位置: 3至13行:
CMAKE_MINIMUM_REQUIRED(VERSION 3.1.0)
SET(CMAKE_COLOR_MAKEFILE ON)
#set path to additional CMake modules
SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
#POLICIES
CMAKE_POLICY (SET CMP0048 NEW)
CMAKE_POLICY (SET CMP0053 NEW)
CMAKE_POLICY (SET CMP0071 NEW)
#don’t relink it only the shared object changes
SET(CMAKE_LINK_DEPENDS_NO_SHARED ON)
命令:
CMAKE_MINIMUM_REQUIRED()
CMAKE_POLICY()
SET()
解释:
-
CMAKE_MINIMUM_REQUIRED(VERSION <min>[...<max>] [FATAL_ERROR]):
设置项目需要CMake的最低版本。如CMAKE_MINIMUM_REQUIRED(VERSION 3.1.0)
表示QGIS-3.12.0项目需要不低于3.1.0的CMake生成编译文件(版本形式:major.minor[.patch[.tweak]]
)。命令中min为必须参数,max,FATAL_ERROR为可选参数。可以设置max参数表示当前工程需要的CMake版本范围,eg:CMAKE_MINIMUM_REQUIRED(VERSION 2.6... 3.1.0)
,其中max要不小于min。FATAL_ERROR
参数自2.6以上版本被忽略了,只要当前运行的CMake版本不在设置的版本范围内,都会报错退出,因此2.6以上版本可以省略此设置。其实,该命令的作用就是通过设置版本号,设置编译器采用的相关编译策略,即调用:CMAKE_POLICY(VERSION)。 -
CMAKE_POLICY(VERSION <min>[...<max>])
随着CMake的发展,有时有必要更改现有的行为,以修复bug或改进现有特性的实现。CMake策略机制旨在帮助保持现有项目的构建,因为CMake的新版本引入了行为的变化。每个新策略(行为变化)都被赋予CMP形式的标识符,其中是一个整数索引(参考https://cmake.org/cmake/help/v3.18/manual/cmake-policies.7.html)。与每个策略相关联的文档描述了新旧行为以及引入策略的原因。项目可以设置每个策略来选择所需的行为。当CMake需要知道使用哪个行为时,它会检查项目指定的设置。如果没有可用的设置,则假定为旧的行为,并生成警告,请求设置策略。虽然支持单独设置策略(即CMAKE_POLICY (SETCMP<NNNN>NEW)
形式),官网说明鼓励项目基于CMake版本设置策略(即:CMAKE_POLICY(VERSION <min>[...<max>])
形式
)。