2015-06-05 170 views
1

是否可以像C++中一样使用CMake INCLUDE命令。CMake递归包含模块

在我所有的项目,我必须做出同样包括:

例如:为的CMakeLists.txt “MyApplication的”

INCLUDE("FindMyBase") 
INCLUDE("FindMyGtk") 

在这个例子中FindMyGtk已经有 “FindMyBase” 在里面。 那么,为什么我需要包括FindMyBaseMyApplication? 一旦包含一个.cmake文件,是否有办法让它可用于下面链中的所有其他项目?

  • 更新1:这个想法是为了避免每次搜索MyBase,如果它已经被发现一次。

  • 更新2:目标也是减少包含的数量。在我的例子,从2比1,但如果你有10个包括,那么你可以减少他们刚刚2,如果这2取决于其他8

+0

您能否提供[MCVE](http://stackoverflow.com/help/mcve)以显示需要多次包含哪些内容? –

+2

查找 .cmake模块通常不是直接使用,而是通过调用find_package()。这应该照顾重复的呼叫。 http://www.cmake.org/cmake/help/v3.0/command/find_package.html – Finn

+0

我已经给我的答案增加了一些信息;这有帮助吗? – Fraser

回答

2

它几乎没有做到这一点。我想像include,就好像你将包含文件的内容直接粘贴到你调用它的CMakeLists.txt文件中一样。

在你的情况下,“FindMyBase”被调用两次。这通常不重要 - 例如如果包含文件仅定义函数或宏,则包含多次是安全的。

如果包含的文件使用CMake收集的find_XXX函数搜索组件,那么这些函数已经做了你想做的。搜索的结果被缓存。在后续调用中,如果此缓存结果显示组件已被找到,则不再进行搜索。

如果你想(或有),以避免包括相同的文件多次,您可以添加包括警卫文件以类似的方式顶到C++有卫兵:

if(FindMyBaseIncluded) 
    return() 
endif() 
set(FindMyBaseIncluded TRUE) 

这样,包括文件多次几乎是免费的。

+0

因此,在每个Find.cmake文件中,我需要为所有依赖项放置INCLUDE(Find)。这是我现在正在尝试的。 –

+1

请注意,CMake 3.10引入了一个['include_guard'](https://cmake.org/cmake/help/v3.10/command/include_guard.html#command:include_guard)命令,以免你必须编写包含守卫用手。 – ComicSansMS