137

来自维基:

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

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

4

2 回答 2

174

变量CMAKE_CURRENT_SOURCE_DIRCMAKE_CURRENT_LIST_DIR可以引用 CMake 列表文件的不同目录,该文件由包含命令的另一个文件包含。例如,如果 aCMakeLists.txt存在于目录中project并包含以下指令

include(src/CMakeLists.txt)

然后 whilesrc/CMakeLists.txt正在处理CMAKE_CURRENT_LIST_DIR将引用project/srcwhileCMAKE_CURRENT_SOURCE_DIR仍然指向外部目录project

CMAKE_CURRENT_LIST_DIRCMakeLists.txt当您需要查找位于当前正在处理的文件旁边的模板文件或批处理脚本等资源文件时,它会派上用场。


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

于 2013-03-27T18:49:54.810 回答
11

定义

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

于 2021-05-17T10:59:48.657 回答