一 CMakeLists.txt和cmake脚本的联系和区别
① cmake脚本
(1) cmake文件里面通常是'什么信息(information)'
-- '.cmake文件'里包含了一些"公共(复用)"的'cmake命令'和一些'宏|函数'
-- 当CMakeLists.txt'包含该.cmake文件'时,当'编译'运行时,该.cmake里的一些命令就会在该'包含处'得到加载'执行',在'后续'能够'调用该.cmake里'的一些宏和函数
-- .cmake文件是一个'模块(module)文件',可以被'include'到CMakeLists.txt中
备注: cmake'脚本'不要包含'工程之类'的信息 -->例如:add_subdirectory()、CMAKE_CURRENT_之类的
最佳实践: cmake'不要'调用CMakeLists.txt
(2) .cmake模块文件被'加载的时机' -->'CMakeLists.txt'
-- @1: include(module_name.|file)
-- @2: find_package(module_name)
备注: 这两种'加载'方式有'区别'的,或者说find_package中'.cmake全文件名'有一定的要求
② CMakeLists.txt
(1) CmakeLists.txt才是cmake的'正统'文件
(2) 执行cmake 命令时候,会'自动加载'对应'路径'下的CMakeLists.txt文件-->'一般时项目根路经下'
eg: cmake .. -->加载'上级目录下'的CMakeLists.txt文件 -->'out of build常见的场景'
(3) CMakeLists.txt通过'add_subdirectory(dir)' -->'自动加载'该目录下的'CMakeLists.txt'文件
二 include指令
(1)基础
① 官方帮助文档
+++++++++++'普通(file)文件'+++++++++++
1)如果是'相对'路径,是'相对于'include指令所在的'CMakeLists.txt'的路径
2)'绝对'路径-->'建议'
一般我们会将'cmake'文件放到cmake目录下,所以'前缀'一般是: CMAKE_CURRENT_SOURCE_DIR/cmake/
备注: 这里的'file'文件,必须以'.cmake'结尾
+++++++++++'模块(module)文件'+++++++++++
1)首先搜索'Cmake builtin module directory' -->'cmake 内置的module目录'-->'centos7 /usr/share/cmake/MOdules/'
2)找不到'再搜索'-->'CMAKE_MODULE_PATH'
3)再找不到,则'报错'-->'NOTFOUND'
强调:如果非'.cmake'结尾的文件表示是'module'-->会自动查找'内建-->CMAKE_MODULE_PATH'路径下的"module_name.cmake"文件
include(src/CMakeLists.txt) -->cmake也可以这样做,但是相对'add_subdirectory(src)',我们'不推荐'前者
原因: include破坏了'Build Tree'的机制-->不能将'Source Tree'在'build'下'映射'成'Build Tree'
(2)实践
① 项目结构
② CMakeLists.txt文件
③ 测试