定义
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 的路径”,因为包含命令不会创建新范围,并且最近的具有自己的范围并包含项目命令的 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