Как «установить» и использовать собственные зависимости для других проектов с CMake - PullRequest
0 голосов
/ 04 октября 2018

уточнение : Если приведенная ниже настройка является разумным способом сделать это, то мой вопрос в основном, как мне лучше всего добавить публичные заголовки с помощью .lib при запуске ninja install поскольку мое решение не делает этого в настоящее время.

Существует множество примеров того, как делать вещи по-разному, и многие, кажется, противоречат друг другу, просто еще больше сбивая меня с толку.

Я пытаюсь изменить внутреннюю систему сборки и заменить ее на CMake.База кода состоит из множества различных компонентов / библиотек, таких как абстракция ОС / платформы, работа в сети, функциональные возможности и т. Д. До этого она всегда была скомпилирована как одна большая база кода, поэтому запуск команды clean удалял все и перестраивал все зависимости.

Теперь доходит до того, что у меня возникают проблемы с пониманием того, как современный умный способ сделать это в CMake.

Игнорируя тот факт, что сверху необходим инструмент цепочки зависимостей, моя идея заключалась в том, чтобы собирать компоненты / библиотеки в порядке библиотек, не зависящих от самого верха при выполнении изолированной сборки.Затем каждый отдельный сборочный прогон будет собираться со своими зависимостями, как, например, только Windows API для библиотеки абстракции ОС, и затем запускать установку и экспорт на нем.

  • Это общий предпочтительный способ компиляциибиблиотеку в .lib на windows или .a на linux и экспортировать ее в известную общую папку?
  • Я предполагаю, что тогда потребуется скопировать все общедоступные заголовочные файлы для этой библиотеки в то же место?Если да, то как это сделать наиболее правильно?

Если у меня есть структура папок абстракции моей ОС

OSabstraction/
  includes/
    OSabstraction/
        abstraction.h
  src/
    abstraction.cpp
  CMakeLists.txt

и мой CMakeLists

cmake_minimum_required(VERSION 3.12)
project(OSabstraction LANGUAGES CXX)

add_library(abstraction)

target_sources(abstraction
    PRIVATE
        src/abstraction.cpp
)
target_include_directories(abstraction
    PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes/>
    $<INSTALL_INTERFACE:include>
)

install(
    TARGETS abstraction
    EXPORT abstraction-export
    ARCHIVE DESTINATION lib
)

Каклучше бы я использовать эту библиотеку во многих других внутренних проектах?Эта библиотека на практике во много раз больше, так что как правильно сделать это для большого проекта?

edit: я пытался следовать руководству Пабло Ариаса о том, как сделать CMake Right , но я не уверен, как работают генераторы build_interface и install_interface в отношении получения моих заголовочных файлов при экспорте файла .lib.

...