CMake 从入门到崩溃5 - 基础语法之模块

CMake 从入门到崩溃5 - 基础语法之模块

CMake 内置一套标准模块 ,可以分为两类

  • 工具类模块
    • 通过 include() 命令使用
  • Find 模块
    • Find*.cmake
    • 使用它们你可以方便的找到系统上安装的第三方库
    • 通过 find_package 命令使用

通过 include 使用模块的例子:

cmake_minimum_required(VERSION 2.8)
project(foo NONE)

include(ProcessorCount) 
ProcessorCount(N) 
message("Number of processors: ${N}")

🔑 注意, include() 并没有引入新的变量作用域,因此你在自定义模块中对变量执行的任何操作都会渗透到调用者的作用域中

将自定义模块的路径放到 CMAKE_MODULE_PATH 变量中,就可以通过 include() 命令调用自己创建的模块

  • include() 会先搜索 CMAKE_MODULE_PATH 中的路径,搜索不到再去 CMake 内置的模块目录下搜索
# Top level CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(foo NONE)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/modules") 
include(MyModule)

🔑 最佳实践
为了避免项目间的模块名冲突,最好在模块名前加上项目名

CMAKE_CURRENT_LIST_*

列表文件(listfile)是指包含有 CMake 命令的文件,通常是 CMakeLists.txt*. cmake 模块

  • CMAKE_CURRENT_LIST_DIR
    • 当前正在处理的列表文件所在目录的完整路径
  • CMAKE_CURRENT_LIST_FILE
    • 当前正在处理的列表文件的完整路径

🔑 注意 CMAKE_CURRENT_LIST_DIRCMAKE_CURRENT_SOURCE_DIR 的区别

在函数或宏中,CMAKE_CURRENT_LIST_DIR 的值是调用栈最底部条目的文件目录,而不是宏或函数被定义的目录

# 根目录/home/liujiaxi/cpptest
# Top-Level CMake
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/modules") 
include(MyModule)
my_command()

#Module CMake
function(my_command)
    message(STATUS "CMAKE_CURRENT_LIST_DIR: ${CMAKE_CURRENT_LIST_DIR}")
     message(STATUS "CMAKE_CURRENT_LIST_FILE: ${CMAKE_CURRENT_LIST_FILE}")
endfunction()

# 输出
# CMAKE_CURRENT_LIST_DIR: /home/liujiaxi/cpptest
# CMAKE_CURRENT_LIST_FILE: /home/liujiaxi/cpptest/CMakeLists.txt
posted @ 2022-02-27 21:40  路过的摸鱼侠  阅读(298)  评论(0编辑  收藏  举报