【问题标题】:CMake custom target name conflicts between subdirectoriesCMake子目录之间的自定义目标名称冲突
【发布时间】:2017-09-18 08:22:32
【问题描述】:

我正在编写一个游戏引擎,我有一个名为 thirdparty 的目录,其中放置了我的引擎使用的所有外部库:

thirdparty/...
          /zlib
          /freetype2
          /SDL2
          /...

所以,引擎目录结构如下:

engine/actors
engine/memory_allocator
engine/renderer
engine/...
engine/thirdparty
engine/thirdparty/CMakeLists.txt
engine/CMakeLists.txt

engine/CMakeLists.txt:

cmake_minimum_required (VERSION 3.2)

project(Engine)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Werror")
# Include build directory to be able to include generated files:
set(CMAKE_INCLUDE_CURRENT_DIR ON)
file(GLOB GLAD_SOURCES thirdparty/glad/src/glad.c)
file(GLOB ACTOR_SOURCES actors/*.cpp)
file(GLOB LOGIC_SOURCES logic/*.cpp)
file(GLOB UI_SOURCES ui/*.cpp)
set(SOURCES ${GLAD_SOURCES}
            ${ACTOR_SOURCES}
            ${LOGIC_SOURCES}
            ${UI_SOURCES})
add_library(engine SHARED ${SOURCES})

include_directories(thirdparty/glm/)
include_directories(thirdparty/glad/include)
include_directories(thirdparty/tinyxml2/)
include_directories(thirdparty/zlib/)
include_directories(thirdparty/sdl2/SDL2-2.0.5/)
include_directories(./)
add_subdirectory(../../thirdparty thirdparty)

target_link_libraries(engine SDL2)
target_link_libraries(engine tinyxml2)
target_link_libraries(engine zlib)

engine/thirdparty/CMakeLists.txt:

set(BUILD_CPU_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_EXTRAS OFF CACHE BOOL "" FORCE)
set(BUILD_BULLET2_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_UNIT_TESTS OFF CACHE BOOL "" FORCE)
set(FREETYPE_NO_DIST OFF CACHE BOOL "" FORCE)

set(OLD_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "")
# add_subdirectory(bullet3)

set(CMAKE_CXX_FLAGS "${OLD_CXX_FLAGS}")
add_subdirectory(freetype2)

set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
add_subdirectory(tinyxml2)

add_subdirectory(sdl2/SDL2-2.0.5/)

add_subdirectory(zlib)

所以,主引擎CMakeLists.txt在引擎源码根目录下,另外一个CMakeLists.txt在引擎根目录下thirdparty子目录下构建第三方库。

问题是第三方中的某些子目录,例如SDL2和zlib包含相同的目标名称,通过add_custom_target添加,因此CMake无法生成Makefile,因为这种命名冲突:

zlib 的 CMakeLists.txt(最后):

# uninstall target
if(NOT TARGET uninstall)
  configure_file(
      "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
      "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
      IMMEDIATE @ONLY)

  add_custom_target(uninstall
      COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()

SDL2 的 CMakeLists.txt:

##### Uninstall target #####

configure_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
    IMMEDIATE @ONLY)

add_custom_target(uninstall
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)

所以最后的错误是:

CMake Error at /home/user/engine/thirdparty/sdl2/SDL2-2.0.5/CMakeLists.txt:1624 (add_custom_target):
  add_custom_target cannot create target "uninstall" because another target
  with the same name already exists.  The existing target is a custom target
  created in source directory
  "/home/user/engine/thirdparty/zlib".  See
  documentation for policy CMP0002 for more details.

有没有办法解决这个问题?也许,有一种方法可以通过添加任何前缀来重命名这些目标,这样它们就不会发生冲突?

【问题讨论】:

  • 目标必须是唯一的。但是,为什么不只使用一个唯一的名称,例如:add_custom_target(zlib_uninstall ...)add_custom_target(sdl2_uninstall ...)
  • @SteveLorimer 这些不是我的项目,我无法更改他们的CMakeLists.txt,所以问题是我可以在不修改他们的文件的情况下做什么?
  • 不要捆绑(使用 find_package() 与 FindSDL2.cmake 和 FindZlib.cmake 东西)。其他选项是捆绑并使用ExternalProject_Add()

标签: c++ cmake


【解决方案1】:

这主要取决于您所针对的生成器。对它们施加限制的解决方案是使用ALLOW_DUPLICATE_CUSTOM_TARGETS

根据文档:

允许创建重复的自定义目标。

它只适用于 Makefile 生成器:

对于只关心 Makefile 生成器并且不希望支持 Xcode 或 VS IDE 生成器的项目,可以将此属性设置为 true 以允许重复的自定义目标。

否则请考虑不直接将依赖项与项目打包并使用周围的其他工具(如Find*)将它们与目标系统上的正确路径一起获取。

【讨论】:

  • 感谢您的回答,我已投赞成票。但是,在我看来,更好的解决方案是使用@Velkan 所说的ExternalProject 模块。
  • @VictorPolevoy 是的,我确实在类似的情况下使用过外部项目。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多