一步一步学Cmake 之 自定义模块(Module)

Table of Contents

1. 为什么要自定义模块

2. 如何自定义模块

2.1 准备文件

2.2 编写CMakeLists.txt


一步一步学 CMake 系列文章

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()

涨知识:CMake 中 function 和 macro的区别

猜你喜欢

转载自blog.csdn.net/wanzew/article/details/104118765