来自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处理完文件中得命令时,它将还原为以前得值.因此,宏或函数内得变量值是调用堆栈回退中最底层项得文件得目录,而不是包含宏或函数定义得文件得目录.
在什么情况下,这些变量会有不同的值?
2条答案
按热度按时间ecfsfe2w1#
变量
CMAKE_CURRENT_SOURCE_DIR
和CMAKE_CURRENT_LIST_DIR
可以引用CMake列表文件的不同目录,该文件通过include命令包含在另一个文件中。例如,如果CMakeLists.txt
存在于project
目录中,并且包含以下指令则当处理x1M4N1x时,x1M5N1x将引用x1M6N1x,而x1M7N1x仍然指向外部目录x1M8N1x。
当您需要查找位于当前正在处理的
CMakeLists.txt
文件旁边的资源文件(如模板文件或批处理脚本)时,CMAKE_CURRENT_LIST_DIR
会派上用场。注意:当使用
add_subdirectory()
命令而不是include()
时,行为是不同的,并且当正在处理src/CMakeLists.txt
时,两个变量都将指向project/src
。bqujaahr2#
定义
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的值。
示例
让项目结构如下:
让我们假设我们通过将消息命令放入子文件夹B中CMakeList.txt文件来打印所有cmake变量
CMAKE_SOURCE_DIR
将是源目录,即“项目路径/A”。PROJECT_SOURCE_DIR
将是“path to project/A”,因为include命令不会创建新的作用域,并且最近的CMakeList.txt文件(具有自己的作用域并包含项目命令)位于文件夹A中。CMAKE_CURRENT_SOURCE_DIR
将是“path to project/A”,因为include命令不会创建新的作用域,并且最近的具有自己作用域的CMakeList.txt文件位于文件夹A中。CMAKE_CURRENT_LIST_DIR
将是“项目/A/B的路径”,因为当前处理的文件在子文件夹B中。CMAKE_SOURCE_DIR
将是源目录,即“项目路径/A”。PROJECT_SOURCE_DIR
将是“path to project/A/B”,因为add_subdirectory命令创建了一个新的作用域,并且最近的CMakeList.txt文件(具有自己的作用域并包含项目命令)位于子文件夹B中。CMAKE_CURRENT_SOURCE_DIR
将是“path to project/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