在CMake中,如何找到包含文件的目录? [英] In CMake, how can I find the directory of an included file?
问题描述
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
因此,foo.cmake中CMAKE_CURRENT_LIST_DIR的值在包含foo.cmake和调用bar()时是不相同的。这是根据CMAKE_CURRENT_LIST_DIR的规范。
CMAKE_CURRENT_LIST_DIR是/ path / to / home / cmake-test / source / subdirectory
bar()中的CMAKE_CURRENT_LIST_DIR是/ path / to / home / cmake-test / source
[...]
这是从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屋!