Cmake 之 自定义模块(Module)

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包含的内容如下:

  1. macro(define_colors)

  2. if(WIN32)

  3. # has no effect on WIN32

  4. set(ColourReset "")

  5. set(ColourBold "")

  6. set(Red "")

  7. set(Green "")

  8. set(Yellow "")

  9. set(Blue "")

  10. set(Magenta "")

  11. set(Cyan "")

  12. set(White "")

  13. set(BoldRed "")

  14. set(BoldGreen "")

  15. set(BoldYellow "")

  16. set(BoldBlue "")

  17. set(BoldMagenta "")

  18. set(BoldCyan "")

  19. set(BoldWhite "")

  20. else()

  21. string(ASCII 27 Esc)

  22. set(ColourReset "${Esc}[m")

  23. set(ColourBold "${Esc}[1m")

  24. set(Red "${Esc}[31m")

  25. set(Green "${Esc}[32m")

  26. set(Yellow "${Esc}[33m")

  27. set(Blue "${Esc}[34m")

  28. set(Magenta "${Esc}[35m")

  29. set(Cyan "${Esc}[36m")

  30. set(White "${Esc}[37m")

  31. set(BoldRed "${Esc}[1;31m")

  32. set(BoldGreen "${Esc}[1;32m")

  33. set(BoldYellow "${Esc}[1;33m")

  34. set(BoldBlue "${Esc}[1;34m")

  35. set(BoldMagenta "${Esc}[1;35m")

  36. set(BoldCyan "${Esc}[1;36m")

  37. set(BoldWhite "${Esc}[1;37m")

  38. endif()

  39. endmacro()

2.2 编写CMakeLists.txt

 
  1. cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

  2.  
  3. project(recipe-02 LANGUAGES NONE)

  4.  
  5. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

  6.  
  7. include(colors)

  8. define_colors()

  9.  
  10. message(STATUS "This is a normal message")

  11. message(STATUS "${Red}This is a red${ColourReset}")

  12. message(STATUS "${BoldRed}This is a bold red${ColourReset}")

  13. message(STATUS "${Green}This is a green${ColourReset}")

  14. 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. 当然,我们也可以使用下面的语句来实现以上的功能

 
  1. include(cmake/colors.cmake)

  2. define_colors()

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值