依赖其他目标的CMake虚拟目标

12

我有一个第三方项目,提供了许多库(假设是仅包含头文件的库)。我想为这个项目编写一个CMake封装:

文件foo.cmake

add_library(          foo-aaa INTERFACE IMPORTED GLOBAL)
set_target_properties(foo-aaa PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_LIST_DIR}/aaa/inc)

add_library(          foo-bbb INTERFACE IMPORTED GLOBAL)
set_target_properties(foo-bbb PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_LIST_DIR}/bbb/inc)

add_library(          foo-ccc INTERFACE IMPORTED GLOBAL)
set_target_properties(foo-ccc PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_LIST_DIR}/ccc/inc)

add_library(          foo-ddd INTERFACE IMPORTED GLOBAL)
set_target_properties(foo-ddd PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_LIST_DIR}/ddd/inc)

add_library(          foo-eee INTERFACE IMPORTED GLOBAL)
set_target_properties(foo-eee PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_LIST_DIR}/eee/inc)

[...] And many more

# For convenience I also want to provide 
# a global/dummy target depending on all above libraries
add_library( foo ????? )

主要CMakeLists.txt

cmake_minimum_required(VERSION 3.1)
project(bar CXX)
include(path/to/3rdparty/foo/foo.cmake)
add_executable(bar bar.cpp)
target_link_libraries(bar foo)

问题:
如何编写一个虚拟目标foo,它依赖于所有其他目标?

2个回答

11
假设您不想要一个包含所有库的库,您可能需要这个替代品:
add_custom_target( foo )
add_dependencies( foo foo-aaa foo-bbb foo-ccc )

10
在我写问题的过程中,我得到了答案。我的解决方案是创建一个INTERFACE目标而不是使用INCLUDE_DIRECTORIES。
add_library(foo INTERFACE)
target_link_libraries(foo foo-aaa foo-bbb foo-ccc foo-ddd foo-eee [...])

希望这个答案能帮助到某些人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接