CMake 虚拟目标取决于其他目标
CMake dummy target depending on other targets
我有一个 3rdparty 项目提供了许多库(比方说 header-only 库)。我想为这个项目写一个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
?
在写问题时我得到了答案。我的解决方案是没有 INCLUDE_DIRECTORIES.
的 INTERFACE 目标
add_library(foo INTERFACE)
target_link_libraries(foo foo-aaa foo-bbb foo-ccc foo-ddd foo-eee [...])
希望这个回答能对某人有所帮助。
假设您不想要一个包含所有库的库,您可能需要这个:
add_custom_target( foo )
add_dependencies( foo foo-aaa foo-bbb foo-ccc )
我有一个 3rdparty 项目提供了许多库(比方说 header-only 库)。我想为这个项目写一个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
?
在写问题时我得到了答案。我的解决方案是没有 INCLUDE_DIRECTORIES.
的 INTERFACE 目标add_library(foo INTERFACE)
target_link_libraries(foo foo-aaa foo-bbb foo-ccc foo-ddd foo-eee [...])
希望这个回答能对某人有所帮助。
假设您不想要一个包含所有库的库,您可能需要这个:
add_custom_target( foo )
add_dependencies( foo foo-aaa foo-bbb foo-ccc )