CMake多模块项目中的目标冲突

时间:2018-03-28 13:30:17

标签: cmake

一开始我有一堆单独处理的CMake项目:每个项目都有自己的目标,用于生成名为 doc 的文档。现在我需要用超级项目包装所有这些项目:问题是超级项目编译失败抱怨存在多个具有相同名称 doc 的目标。

我认为简单的解决方案是在每个 doc 目标前加上项目名称,但它不能让我满意。

我希望在编译单个子项目时使用make projectX_doc并在编译时生成全局目标make doc以生成所有项目的文档超项目。

我的要求可能吗?是否有任何机制来处理目标冲突?

1 个答案:

答案 0 :(得分:0)

每个子项目都可以验证一个超级项目内是否有:

if("^${CMAKE_SOURCE_DIR}$" STREQUAL "^${PROJECT_SOURCE_DIR}$")
  set(IS_SUBPROJECT FALSE)
else()
  set(IS_SUBPROJECT TRUE)
endif()

因此,在您的项目CMakeLists.txt中,您可以这样做:

if (NOT IS_SUBPROJECT)
  set(DOC_TGT doc)
else()
  set(DOC_TGT ${PROJECT_NAME}_doc)
endif()
add_custom_target(${DOC_TGT} EXCLUDE_FROM_ALL ...

注意:您可以合并两个代码段以避免IS_SUBPROJECT变量

在你的超级项目CMakeLists.txt中:

add_custom_target(doc EXCLUDE_FROM_ALL
  DEPENDS projectX_doc projectY_doc...

因此,当你独立配置/构建每个子项目时  make doc否则,当您处于超级项目目标时,doc会成为元目标...

注意:您也可以使用此技巧修改默认选项等...
例如GFLAGS: https://github.com/gflags/gflags/blob/master/CMakeLists.txt#L126

https://github.com/gflags/gflags/blob/master/cmake/utils.cmake#L61
https://github.com/gflags/gflags/blob/master/CMakeLists.txt#L163