Представьте себе общий проект с несколькими компонентами:
- basic
- io
- web
- app-a
- app-b
- app-c
Теперь предположим, что web зависит от io, который зависит от basic, и все эти вещи находятся в одном репозитории и имеют CMakeLists.txt для сборки.их как общие библиотеки.
Как мне настроить все, чтобы я мог собрать три приложения, если каждое из них является необязательным и может отсутствовать во время сборки?
Одна идея состоит в том, чтобы в главном репо была пустая директория «apps», и мы можем клонировать в нее любые репозитории приложений, которые мы хотим.Наш основной файл CMakeLists.txt может использовать GLOB, чтобы найти все каталоги приложений и построить их (не зная заранее, сколько их будет).Проблемы с этим подходом включают в себя:
- Очевидно, что CMake не выполняет повторную глобализацию, когда вы просто говорите
make
, поэтому, если вы добавляете новое приложение, вы должны снова запустить cmake
. - Это накладывает определенную структуру на человека, выполняющего сборку.
- Не очевидно, как можно создать два клона одного приложения и собрать их оба отдельно для одной и той же сборки библиотеки.
Общая концепция похожа на традиционный рекурсивный проект CMake, но там, где низкоуровневые модули не обязательно заранее знают, какие высокоуровневые модули будут их использовать.Однако я не хочу требовать от пользователя установки библиотек нижнего уровня в фиксированном месте (например, /usr/local/lib
).Однако я хочу, чтобы один вызов make
заметил измененные зависимости по всему проекту, поэтому, если я создаю приложение, но изменил одну из библиотек низкого уровня, все будет перекомпилировано соответствующим образом.