CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_LIST_DIR之间的区别

时间:2013-03-27 15:18:42

标签: cmake

来自Wiki:

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完成从文件处理命令时,它将恢复先前的值。因此,宏或函数内变量的值是调用调用堆栈上最底部条目的文件的目录,而不是包含宏或函数定义的文件的目录。

在什么情况下这些变量会有不同的值?

2 个答案:

答案 0 :(得分:85)

变量CMAKE_CURRENT_SOURCE_DIRCMAKE_CURRENT_LIST_DIR可能引用另一个带有include命令的文件包含的CMake列表文件的不同目录。例如,如果目录CMakeLists.txt中存在project且包含以下指令

include(src/CMakeLists.txt)

然后在处理src/CMakeLists.txtCMAKE_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 变量。

  • 如果文件夹 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