Я не могу понять, как собрать некоторые модули расширения и экспортировать их в файл конфигурации / пакета cmake - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть проект, который зависит от трех boost модулей, и по некоторым причинам я не могу просто установить boost на целевой машине.

Я хочу добавить подкаталог cmake, который создает необходимые библиотеки boost и предоставляет цели и переменные для их поиска в последующем (родительском проекте). Часть target очень важна, потому что мне нужен способ сказать родительскому проекту ждать, пока не будет построено boost, потому что это зависит от него.

Я смог достичь выше, используя cmake config. файлы, и я проверил результаты с небольшим фиктивным родительским проектом. Вроде работает. Несмотря на это, я все еще не понимаю несколько вещей, которые я видел.

Ниже я задаю несколько вопросов, а ниже я прилагаю все свои cmake файлы.

  • Самый важный вопрос, который у меня есть: я думаю, что должен быть гораздо лучший способ достичь того, чего я хочу, может кто-нибудь объяснить мне, как?
  • Насколько я понимаю, команда cmake install выполняется только тогда, когда вы делаете make install, но никогда, когда вы добавляете подкаталог. Это правильно?
  • Однако, когда вы используете install export, все файлы будут установлены, когда export() выполняется cmake. Это правильно?
  • Как добавить install directory в набор экспорта проекта?
  • В cmake шаг install всегда выполняется после сборки. Следовательно, ваши цели никогда не должны зависеть от установленных вещей, поскольку во время сборки эти вещи еще не существуют, верно?

Файлы и дерево проекта

Дерево проекта

project_root
|
├── boost                      # This is the 'wrapper' project whose purpose is to build and export boost
│   ├── boostdg-config.cmake.in
│   ├── CMakeLists.txt
|   ├── boost                  # This is the actual boost repository cloned from github
│   └── dummy.cpp
├── CMakeLists.txt
└── dummy_test.cpp

Родительский проект (тот, который использует boost) CMakeLists.txt

cmake_minimum_required(VERSION 3.9.0)cmake_minimum_required(VERSION 3.9.0)cmake_minimum_required(VERSION 3.9.0)

project(Test)

add_subdirectory(boost)

find_package(BoostDG PATHS ${CMAKE_CURRENT_BINARY_DIR})

add_executable(dummy_test ${CMAKE_SOURCE_DIR}/dummy_test.cpp)

target_link_libraries(dummy_test
    PRIVATE
        boost_system
        boost_program_options
)

target_link_directories(dummy_test
    PRIVATE
        ${BOOST_LIBRARIES_DIR}
)

target_include_directories(dummy_test
    PRIVATE
        ${BOOST_INCLUDE_DIR}
)

add_dependencies(dummy_test BoostDGTarget)

Экспорт-повышение проекта CMakeLists.txt

cmake_minimum_required(VERSION 3.9.0)

include(ExternalProject)
include(GNUInstallDirs)

project(BoostDG)

set(BOOST_BUILD_ROOT ${CMAKE_CURRENT_BINARY_DIR})
set(BOOST_BUILT_LIB_DIR ${BOOST_BUILD_ROOT})
set(BOOST_BUILT_INCLUDE_DIR ${BOOST_BUILD_ROOT})

ExternalProject_Add(Boost
  SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/boost
  BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/boost
  CONFIGURE_COMMAND ./bootstrap.sh --prefix=${BOOST_BUILT_LIB_DIR} --with-libraries=system,filesystem,program_options
  BUILD_COMMAND ""
  INSTALL_COMMAND ./b2 --prefix=${BOOST_BUILT_LIB_DIR} -j 12 install
)

#
# This library is just a dummy taret to make the parent project dependant
# on the 'Boost' external project (see above) so it waits until the latter
# gets built to add its libraries.
#
add_library(BoostDGTarget STATIC ${CMAKE_CURRENT_SOURCE_DIR}/dummy.cpp)
add_dependencies(BoostDGTarget Boost)

set(CONF_BOOST_LIBRARIES_DIR ${CMAKE_CURRENT_BINARY_DIR}/lib)
set(CONF_BOOST_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include)

configure_file(boostdg-config.cmake.in
    "${BOOST_BUILT_LIB_DIR}/BoostDGConfig.cmake" @ONLY
)

install(TARGETS BoostDGTarget
    # IMPORTANT: Add the BoostDGTarget library to the "export-set"
    EXPORT BoostDGTargetExportSet
    LIBRARY DESTINATION ${INSTALL_CMAKE_DIR}/BoostDGTarget/lib
    ARCHIVE DESTINATION ${INSTALL_CMAKE_DIR}/BoostDGTarget/lib
    PUBLIC_HEADER DESTINATION ${INSTALL_CMAKE_DIR}/BoostDGTarget/include
)

export(TARGETS BoostDGTarget
    FILE "${BOOST_BUILT_LIB_DIR}/BoostDGTargets.cmake"
)

boostdg-config.cmake.in

get_filename_component(BOOSTDG_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)

# Our library dependencies (contains definitions for IMPORTED targets)
if(NOT TARGET BoostDGTarget)
  include("${BOOSTDG_CMAKE_DIR}/BoostDGTargets.cmake")
endif()


set(BOOST_LIBRARIES_DIR "@CONF_BOOST_LIBRARIES_DIR@")
set(BOOST_INCLUDE_DIR "@CONF_BOOST_INCLUDE_DIR@")

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