CMAKE_CURRENT_SOURCE_DIR和CMAKE_CURRENT_LIST_DIR之间的差异

myss37ts  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(262)

来自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处理完文件中得命令时,它将还原为以前得值.因此,宏或函数内得变量值是调用堆栈回退中最底层项得文件得目录,而不是包含宏或函数定义得文件得目录.

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

ecfsfe2w

ecfsfe2w1#

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

include(src/CMakeLists.txt)

则当处理x1M4N1x时,x1M5N1x将引用x1M6N1x,而x1M7N1x仍然指向外部目录x1M8N1x。
当您需要查找位于当前正在处理的CMakeLists.txt文件旁边的资源文件(如模板文件或批处理脚本)时,CMAKE_CURRENT_LIST_DIR会派上用场。
注意:当使用add_subdirectory()命令而不是include()时,行为是不同的,并且当正在处理src/CMakeLists.txt时,两个变量都将指向project/src

bqujaahr

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的值。

示例

让项目结构如下:

A/
=> CMakeList.txt
=> B/
   => CMakeList.txt

让我们假设我们通过将消息命令放入子文件夹B中CMakeList.txt文件来打印所有cmake变量

  • 如果文件夹A中的CMakeList.txt包含一行include(“B/CMakeList.txt”),则

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中。

  • 如果CMakeList.txt包含add_subdirectory行(“./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

相关问题