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_DIR
和CMAKE_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
本文来自博客园,作者:路过的摸鱼侠,转载请注明原文链接:https://www.cnblogs.com/ljx-null/p/15943550.html