Установите целевые зависимости с помощью cmake - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть проект, который должен установить библиотеку stati c и все ее зависимости. Одна из этих зависимостей: boost.

У меня есть что-то вроде следующего, но это не работает:

cmake_minimum_required(VERSION 3.9.0)

project(install_test)

find_package(Boost REQUIRED COMPONENTS system)

set(Boost_USE_STATIC_LIBS TRUE)

add_executable(test src/main.cpp)

target_link_libraries(test Boost::boost)

add_dependencies(test Boost::boost)

install(TARGETS test DESTINATION ${CMAKE_INSTALL_LIBDIR})

install(TARGETS Boost::boost DESTINATION ${CMAKE_INSTALL_LIBDIR})

Примечание: boost можно найти, если я удалю последний install оператор все работает.

Как это сделать?

1 Ответ

0 голосов
/ 29 февраля 2020

Поскольку установка может происходить на том же компьютере (на котором должна быть скомпилирована ваша библиотека), а библиотека Boost уже установлена ​​(поскольку ее можно найти), вы должны экспортировать свою библиотеку с ее зависимостями через Config Файл .cmake. Все зависимости должны быть найдены через find_dependency (я не думаю, что вы хотите скопировать все библиотеки boost). Он будет искать необходимые пакеты при связывании с вашей установленной библиотекой.

$ {PROJECT_NAME} Config.cmake.in file

@PACKAGE_INIT@

include(CMakeFindDependencyMacro)

find_dependency(glad REQUIRED)
find_dependency(glm REQUIRED)

include("${CMAKE_CURRENT_LIST_DIR}/@targets_export_name@.cmake")

check_required_components(gl_traits)

CMakeLists.txt

#... define here sources and public headers

add_library(${PROJECT_NAME}
    STATIC
        ${PUBLIC_HEADERS}

        ${SOURCES}
    )

set_target_properties(${PROJECT_NAME}
    PROPERTIES

        OUTPUT_NAME ${PROJECT_NAME}
        DEBUG_POSTFIX "_d"

    )

target_link_libraries(${PROJECT_NAME}
    PUBLIC
        Boost::boost
    )

target_include_directories(${PROJECT_NAME}
    PUBLIC
        $<INSTALL_INTERFACE:${INSTALL_INCLUDEDIR}/${PROJECT_NAME}>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/${PROJECT_NAME}>

    PRIVATE
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
    )

set(targets_export_name ${PROJECT_NAME}Targets)
set(project_config ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake)
set(version_config ${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake)

include(CMakePackageConfigHelpers)

write_basic_package_version_file(
        ${version_config}
    VERSION
        ${PROJECT_VERSION}
    COMPATIBILITY SameMajorVersion
    )

configure_package_config_file(
        ${PROJECT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in
        ${project_config}
    INSTALL_DESTINATION
        ${INSTALL_CMAKEDIR}
    )

install(TARGETS
        ${PROJECT_NAME}
    EXPORT
        ${targets_export_name}
    ARCHIVE
        DESTINATION ${INSTALL_LIBDIR}
        COMPONENT lib
    LIBRARY
        DESTINATION ${INSTALL_LIBDIR}
        COMPONENT lib
    RUNTIME
        DESTINATION ${INSTALL_BINDIR}
        COMPONENT bin
    )

install(EXPORT
        ${targets_export_name}
    DESTINATION
        ${INSTALL_CMAKEDIR}
    )

install(FILES ${PUBLIC_HEADERS} DESTINATION ${INSTALL_INCLUDEDIR}/${PROJECT_NAME} COMPONENT dev)
install(FILES 
        ${project_config}
        ${version_config}
    DESTINATION
        ${INSTALL_CMAKEDIR}
    )

Если вам нужно установить целевые файлы, используйте $<TARGET_FILE:target_name>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...