Как установить пакетные зависимости интерфейса с современным CMake?

Как правильно установить пакетные зависимости интерфейса в Modern CMake?

У меня есть библиотека MyLib который имеет зависимость интерфейса от libDep (MyLib.hpp содержит #include <libDep.h>). Все, что зависит от MyLib также транзитивно зависит от libDep,

libDep это один заголовок, взятый из сущности, поэтому я включил его в состав дерева исходных текстов MyLib

$ tree
.
├── CMake
│   ├── MyLibConfig.cmake.in
│   └── modules
│       └── FindlibDep.cmake
├── CMakeLists.txt
├── include
│   └── MyLib
│       └── MyLib.hpp
├── src
│   └── MyLib.cpp
└── third_party
└── libDep
└── libDep.h

Я хотел бы установить libDep с myLib, с пути вроде include/MyLib/third_party/libDep,


Вот CMakeLists для MyLib

cmake_minimum_required(VERSION 3.3.0)
Project(MyLib
DESCRIPTION "Library with bundled interface dependency"LANGUAGES CXX)

include(GNUInstallDirs)
include(CMakePackageConfigHelpers)

set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake/modules)

# Find LibDep dependency
find_package(libDep REQUIRED)

# MyLib library
add_library(MyLib STATIC
${CMAKE_SOURCE_DIR}/src/MyLib.cpp)

target_include_directories(MyLib
PUBLIC $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include/MyLib>
PUBLIC $<INSTALL_INTERFACE:include/MyLib>)

target_link_libraries(MyLib
INTERFACE libDep)

MyLib Находит libDep с FindlibDep.cmake находится в CMAKE_MODULE_PATH

find_path(LibDep_INCLUDE_DIR
NAMES LibDep.hpp
PATHS third_party/libDep)
PATH_SUFFIXES Mylib/third_party/libDep)

mark_as_advanced(LibDep_FOUND LibDep_INCLUDE_DIR)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LibDep
REQUIRED_VARS
LibDep_INCLUDE_DIR
)

if(LibDep_FOUND)
set(LibDep_INCLUDE_DIRS ${LibDep_INCLUDE_DIR})
endif()

if(LibDep_FOUND AND NOT TARGET MyLib::LibDep)
add_library(MyLib::LibDep INTERFACE IMPORTED)
set_target_properties(MyLib::LibDep PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${LibDep_INCLUDE_DIR})
endif()

Я устанавливаю MyLib лайк

install(TARGETS MyLib
EXPORT MyLibTargets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
INCLUDES DESTINATION include)

include(CMakePackageConfigHelpers)
write_basic_package_version_file(MyLibConfigVersion.cmake)

install(EXPORT MyLibTargets
FILE MyLibTargets.cmake
NAMESPACE MyLib::
DESTINATION lib/cmake/MyLib)

configure_file(CMake/MyLibConfig.cmake.in MyLibConfig.cmake @ONLY)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake""${CMAKE_CURRENT_BINARY_DIR}/MyLibConfigVersion.cmake"DESTINATION lib/cmake/MyLib)

install(DIRECTORY ${MyLib_PUBLIC_INCLUDE_DIR}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

# Package with CPack
include(InstallRequiredSystemLibraries)
include(CPack)

MyLibConfig.cmake.in объявляет зависимость от libDep

include(CMakeFindDependencyMacro)

# Dependencies
add_library(libDep REQUIRED)

# Add the targets file
include("${CMAKE_CURRENT_LIST_DIR}/MyLibTargets.cmake")

libDep установлен в MyLibдерево с

install(DIRECTORY ${libDep_INCLUDE_DIRS}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/MyLib/third_party)

и я копирую модуль поиска с

install(FILES
${CMAKE_MODULE_PATH}/FindlibDep.cmake
DESTINATION lib/cmake/MyLib)

К сожалению, пользователи MyLib не вижу FindlibDep.cmake по умолчанию

$ cmake ..
CMake Error at /usr/share/cmake-3.10/Modules/CMakeFindDependencyMacro.cmake:48 (find_package):
By not providing "FindlibDep.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "libDep", but
CMake did not find one.

Could not find a package configuration file provided by "libDep" with any
of the following names:

libDepConfig.cmake
libDep-config.cmake

Add the installation prefix of "libDep" to CMAKE_PREFIX_PATH or set
"libDep_DIR" to a directory containing one of the above files.  If "libDep"provides a separate development package or SDK, be sure it has been
installed.
Call Stack (most recent call first):
/usr/local/lib/cmake/MyLib/MyLibConfig.cmake:5 (find_dependency)
CMakeLists.txt:9 (find_package)

-- Configuring incomplete, errors occurred!

Пользователь может найти вручную FindlibDep.cmake и добавить его к своим CMAKE_MODULE_PATH но этого не должно быть.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …