Я использую 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