CMAKE_CURRENT_SOURCE_DIR 与 CMAKE_CURRENT_LIST_DIR 的区别

来自维基百科:

CMAKE _ CURRENT _ SOURCE _ DIR 这是当前处理的 CMakeLists.txt 所在的目录

CMAKE _ CURRENT _ LIST _ DIR (从2.8.3开始)这是当前正在处理的 listfile 的目录。

文件:

CMAKE _ CURRENT _ SOURCE _ DIR: 当前正在处理的源目录的路径。 这是 cmake 当前正在处理的源目录的完整路径。

CMAKE _ CURRENT _ LIST _ DIR: 当前正在处理的 listfile 的完整目录。 当 CMake 处理项目中的 listfiles 时,这个变量将始终设置为当前正在处理的 listfile (CMAKE _ CURRENT _ LIST _ FILE)所在的目录。该值具有动态范围。当 CMake 开始处理源文件中的命令时,它将这个变量设置为该文件所在的目录。当 CMake 完成对文件的处理命令后,它将恢复以前的值。因此,宏或函数中变量的值是调用调用堆栈最底层条目的文件的目录,而不是包含宏或函数定义的文件的目录。

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

90341 次浏览

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

include(src/CMakeLists.txt)

然后,在处理 src/CMakeLists.txt时,CMAKE_CURRENT_LIST_DIR将引用 project/src,而 CMAKE_CURRENT_SOURCE_DIR仍然指向外部目录 project

当您需要定位位于当前正在处理的 CMakeLists.txt文件旁边的资源文件(如模板文件或批处理脚本)时,CMAKE_CURRENT_LIST_DIR非常方便。


注意: 当使用 add_subdirectory()命令而不是 include()时,行为是不同的,当 src/CMakeLists.txt被处理时,两个变量都指向 project/src

定义

CMAKE_SOURCE_DIR: 包含 CMakeList.txt 文件的 Topmost 文件夹(源目录)。该值在不同的范围内从不更改。

PROJECT_SOURCE_DIR: 包含 CMakeList.txt 文件的最近的文件夹,它有自己的作用域,包含 project ()命令。

CMAKE_CURRENT_SOURCE_DIR: 包含有自己作用域的 CMakeList.txt 文件的最近文件夹(文件不需要包含 project ()命令)

CMAKE_CURRENT_LIST_DIR: 包含当前处理的 CMakeList.txt 或. cmake 文件的文件夹。

我所说的自身范围是指与范围规则相关的。尽管 include (file)命令没有创建新的作用域,但 add _ sub 目录正在创建一个影响 PROJECT _ SOURCE _ DIR 和 CMAKE _ CURRENT _ SOURCE _ DIR 值的新作用域。

例子

让项目结构如下:

A/
=> CMakeList.txt
=> B/
=> CMakeList.txt

让我们假设通过将 message 命令放到子文件夹 B 中的 CMakeList.txt 文件来打印所有 cmake 变量。

  • 如果文件夹 A 中的 CMakeList.txt 包含一行 include (“ B/CMakeList.txt”) ,则

CMAKE_SOURCE_DIR将是源目录,它是“ project/A 的路径”。

PROJECT_SOURCE_DIR将是“ project/A 的路径”,因为 include 命令不会创建新的作用域,最近的有自己作用域并包含 project 命令的 CMakeList.txt 文件位于文件夹 A 中。

CMAKE_CURRENT_SOURCE_DIR将是“ project/A 的路径”,因为 include 命令不会创建新的作用域,最近的有自己作用域的 CMakeList.txt 文件位于文件夹 A 中。

CMAKE_CURRENT_LIST_DIR将是“ project/A/B 的路径”,因为当前处理的文件位于子文件夹 B 中。

  • 如果 CMakeList.txt 包含一行 add _ subdirectory (“ ./B”) ,则

CMAKE_SOURCE_DIR将是源目录,它是“ project/A 的路径”。

PROJECT_SOURCE_DIR将是“ project/A/B 的路径”,因为 add _ subdirectory 命令创建一个新的作用域,最近的有自己作用域并包含项目命令的 CMakeList.txt 文件位于子文件夹 B 中。

CMAKE_CURRENT_SOURCE_DIR将是“ project/A/B 的路径”,因为 add _ subdirectory 命令创建一个新的作用域,最近的有自己作用域的 CMakeList.txt 文件位于子文件夹 B 中。

CMAKE_CURRENT_LIST_DIR将是“ project/A/B 的路径”,因为当前处理的文件位于子文件夹 B 中。

参考文献 : < a href = “ https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/Useful-Variables”rel = “ noReferrer”> https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/useful-variables