首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CMake中,如何找到包含文件的目录?

问在CMake中,如何找到包含文件的目录?
EN

Stack Overflow用户
提问于 2012-10-09 22:33:09
回答 4查看 28.5K关注 0票数 56

假设我的项目的CMakeLists.txt包含foo.cmake

代码语言:javascript
复制
include(foo)

在foo.cmake中,我想知道foo.cmake的路径。

我该怎么做呢?

请注意,CMAKE_CURRENT_LIST_DIR给出了包含CMakeLists.txt的目录,而不是包含的foo.cmake的目录,因此不是我想要的。

当然,foo.cmake可能包含在几个项目中(例如,包含在几个CMakeLists.txt文件中)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-12 15:53:41

人们已经报道了关于CMAKE_CURRENT_LIST_DIR行为的看似矛盾的事实。现在我知道混淆的原因了:

首先,在我的Linux环境中:

代码语言:javascript
复制
$ cd /path/to/home  
$ mkdir cmake-test  
$ cd cmake-test  
$ mkdir source  
$ mkdir source/subdirectory  
$ mkdir build  

我创建了这两个文件:

代码语言:javascript
复制
$ cat source/CMakeLists.txt  
include(subdirectory/foo.cmake)  

$ cat source/subdirectory/foo.cmake  
message("CMAKE_CURRENT_LIST_DIR is ${CMAKE_CURRENT_LIST_DIR}")  

根据弗雷泽和罗伯特·戴利的报道,CMake的工作原理如下:

代码语言:javascript
复制
$ cd build  
$ cmake ../source  
CMAKE_CURRENT_LIST_DIR is /path/to/home/cmake-test/source/subdirectory  
[...]  

但是,我向从CMakeLists.txt调用的foo.cmake添加了一个函数:

代码语言:javascript
复制
$ 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()  

然后:

代码语言:javascript
复制
$ 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目录的一种可能的解决方案:

代码语言:javascript
复制
$ 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()  

之后,我得到了我正在寻找的行为:

代码语言:javascript
复制
$ cmake ../source  
DIR_OF_FOO_CMAKE in bar() is /path/to/home/cmake-test/source/subdirectory  
[...]  
票数 81
EN

Stack Overflow用户

发布于 2012-10-11 03:40:17

请参阅CMAKE_CURRENT_LIST_DIR

当前正在处理的列表文件的完整目录。

在CMake处理项目中的列表文件时,此变量将始终设置为当前正在处理的列表文件(CMAKE_CURRENT_LIST_FILE)所在的目录。该值具有动态作用域。当CMake开始处理源文件中的命令时,它会将此变量设置为此文件所在的目录。当CMake处理完文件中的命令时,它会恢复以前的值。因此,宏或函数内变量的值是调用调用堆栈最底层条目的文件的目录,而不是包含宏或函数定义的文件的目录。

示例

我有以下结构:

代码语言:javascript
复制
C:\Work\cmake-test\CMakeLists.txt
C:\Work\cmake-test\subfolder\test.cmake

在我的CMakeLists.txt

代码语言:javascript
复制
include( subfolder/test.cmake )

在我的test.cmake

代码语言:javascript
复制
message( "Current dir: ${CMAKE_CURRENT_LIST_DIR}" )

当我从C:\Work\cmake-test运行CMake时得到的结果是:

测试当前目录:c:/

/cmake-test/子文件夹

票数 9
EN

Stack Overflow用户

发布于 2020-05-16 22:32:22

它在函数定义之外是未定义的。

代码语言:javascript
复制
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文档):

代码语言:javascript
复制
set(_THIS_MODULE_BASE_DIR "${CMAKE_CURRENT_LIST_DIR}")

function(foo)
  configure_file(
    "${_THIS_MODULE_BASE_DIR}/some.template.in"
    some.output
  )
endfunction()
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12802377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档