CMake递归包含模块

时间:2015-06-05 11:09:54

标签: cmake

是否可以像在C ++中一样使用CMake INCLUDE命令。

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

示例:" MyApplication"

的CMakeLists.txt
INCLUDE("FindMyBase")
INCLUDE("FindMyGtk")

在此示例中, FindMyGtk 已经有" FindMyBase"在里面。 那么为什么我需要在 MyApplication 中包含 FindMyBase ? 有一个方法,一旦包含一个.cmake文件,它仍然可用于下面链中的所有其他项目吗?

  • 更新1:我们的想法是避免每次搜索MyBase,如果已经找到一次。

  • 更新2:目标也是减少包含数量。在我的例子中,从2到1,但如果你有10个包含,那么你可以将它们减少到只有2,如果这2个依赖于其他8个。

1 个答案:

答案 0 :(得分:2)

它几乎可以做到这一点。我将include可视化,就像您将包含文件的内容直接粘贴到您调用它的CMakeLists.txt文件中一样。

在您的情况下,“FindMyBase”被调用两次。这通常无关紧要 - 例如如果包含文件只定义函数或宏,则可以安全地包含多次。

如果包含的文件使用CMake的find_XXX函数集合搜索组件,那么这些已经完成了您想要的操作。搜索结果被缓存。在后续调用中,如果此缓存结果显示已找到该组件,则不再进行进一步搜索。

如果你想(或者有)避免多次包含同一个文件,你可以用类似于C ++包含警卫的方式在文件顶部添加包含警戒:

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

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