【问题标题】:Dynamic subdirectories in a cmake buildcmake 构建中的动态子目录
【发布时间】:2018-12-04 18:32:29
【问题描述】:

我正在为我继承的项目设置 Cmake 构建环境。我有一个核心存储库,它创建一个可以加载“插件”(dll 目标)的目标。我想将每个插件保存在自己的存储库中(每个插件都代表一个特定的硬件平台,应该单独维护)。

我有一个名为“Plugins”的目录,将根据需要在其中克隆这些存储库文件夹。

如何使“插件”文件夹中的 CMakeLists.txt 添加所有插件文件夹而不为每个插件添加显式 add_subdirectory?

我的目标是允许提供源外配置和调试/发布目标的构建脚本也允许平台目标检出用户选择的平台的存储库,并按要求进行配置和构建。这件作品是唯一我不知道如何设置的作品。

【问题讨论】:

  • 如何使“插件”文件夹中的 CMakeLists.txt 添加所有插件文件夹而不为每个插件添加显式 add_subdirectory?我使用 CMake 宏获取子目录列表(使用文件 GLOB),然后使用 for 循环到 add_subdirectory()
  • 你能提供一个例子作为答案吗?

标签: cmake


【解决方案1】:

当我对示例程序执行此操作时,我有一个 CMake 宏来枚举当前文件夹的子目录:

#########################################################################################

macro(SUBDIRLIST result curdir)
  FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)
  SET(dirlist "")
  FOREACH(child ${children})
    IF(IS_DIRECTORY ${curdir}/${child})
        SET(dirlist ${dirlist} ${child})
    ENDIF()
  ENDFOREACH()
  SET(${result} ${dirlist})
endmacro()

然后使用此宏,我在包含子目录的文件夹中创建以下 CMakeLists.txt:

SUBDIRLIST(SUBDIRS ${CMAKE_CURRENT_SOURCE_DIR})

FOREACH(subdir ${SUBDIRS})
    ADD_SUBDIRECTORY(${subdir})
ENDFOREACH()

CMake 使用这个父文件夹生成时,它会使用 add_subidretory() 自动添加它包含的每个文件夹

【讨论】:

  • 这看起来与我之前遇到的这段代码几乎相同。 github.com/gwaldron/osgearth/issues/608 除非他们使用追加而不是设置将目录添加到列表中。我希望有一个内置的操作,但我想我可以解压这个过程。
  • 我们有可能从同一来源获得代码。我拥有的宏文件已有 5 年以上的历史了。
  • 我做了类似但展开的事情,我在 add_subdirectory() 调用之前添加了对每个子目录中是否存在 CmakeLists.txt 的检查,因为新项目是 git 子模块,所有插件目录我需要检查是严格可选的,子模块由 gitlab 权限控制,即使为空文件夹也将始终存在,即使没有插件存在,应用程序也必须构建。我会在时间允许的情况下更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 2013-09-20
相关资源
最近更新 更多