在CMake中,如何找到包含文件的目录? [英] In CMake, how can I find the directory of an included file?

查看:193
本文介绍了在CMake中,如何找到包含文件的目录?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  include(foo)

c $ c> foo.cmake ,我想知道 foo.cmake 的路径。

如何做到这一点?



请注意, CMAKE_CURRENT_LIST_DIR 会给出包括 CMakeLists.txt ,而不是包含的 foo.cmake ,因此不是我想要的。当然, foo.cmake 可能包含在几个项目中(也就是由几个 CMakeLists .txt files)。

解决方案

人们报告了CMAKE_CURRENT_LIST_DIR行为表面上看似矛盾的事实。现在我知道了造成混乱的原因:

首先,在我的Linux环境中:

 < code $ cd / path / to / home 
$ mkdir cmake-test
$ cd cmake-test
$ mkdir源
$ mkdir源/子目录
$ mkdir build

我创建了这两个文件:

  $ cat source / CMakeLists.txt 
include(子目录/ foo.cmake)

$ cat source / subdirectory / foo.cmake
消息(CMAKE_CURRENT_LIST_DIR是$ {CMAKE_CURRENT_LIST_DIR})

Robert Dailey:
$ b

  $ cd build 
$ cmake ../source
CMAKE_CURRENT_LIST_DIR is / path / to / home / cmake-test / source / subdirectory
[...]

我添加了一个函数foo.cmake,我从CMakeLists.txt中调用:
$ b $ $ $ $ $ $ $ $ $ $ .. ../source/subdirectory/ foo.cmake
消息(CMAKE_CURRENT_LIST_DIR is $ {CMAKE_CURRENT_LIST_DIR})
函数(bar)
message(bar()中的CMAKE_CURRENT_LIST_DIR是$ {CMAKE_CURRENT_LIST_DIR})
endfunction()

$ cat ../source/CMakeLists.txt
include(子目录/ foo.cmake)
bar()

然后:

  $ cmake ../source 
CMAKE_CURRENT_LIST_DIR是/ path / to / home / cmake-test / source / subdirectory
bar()中的CMAKE_CURRENT_LIST_DIR是/ path / to / home / cmake-test / source
[...]
因此,foo.cmake中CMAKE_CURRENT_LIST_DIR的值在包含foo.cmake和调用bar()时是不相同的。这是根据CMAKE_CURRENT_LIST_DIR的规范。



这是从bar()中访问foo.cmake目录的一个可能的解决方案:

  $ cat ../source/subdirectory/foo.cmake 
set(DIR_OF_FOO_CMAKE $ {CMAKE_CURRENT_LIST_DIR})
function(bar)
消息(bar()中的DIR_OF_FOO_CMAKE是$ {DIR_OF_FOO_CMAKE})
endfunction()



$ p
$ b $ $ $ $ c $ $ $ $ $ $ $ $ $ $ $ $ $ $ $在bar()中是/ path / to / home / cmake-test / source /子目录
[...]


Suppose my project's CMakeLists.txt includes foo.cmake:

include(foo)

In foo.cmake, i want to know the path of foo.cmake.
How can I do that?

Note that CMAKE_CURRENT_LIST_DIR gives the directory of the including CMakeLists.txt, not that of the included foo.cmake, and is thus not what I want.

Of course, foo.cmake might be included by several projects (i.e., by several CMakeLists.txt files).

解决方案

People have reported seemingly contradictory facts about how CMAKE_CURRENT_LIST_DIR behaves. Now I know the reason for the confusion:

First, in my Linux environment:

$ cd /path/to/home  
$ mkdir cmake-test  
$ cd cmake-test  
$ mkdir source  
$ mkdir source/subdirectory  
$ mkdir build  

I create these two files:

$ cat source/CMakeLists.txt  
include(subdirectory/foo.cmake)  

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

CMake works as reported by Fraser and Robert Dailey:

$ cd build  
$ cmake ../source  
CMAKE_CURRENT_LIST_DIR is /path/to/home/cmake-test/source/subdirectory  
[...]  

However, I add a function to foo.cmake, which I call from CMakeLists.txt:

$ 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()  

Then:

$ 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  
[...]  

So, the value of CMAKE_CURRENT_LIST_DIR in foo.cmake is not the same at the time foo.cmake is included and when bar() is called. This is according to the specification of CMAKE_CURRENT_LIST_DIR.

Here is one possible solution for accessing the directory of foo.cmake from within bar():

$ 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()  

after which I get the behavior I was looking for:

$ cmake ../source  
DIR_OF_FOO_CMAKE in bar() is /path/to/home/cmake-test/source/subdirectory  
[...]  

这篇关于在CMake中,如何找到包含文件的目录?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆