一步一步学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的区别

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CMAKE_MODULE_PATH是一个CMake变量,用于指定查找CMake模块文件的路径。模块文件通常包含定义函数和宏的CMake代码,可以在CMakeLists.txt文件中使用include()命令进行引用。 默认情况下,CMake会在以下几个位置搜索模块文件: - CMake安装目录下的share/cmake-x.y/Modules目录 - 系统wide搜索路径中指定的目录 如果需要在其他位置搜索模块文件,可以使用set命令修改CMAKE_MODULE_PATH变量,例如: ``` set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "/path/to/my/modules") ``` 这会将CMAKE_MODULE_PATH添加到/path/to/my/modules目录,使CMake在这个目录中搜索模块文件。 ### 回答2: CMAKE_MODULE_PATH是一个CMake变量,用于指定CMake在搜索模块文件时的路径。模块文件通常是一些用于扩展CMake功能的脚本或配置文件。 CMake是一个用于构建、测试和打包软件的跨平台工具。在构建过程中,CMake需要查找和加载各种模块文件来提供特定功能或库的支持。CMAKE_MODULE_PATH变量允许开发人员自定义CMake搜索模块文件的路径。 通常情况下,CMake会在默认路径下搜索模块文件,如CMake安装目录的Modules目录。但有时候,开发人员可能需要将自定义模块文件放置在其他地方,这时就可以使用CMAKE_MODULE_PATH来指定其他路径。 使用CMAKE_MODULE_PATH很简单,只需在CMakeLists.txt文件中设置该变量即可。例如,可以通过以下方式添加一个新的搜索路径: set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "/path/to/my_module_directory") 在上述代码中,将"/path/to/my_module_directory"添加到了CMAKE_MODULE_PATH中,以便CMake在构建过程中也搜索这个路径下的模块文件。 通过设置CMAKE_MODULE_PATH变量,开发人员可以方便地引入自定义模块文件,从而扩展CMake的功能,使其能够更好地适应项目的需求。 ### 回答3: CMAKE_MODULE_PATH是一个CMake项目中的一个变量,用于指定CMake在查找和加载模块文件时的搜索路径。模块文件通常是由CMake提供的一些辅助函数和宏的集合,用于扩展CMake的功能。 CMake在构建项目时,会通过CMAKE_MODULE_PATH变量来确定要搜索的路径。默认情况下,CMake会在系统的一些默认路径下寻找模块文件,如/usr/share/cmake/Modules和/usr/local/share/cmake/Modules等。在这些默认路径下,可以找到CMake提供的一些常用模块文件。 然而,有时候我们需要自定义模块文件或者扩展一些功能,此时可以通过设置CMAKE_MODULE_PATH变量来指定额外的路径。可以使用set命令来设置CMAKE_MODULE_PATH,例如set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)。这样,CMake将会在指定的路径下查找并加载模块文件。 通过设置CMAKE_MODULE_PATH,我们可以将自定义模块文件放置在项目的特定目录中,并告诉CMake在构建过程中到该目录中查找模块文件。这样,我们可以自定义CMake的功能,即使CMake本身没有提供相应的支持,也可以通过编写自己的模块文件来扩展CMake的功能。 总之,CMAKE_MODULE_PATH是一个用于指定CMake在查找和加载模块文件时搜索路径的变量。通过设置CMAKE_MODULE_PATH,我们可以自定义CMake的功能,扩展其功能和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值