У меня есть проект, который зависит от трех 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)