假设我的项目的CMakeLists.txt包含foo.cmake
include(foo)在foo.cmake中,我想知道foo.cmake的路径。
我该怎么做呢?
请注意,CMAKE_CURRENT_LIST_DIR给出了包含CMakeLists.txt的目录,而不是包含的foo.cmake的目录,因此不是我想要的。
当然,foo.cmake可能包含在几个项目中(例如,包含在几个CMakeLists.txt文件中)。
发布于 2012-10-12 15:53:41
人们已经报道了关于CMAKE_CURRENT_LIST_DIR行为的看似矛盾的事实。现在我知道混淆的原因了:
首先,在我的Linux环境中:
$ cd /path/to/home
$ mkdir cmake-test
$ cd cmake-test
$ mkdir source
$ mkdir source/subdirectory
$ mkdir build 我创建了这两个文件:
$ cat source/CMakeLists.txt
include(subdirectory/foo.cmake)
$ cat source/subdirectory/foo.cmake
message("CMAKE_CURRENT_LIST_DIR is ${CMAKE_CURRENT_LIST_DIR}") 根据弗雷泽和罗伯特·戴利的报道,CMake的工作原理如下:
$ cd build
$ cmake ../source
CMAKE_CURRENT_LIST_DIR is /path/to/home/cmake-test/source/subdirectory
[...] 但是,我向从CMakeLists.txt调用的foo.cmake添加了一个函数:
$ cat ../source/subdirectory/foo.cmake
message("CMAKE_CURRENT_LIST_DIR is ${CMAKE_CURRENT_LIST_DIR}")
function(bar)
message("CMAKE_CURRENT_LIST_DIR in bar() is ${CMAKE_CURRENT_LIST_DIR}")
endfunction()
$ cat ../source/CMakeLists.txt
include(subdirectory/foo.cmake)
bar() 然后:
$ cmake ../source
CMAKE_CURRENT_LIST_DIR is /path/to/home/cmake-test/source/subdirectory
CMAKE_CURRENT_LIST_DIR in bar() is /path/to/home/cmake-test/source
[...] 因此,在包含foo.cmake和调用bar()时,foo.cmake中的CMAKE_CURRENT_LIST_DIR的值是不同的。这是根据CMAKE_CURRENT_LIST_DIR的规范。
下面是从bar()中访问foo.cmake目录的一种可能的解决方案:
$ cat ../source/subdirectory/foo.cmake
set(DIR_OF_FOO_CMAKE ${CMAKE_CURRENT_LIST_DIR})
function(bar)
message("DIR_OF_FOO_CMAKE in bar() is ${DIR_OF_FOO_CMAKE}")
endfunction() 之后,我得到了我正在寻找的行为:
$ cmake ../source
DIR_OF_FOO_CMAKE in bar() is /path/to/home/cmake-test/source/subdirectory
[...] 发布于 2012-10-11 03:40:17
当前正在处理的列表文件的完整目录。
在CMake处理项目中的列表文件时,此变量将始终设置为当前正在处理的列表文件(CMAKE_CURRENT_LIST_FILE)所在的目录。该值具有动态作用域。当CMake开始处理源文件中的命令时,它会将此变量设置为此文件所在的目录。当CMake处理完文件中的命令时,它会恢复以前的值。因此,宏或函数内变量的值是调用调用堆栈最底层条目的文件的目录,而不是包含宏或函数定义的文件的目录。
示例
我有以下结构:
C:\Work\cmake-test\CMakeLists.txt
C:\Work\cmake-test\subfolder\test.cmake在我的CMakeLists.txt
include( subfolder/test.cmake )在我的test.cmake
message( "Current dir: ${CMAKE_CURRENT_LIST_DIR}" )当我从C:\Work\cmake-test运行CMake时得到的结果是:
测试当前目录:c:/
/cmake-test/子文件夹
发布于 2020-05-16 22:32:22
它在函数定义之外是未定义的。
function(foo)
configure_file(
"${CMAKE_CURRENT_FUNCTION_LIST_DIR}/some.template.in"
some.output
)
endfunction()在CMake 3.17之前,CMAKE_CURRENT_FUNCTION_LIST_DIR功能必须通过CMAKE_CURRENT_LIST_DIR近似使用以下解决方法(取自CMake文档):
set(_THIS_MODULE_BASE_DIR "${CMAKE_CURRENT_LIST_DIR}")
function(foo)
configure_file(
"${_THIS_MODULE_BASE_DIR}/some.template.in"
some.output
)
endfunction()https://stackoverflow.com/questions/12802377
复制相似问题