CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_LIST_DIR之间的差异


104

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

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


10
以及它们与简单和美观./有何不同?
kyb

Answers:


137

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

include(src/CMakeLists.txt)

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

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


42
+1。我会CMAKE_CURRENT_LIST_DIR随您添加的每个文件添加这些更改include();不必调用它CMakeLists.txt
Angew不再为

2
关于如何有效使用项目CMAKE_CURRENT_LIST_DIR以及如何include(...)在项目中进行很好的讨论
jmcarter9t

1
容易混淆,因为CMAKE_CURRENT_SOURCE_DIRCMAKE_SOURCE_DIR比文档所暗示的更相似。
玛拉基

和一起add_subdirectory()?两个变量都指向文件夹吗?
einpoklum
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.