目录
为了防止CMakeLists.txt文件过长,我们可以将其分成几个模块。这些模块可以包含在主 CMakeLists.txt 或其他模块中,这样:
- 主CMakeLists.txt 更易于阅读。
- CMake模块可以在其他项目中重用。
- 与函数相结合,模块可以帮助我们限制变量的作用范围。
CMake模块文件用.cmake来表示,.cmake文件里包含了一些cmake命令和一些宏/函数,当CMakeLists.txt包含该.cmake文件,编译运行时,该.cmake里的一些命令就会在该包含处得到执行,并且在包含以后的地方能够调用该.cmake里的一些宏和函数。
一、CMake相关命令
1.CMAKE_MODULE_PATH
用分号分隔的目录列表,用于在检查CMake附带的默认模块之前,由include或find_package命令加载的CMake模块的搜索路径。默认情况下,它为空。
2.include
include指令一般用于语句的复用,也就是说,如果有一些语句需要在很多CMakeLists.txt文件中使用,为避免重复编写,可以将其写在.cmake文件中,然后在需要的CMakeLists.txt文件中进行include操作就行了。
include模块不应该用作函数调用,因为模块可能被包含多次。
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <var>] [NO_POLICY_SCOPE])
从给定的文件<file|module>加载并运行CMake代码。
- 如果存在可选选项[OPTIONAL],则如果文件不存在,也不会引发错误。
- 如果给出了RESULT_VARIABLE,则变量<var>将被设置为已包含的完整文件名,如果失败,则设置为NOTFOUND。
如果include指定的是模块而不是文件,则会包含名为<name>.cmake的文件。为了使CMakeLists.txt能够找到该文件,需要指定文件完整路径(绝对路径或相对路径)。如果指定了CMAKE_MODULE_PATH,就可以直接include该目录下的.cmake文件了。
#方法一
#将 cmake 子目录添加到CMake模块搜索的路径列表中
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
#包括 colors.cmake 模块
set(result "")
include(colors RESULT_VARIABLE result)
message(STATUS "found color module:${result}")
#方法二
set(result "")
include(cmake/colors.cmake RESULT_VARIABLE result )
message(STATUS "found color module:${result}")
二、源码
1.CMake模块
文件夹cmake下创建colors.cmake模块,它定义了一个宏,用于CMake的彩色输出(用于重要的状态消息或警告)。
#彩色输出的定义
macro(define_colors)
if(WIN32)
message(STATUS "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.主CMakeLists.txt
调用colors.cmake模块中的define_colors宏。
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(recipe-02 LANGUAGES NONE)
set(result "")
include(cmake/colors.cmake RESULT_VARIABLE result )
message(STATUS "found color module:${result}")
#调用colors.cmake定义的宏
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}")
三、构建
windows端cmake构建结果如下:
如果使用macOS或Linux,以下的输出应该出现屏幕上: