Я настраиваю систему сборки на основе CMake для старого фреймворка, написанного на C. Он состоит из одного двоичного файла, некоторых базовых библиотек и множества динамически связанных библиотек, которые построены на основе базовых библиотек. Все библиотеки требуют специального этапа генерации кода, который генерирует код C из файлов моделей, написанных на языке, специфичном для предметной области. Генератор кода считывает собственный файл модели библиотеки, а также файлы всех библиотек зависимостей.
Моя цель - структурировать эти библиотеки в нескольких проектах CMake («базовая структура», «библиотеки расширений» и проекты, специфичные для приложений). поддержка трех сценариев (с одной и той же кодовой базой):
Включение базового каркаса и библиотек расширений в качестве подпроектов (т.е. подмодулей git) в конкретный проект приложения. В этом случае эти проекты CMake включаются через add_subdirectory()
и являются частью одного проекта CMake.
Сборка проектов, специфичных для приложения, на основе дерева сборки базовой платформы. Заголовочные файлы публичной библиотеки и файлы моделей для генерации кода следует читать из дерева исходных текстов.
Этого можно достичь, используя export(EXPORT foo FILE FooFrameworkConfig.cmake)
в CMakeLists базовой платформы и find_package(FooFramework)
(с соответствующим CMAKE_PREFIX_PATH
)включить свойства CMake целей сборки базовой платформы в проект приложения.
Сборка конкретных проектов приложения на основе дерева установки базовой платформы (без наличия доступных источников). Все необходимые общедоступные заголовочные файлы и файлы моделей для генерации кода копируются в дерево установки с помощью соответствующих правил install(…)
.
Чтобы включить свойства CMake целевых объектов сборки базовой платформы в проект приложения, я попытался использоватьinstall(EXPORT foo FILE FooFrameworkConfig.cmake)
в списках CMake базового фреймворка и уже упомянутых find_package(FooFramework)
(с соответствующим CMAKE_PREFIX_PATH
).
Чтобы управлять путями поиска модели для генератора кода, я ввелнастраиваемое свойство CMake для целевых объектов библиотеки (назовем его FOO_MODEL_PATHS
). Это свойство содержит пути к файлам модели самой библиотеки и всех ее библиотек зависимостей. Я сделал это пользовательское свойство экспортируемым через set_property(TARGET ${OV_LIBRARY_NAME} APPEND PROPERTY EXPORT_PROPERTIES FOO_MODEL_PATHS)
.
К сожалению, я не могу заставить его работать для третьего сценария. В этом случае мне нужно, чтобы для этого настраиваемого свойства были установлены разные значения в файле экспорта дерева установки (генерируется install(EXPORT …)
) и в системе сборки базовой платформы. Для внутренних свойств CMake для этой цели можно использовать выражения генератора $<BUILD_INTERFACE:…>
и $<INSTALL_INTERFACE:…>
. Однако для пользовательских экспортируемых свойств выражения генератора запрещены (см. документацию CMake и this commit ).
Итак, как я могу управлять путями поиска генератора кода вCMake и делиться ими с зависимыми проектами через EXPORT, но исправьте их в сгенерированном файле install(EXPORT …)
?