使用相同目标编译不同子项目时出现CMP0002错误

问题描述 投票:0回答:3

我有很多子文件夹

home
|
|-library1
|-library2
|
|-libraryn

每个子文件夹都包含一个可以自行编译的完整库(每个库都有不同的维护器)。到目前为止,它工作正常,我使用脚本编译它们。

现在我需要创建另一个库,它依赖于现有的库。为此,我在主文件夹下创建了一个

CMakeLists.txt
,使用
add_subdirectory
命令来编译所有库。

我有类似的东西

cmake_minimum_required (VERSION 2.8)

add_subdirectory(library1)
add_subdirectory(library2)
...
add_subdirectory(libraryn)

当我尝试执行

cmake
时,我收到各种库的以下错误:

CMake Error at libraryY/CMakeLists.txt:63 (add_custom_target):
  add_custom_target cannot create target "doc" because another target with
  the same name already exists.  The existing target is a custom target
  created in source directory
  "/path/to/libraryX".  See
  documentation for policy CMP0002 for more details.

发生这种情况是因为我们在每个库中创建了一个 doc 目标,以便编译库本身的 Doxygen 文档。当库被一一编译时它可以正常工作,但是对于大师

CMakeLists.txt
我似乎无法做到这一点。

# Create doc target for doxygen documentation compilation.
find_package (Doxygen)
if (DOXYGEN_FOUND)
  set (Doxygen_Dir ${CMAKE_BINARY_DIR}/export/${Library_Version}/doc)
  # Copy images folder
  file (GLOB IMAGES_SRC "images/*")
  file (COPY ${IMAGES_SRC} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/images)
  configure_file (${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
  add_custom_target (doc
    ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "Generating doxygen documentation" VERBATIM
  )
else (DOXYGEN_FOUND)
  message (STATUS "Doxygen must be installed in order to compile doc")
endif (DOXYGEN_FOUND)

有没有办法一次性编译这些项目而不修改这个目标?

cmake target
3个回答
4
投票

如果您不想修改任何内容,以便可以将所有这些项目构建为子项目,那么您可以使用 ExternalProject_Add 来构建和安装依赖项。

选项

或者,您可以使用 option 命令从构建中排除

doc
目标:

# Foo/CMakeLists.txt
option(FOO_BUILD_DOCS "Build doc target for Foo project" OFF)
# ...
if(DOXYGEN_FOUND AND FOO_BUILD_DOCS)
  add_custom_target(doc ...)
endif()

# Boo/CMakeLists.txt
option(BOO_BUILD_DOCS "Build doc target for Boo project" OFF)
# ...
if(DOXYGEN_FOUND AND BOO_BUILD_DOCS)
  add_custom_target(doc ...)
endif()

1
投票
if (NOT (TARGET DOCUMENTATION))
    add_custom_target(DOCUMENTATION COMMENT "workaround for multi-dependencies project")
    add_dependencies(DOCUMENTATION DOCUMENTATION_${PROJECT_NAME})
endif()

我已经对此进行了测试并在现实生活中使用了它。 它适用于多个项目。


0
投票

我们也在每个库中使用选项来通过构建目标启用“工具”。

将多个库与相同的“工具”组合时,您需要确保选项具有特定于项目的命名。

否则,为与子存储库中同名的存储库启用选项会给出相同的错误消息。

为了解决这个问题,我们遵循一个简单的命名模式: 例如


option(<projectSpecifier>_DOXYGEN "doxygen ..." OFF)
option(<projectSpecifier>_COVERAGE "gcov ..." OFF)
...

这样,您可以在开发库时启用这些设置(例如 CMakePresets.json),但在与

add_subdirectory
使用库时保持禁用状态。

© www.soinside.com 2019 - 2024. All rights reserved.