CMAKE_CURRENT_SOURCE_DIR 这是当前处理的CMakeLists.txt所在的目录
CMAKE_CURRENT_LIST_DIR (自2.8.3开始)这是当前正在处理的列表文件的目录。
CMAKE_CURRENT_SOURCE_DIR:当前正在处理的源目录的路径。 这是cmake当前正在处理的源目录的完整路径。
CMAKE_CURRENT_LIST_DIR:当前正在处理的列表文件的完整目录。 当CMake处理项目中的列表文件时,该变量将始终设置为当前正在处理的列表文件(CMAKE_CURRENT_LIST_FILE)所在的目录。该值具有动态范围。当CMake开始处理源文件中的命令时,它将此变量设置为此文件所在的目录。当CMake完成从文件处理命令时,它将恢复先前的值。因此,宏或函数内变量的值是调用调用堆栈上最底部条目的文件的目录,而不是包含宏或函数定义的文件的目录。
在什么情况下这些变量会有不同的值?
答案 0 :(得分:85)
变量CMAKE_CURRENT_SOURCE_DIR
和CMAKE_CURRENT_LIST_DIR
可能引用另一个带有include命令的文件包含的CMake列表文件的不同目录。例如,如果目录CMakeLists.txt
中存在project
且包含以下指令
include(src/CMakeLists.txt)
然后在处理src/CMakeLists.txt
时CMAKE_CURRENT_LIST_DIR
会引用project/src
,而CMAKE_CURRENT_SOURCE_DIR
仍然指向外部目录project
。
CMAKE_CURRENT_LIST_DIR
文件旁边的模板文件或批处理脚本之类的资源文件时, CMakeLists.txt
会派上用场。
答案 1 :(得分:5)
定义
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 变量。
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 中。
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