библиотеку навешано куча свойств, она линкуется с кучей других библиотек, подцепляет свои include directories и target_compile_definitions...
Так вот, хочется сделать другую библиотеку, LIBRARY_TWO. Все свойства и исходники должны совпадать с LIBRARY_ONE, но должен быть другой target_compile_definitions
Как это правильнее/проще сделать? Как скопировать таргет и поменять одно свойство сборки
Может, функцию сделать для создания либы и в нее передавать список опций, которые в target_compile_definitions должны заехать?
там ещё приватные либы линкуются, интерфейсная библиотека их не поддерживает... но можно конечно извернуться но, как написали выше, рецепт плохо скейлится на множество либ
С какого-то смака кажется уже поддерживает
перевернуть архитектуру проекта с головы на ноги, чтобы таким не приходилось заниматься 🙃 Но поскольку по собственному опыту, в таких случаях кажется, что проблемы у симейка а не у автора кода, то примерно как говорили выше: set(FOO_SRC foo.cpp) set(FOO_LIBS PRIVATE boost_system PUBLIC boost_asio) set(FOO_DEFINES PUBLIC TAXI_VERSION=3) set(FOO_FLAGS PRIVATE -Werror) add_taxi_library(foo STATIC SOURCES ${FOO_SRC} LIBS ${FOO_LIBS} DEFINES ${FOO_DEFINES} FLAGS ${FOO_FLAGS} ) set(BAR_SRC ${FOO_SRC}) set(BAR_LIBS ${FOO_LIBS}) set(BAR_FLAGS ${BAR_FLAGS}) set(BAR_DEFINES ${FOO_DEFINES} MARKET_VERSION=4) add_taxi_library(bar STATIC SOURCES ${BAR_SRC} LIBS ${BAR_LIBS} DEFINES ${BAR_DEFINES} FLAGS ${BAR_FLAGS} ) практика показывает, что копирование свойств — феерически хрупкая штука, а создание подкапотных таргетов типа __foo_bar_common — мина замедленного действия до первого же if (MSVC) add_compile_options(foo ...) endif(), после которого флажки между foo и bar разъедутся
Не сработает ли создание интерфейсной библиотеки, для которой заданы все свойства (кроме compile definitions), которая будет уже линковаться как зависимость к двум нужным таргетам, для которых уже можно по отдельности выставить target_compile_definitions?
у INTERFACE нет приватных инклюд директорий, нет приватных либ
Как альтернатива — иметь две интерфейсных либы, одну из которых линковать как публичную, а другую как приватную. Но я не знаю, какие тут подводные камни есть помимо не самой большой чистоты решения
Да, имелось ввиду второе
Понятно. Красивое решение
Обсуждают сегодня