1. 为什么要自定义模块
项目一般从CMakeLists.txt开始编写,但是随着时间的推移,CMakeLists.txt文件会变的越来越大,这个时候我们就需要将CMakeLists.txt文件拆开分写成几个小的模块,这样做的好处是:
1.主文件CMakeLists.txt易读性强
2.CMake 模块能够在其它项目中重复使用
3.和CMake的函数相比,模块能够帮助我们限制变量的作用域
这一节我们将通过定义并包含一个宏来展示如何编写并使用CMake的模块(Module)
2. 如何自定义模块
2.1 准备文件
本例中我们将使用两个文件:
CMakeLists.txt 和 cmake/colors.cmake
├── cmake
│ └── colors.cmake
└── CMakeLists.txt
cmake/colors.cmake包含的内容如下:
-
macro(define_colors)
-
if(WIN32)
-
# has no effect on WIN32
-
set(ColourReset "")
-
set(ColourBold "")
-
set(Red "")
-
set(Green "")
-
set(Yellow "")
-
set(Blue "")
-
set(Magenta "")
-
set(Cyan "")
-
set(White "")
-
set(BoldRed "")
-
set(BoldGreen "")
-
set(BoldYellow "")
-
set(BoldBlue "")
-
set(BoldMagenta "")
-
set(BoldCyan "")
-
set(BoldWhite "")
-
else()
-
string(ASCII 27 Esc)
-
set(ColourReset "${Esc}[m")
-
set(ColourBold "${Esc}[1m")
-
set(Red "${Esc}[31m")
-
set(Green "${Esc}[32m")
-
set(Yellow "${Esc}[33m")
-
set(Blue "${Esc}[34m")
-
set(Magenta "${Esc}[35m")
-
set(Cyan "${Esc}[36m")
-
set(White "${Esc}[37m")
-
set(BoldRed "${Esc}[1;31m")
-
set(BoldGreen "${Esc}[1;32m")
-
set(BoldYellow "${Esc}[1;33m")
-
set(BoldBlue "${Esc}[1;34m")
-
set(BoldMagenta "${Esc}[1;35m")
-
set(BoldCyan "${Esc}[1;36m")
-
set(BoldWhite "${Esc}[1;37m")
-
endif()
-
endmacro()
2.2 编写CMakeLists.txt
-
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
-
project(recipe-02 LANGUAGES NONE)
-
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
-
include(colors)
-
define_colors()
-
message(STATUS "This is a normal message")
-
message(STATUS "${Red}This is a red${ColourReset}")
-
message(STATUS "${BoldRed}This is a bold red${ColourReset}")
-
message(STATUS "${Green}This is a green${ColourReset}")
-
message(STATUS "${BoldMagenta}This is bold${ColourReset}")
1. 本例并没有源代码需要编译,所以不需要CMake对任何编程语言进行支持,所以
project(recipe-02 LANGUAGES NONE)
2. 我们定义了一个宏define_colors,并放在了cmake/colors.cmake中,之所以要定义宏而不是函数,是因为我们希望在调用宏之后还继续使用宏内部的变量值。
3. 定义好模块之后,我们要告诉CMake到哪里可以找到宏定义:
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
然后就是包含并调用宏,include(colors)会告诉CMake在CMAKE_MODULE_PATH路径中寻找colors.cmake的文件。
4. 当然,我们也可以使用下面的语句来实现以上的功能
-
include(cmake/colors.cmake)
-
define_colors()