维基百科:
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完成从文件中处理命令时,它将恢复以前的值。因此,宏或函数中变量的值是调用堆栈中最底层条目的文件的目录,而不是包含宏或函数定义的文件的目录。
在什么情况下,这些变量会持有不同的值?
发布于 2021-05-17 10:59:48
定义
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变量。
CMAKE_SOURCE_DIR
将是源目录,即“到项目/A的路径”。
PROJECT_SOURCE_DIR
将是“到项目/ A的路径”,因为CMakeList.txt命令不会创建新的作用域,而且最近的CMakeList.txt文件具有自己的作用域并包含项目命令,位于文件夹A中。
CMAKE_CURRENT_SOURCE_DIR
将是“到项目/ A的路径”,因为CMakeList.txt命令不会创建新的作用域,而且离它最近的具有自己范围的CMakeList.txt文件位于文件夹A中。
CMAKE_CURRENT_LIST_DIR
将是“项目/A/ B的路径”,因为当前处理的文件位于子文件夹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
https://stackoverflow.com/questions/15662497
复制相似问题