CMake: правильная установка нескольких артефактов сборки - PullRequest
0 голосов
/ 16 февраля 2019

Я использую ADD_CUSTOM_TARGET для создания проекта make, который создает десятки статических библиотек.Затем я хочу install правильно, чтобы другие проекты могли использовать эти результаты сборки.Как именно я должен это сделать?

Как я понимаю, я должен создать цели для каждой библиотеки, а затем создать mylib-config.cmake, ссылаясь на эти цели.Посмотрев здесь и там, я придумал что-то вроде этого

#... here comes ADD_CUSTOM_TARGET to build my Makefile project...
FILE(WRITE "share/dpdk-config.cmake" "include(CMakeFindDependencyMacro)\n")
FILE(GLOB LIBS ${CMAKE_SOURCE_DIR}/build/lib/*.a)
FOREACH (LIB_FILE_NAME ${LIBS})
    GET_FILENAME_COMPONENT(LIB_NAME ${LIB_FILE_NAME} NAME_WE)
    SET(TARGET_NAME ${LIB_NAME}_target)
    ADD_CUSTOM_TARGET(${TARGET_NAME} DEPENDS ${LIB})
    ADD_LIBRARY(${LIB_NAME} STATIC IMPORTED GLOBAL)
    ADD_DEPENDENCIES(${LIB_NAME} ${TARGET_NAME})
    SET_TARGET_PROPERTIES(${LIB_NAME}
                          PROPERTIES
                          IMPORTED_LOCATION ${LIB_FILE_NAME}
                          INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/${CMAKE_BUILD_TYPE}/include
                          )
    INSTALL(TARGETS ${LIB_NAME}
            EXPORT ${TARGET_NAME}
            ARCHIVE DESTINATION ${CMAKE_SOURCE_DIR}/build/lib
            )

    INSTALL(
            EXPORT ${TARGET_NAME}
            DESTINATION share/dpdk
    )
    FILE(APPEND "share/dpdk-config.cmake" "include(share/dpdk/${TARGET_NAME}.cmake)\n")

    #    MESSAGE(STATUS "Library file: ${LIB_FILE_NAME}")
    #    MESSAGE(STATUS "Library: ${LIB_NAME}")
    #    MESSAGE(STATUS "Library target: ${TARGET_NAME}")
ENDFOREACH ()

INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/build/lib
        DESTINATION ${CMAKE_SOURCE_DIR}/${CMAKE_BUILD_TYPE}/)

INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/build/include
        DESTINATION ${CMAKE_SOURCE_DIR}/${CMAKE_BUILD_TYPE}/)

Во-первых, я не уверен, что это правильный способ, во-вторых, это не работает.Любая помощь будет оценена

РЕДАКТИРОВАТЬ: Хорошо, этот подход не работает, так как импортированная библиотека не может быть экспортирована.См. CMake выпуск # 14311

1 Ответ

0 голосов
/ 27 февраля 2019

Хорошо, на самом деле моя ставка была достаточно близкой.INSTALL не будет работать, но вы можете использовать ConfigXXX.cmake для сбора всей необходимой информации, создания экспортированных библиотек, добавления необходимых свойств и вуаля.В качестве примера можно взять TBB от Intel, у него есть похожая проблема, которую они решают с помощью вышеуказанного подхода.Я просто создал функцию на основе их скрипта

FUNCTION(SET_LIBRARY_TARGET LIB_FILE_NAME INCLUDE_DIR ISDEBUG)
    SET(POSTFIX "_release")
    IF (${ISDEBUG})
        SET(POSTFIX "_debug")
    ENDIF ()

    GET_FILENAME_COMPONENT(LIB_NAME ${LIB_FILE_NAME} NAME_WE)

    STRING(REPLACE "librte_" "" LIB_NAME "${LIB_NAME}")
    STRING(REPLACE "libdpdk" "dpdk" LIB_NAME "${LIB_NAME}")
    STRING(APPEND LIB_NAME "${POSTFIX}")

    ADD_LIBRARY(DPDK::${LIB_NAME} STATIC IMPORTED)
    SET_TARGET_PROPERTIES(DPDK::${LIB_NAME} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${INCLUDE_DIR}")

    IF (${ISDEBUG})
        SET_PROPERTY(TARGET DPDK::${LIB_NAME} APPEND PROPERTY IMPORTED_LOCATION_DEBUG "${LIB_FILE_NAME}")
        SET_PROPERTY(TARGET DPDK::${LIB_NAME} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
    ELSE ()
        SET_PROPERTY(TARGET DPDK::${LIB_NAME} APPEND PROPERTY IMPORTED_LOCATION_RELEASE "${LIB_FILE_NAME}")
        SET_PROPERTY(TARGET DPDK::${LIB_NAME} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
    ENDIF ()

    SET(DPDK_${LIB_NAME}_FOUND 1)
ENDFUNCTION()

Я думаю, что это может быть более элегантно, будь моим гостем, чтобы улучшить его

EDIT001: Более чистая и компактная версия

FUNCTION(SET_LIBRARY_TARGET NAMESPACE LIB_NAME DEBUG_LIB_FILE_NAME RELEASE_LIB_FILE_NAME INCLUDE_DIR)
    ADD_LIBRARY(${NAMESPACE}::${LIB_NAME} STATIC IMPORTED)
    SET_TARGET_PROPERTIES(${NAMESPACE}::${LIB_NAME} PROPERTIES
                          IMPORTED_CONFIGURATIONS "RELEASE;DEBUG"
                          IMPORTED_LOCATION_RELEASE "${RELEASE_LIB_FILE_NAME}"
                          IMPORTED_LOCATION_DEBUG "${DEBUG_LIB_FILE_NAME}"
                          INTERFACE_INCLUDE_DIRECTORIES "${INCLUDE_DIR}"
                          )
    SET(${NAMESPACE}_${LIB_NAME}_FOUND 1)
ENDFUNCTION()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...