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