CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_LIST_DIR之间的区别

Wil*_*yne 83 cmake

来自Wiki:

CMAKE_CURRENT_SOURCE_DIR 这是当前处理的CMakeLists.txt所在的目录

CMAKE_CURRENT_LIST_DIR (自2.8.3起)这是当前正在处理的列表文件的目录.

来自Docs:

CMAKE_CURRENT_SOURCE_DIR:当前正在处理的源目录的路径.这是cmake当前正在处理的源目录的完整路径.

CMAKE_CURRENT_LIST_DIR:当前正在处理的列表文件的完整目录.当CMake处理项目中的列表文件时,该变量将始终设置为当前正在处理的列表文件(CMAKE_CURRENT_LIST_FILE)所在的目录.该值具有动态范围.当CMake开始处理源文件中的命令时,它将此变量设置为此文件所在的目录.当CMake完成从文件处理命令时,它将恢复先前的值.因此,宏或函数内部变量的值是调用调用堆栈上最底部条目的文件的目录,而不是包含宏或函数定义的文件的目录.

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

sak*_*kra 104

变量CMAKE_CURRENT_SOURCE_DIRCMAKE_CURRENT_LIST_DIR可能涉及到不同的目录为通过与另一个文件包含一个CMake的列表文件中包含的命令.例如,如果a CMakeLists.txt存在于目录中project并包含以下指令

include(src/CMakeLists.txt)
Run Code Online (Sandbox Code Playgroud)

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

CMAKE_CURRENT_LIST_DIR当您需要找到位于CMakeLists.txt当前正在处理的文件旁边的模板文件或批处理脚本之类的资源文件时,它会派上用场.

  • +1.我只想添加`CMAKE_CURRENT_LIST_DIR`随每个你`include()`的文件而改变; 它不必被称为`CMakeLists.txt`. (33认同)
  • [这里的讨论](https://crascit.com/2016/01/31/enhanced-source-file-handling-with-target_sources/)关于如何有效地使用`CMAKE_CURRENT_LIST_DIR`和`include(...)`在你的项目中. (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

让我们假设我们通过将消息命令放入子文件夹 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