一开始我有一堆单独处理的CMake项目:每个项目都有自己的目标,用于生成名为 doc 的文档。现在我需要用超级项目包装所有这些项目:问题是超级项目编译失败抱怨存在多个具有相同名称 doc 的目标。
我认为简单的解决方案是在每个 doc 目标前加上项目名称,但它不能让我满意。
我希望不在编译单个子项目时使用make projectX_doc
并在编译时生成全局目标make doc
以生成所有项目的文档超项目。
我的要求可能吗?是否有任何机制来处理目标冲突?
答案 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