定义
CMAKE_SOURCE_DIR:包含 CMakeList.txt 文件的最顶层文件夹(源目录)。该值在不同的范围内永远不会改变。
PROJECT_SOURCE_DIR:最近的文件夹,包含 CMakeList.txt 文件,有自己的范围,包含 project() 命令。
CMAKE_CURRENT_SOURCE_DIR:最近的文件夹,其中包含具有自己作用域的 CMakeList.txt 文件。 (文件不需要包含 project() 命令)
CMAKE_CURRENT_LIST_DIR: 包含当前处理的 CMakeList.txt 或 .cmake 文件的文件夹。
我的意思是它自己的范围与范围规则有关。虽然 include(file) 命令没有创建新范围,但 add_subdirectory 正在创建一个影响 PROJECT_SOURCE_DIR 和 CMAKE_CURRENT_SOURCE_DIR 值的新范围。
示例
让项目结构如下:
A/
=> CMakeList.txt
=> B/
=> CMakeList.txt
假设我们通过将消息命令放入子文件夹 B 中的 CMakeList.txt 文件来打印所有 cmake 变量。
- 如果文件夹A中的CMakeList.txt包含一行include("B/CMakeList.txt"),那么
CMAKE_SOURCE_DIR 将是源目录,即“项目/A 的路径”。
PROJECT_SOURCE_DIR 将是“项目/A 的路径”,因为 include 命令不会创建新范围,并且最近的具有自己的范围并包含项目命令的 CMakeList.txt 文件位于文件夹 A 中。
CMAKE_CURRENT_SOURCE_DIR 将是“项目/A 的路径”,因为 include 命令不会创建新范围,并且最近的具有自己范围的 CMakeList.txt 文件位于文件夹 A 中。
CMAKE_CURRENT_LIST_DIR 将是“项目/A/B 的路径”,因为当前处理的文件在子文件夹 B 中。
- 如果 CMakeList.txt 包含一行 add_subdirectory("./B"),则
CMAKE_SOURCE_DIR 将是源目录,即“项目路径/A”。
PROJECT_SOURCE_DIR 将是“项目/A/B 的路径”,因为 add_subdirectory 命令创建了一个新范围,并且最近的 CMakeList.txt 具有自己的范围并包含项目命令的文件位于子文件夹 B 中。
CMAKE_CURRENT_SOURCE_DIR 将是“项目/A/B 的路径”,因为 add_subdirectory 命令创建了一个新范围,并且最近的具有自己范围的 CMakeList.txt 文件位于子文件夹 B 中。
CMAKE_CURRENT_LIST_DIR 将是“项目/A/B 的路径”,因为当前处理的文件在子文件夹 B 中。
参考:https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/Useful-Variables