Как из букв C N O A собрать «удобный современный С++»

Думаю никого не нужно вводить в курс дела - в С++ всегда было сложно с подключением зависимостей. Было. Первым из пучины баш и питон скриптов естественным отбором появился и повсеместно распространился cmake - на этом этапе хотя бы проекты без зависимостей стало можно собрать как-то одинаково (здесь я намеренно не упоминаю прочие инструменты того же толка, они просто гораздо менее популярны)

Важно понимать, что до момента когда cmake массово распространился ни о каких пакетных менеджерах для С++ даже не имело смысла говорить - ведь не было пакетов. И только с появлением CMakeLists.txt в каждой библиотеке стало возможным хотя бы рассматривать проекты как пакеты, которые можно как-то распространять

И этим сразу же начали заниматься. Можно сказать, что этот процесс идёт прямо сейчас, но основные тенденции уже наметились. Подходы разные, я расскажу о нескольких самых популярных:

(почему не) Conan

Conan решил не делать революции и остался продвинутым питон скриптом. Идея простая - вы пишете "рецепт" на питоне для вашего пакета, потом складываете в какой-то центр рецептов, потом используете. Но есть нюансы:

  1. нужно написать рецепт. А ведь вы уже писали "рецепт", CMakeLists.txt называется

  2. на практике оказывается, что рецепт должен быть написан близко к идеальному, иначе потом будут очень кривые проблемы

  3. совершенно неочевидно как же он должен быть написан - на примере множества людей и компаний выявлено, что написание conan рецепта это один из самых сложных навыков в программировании. Люди спокойно разбираются в шаблонах, в линуксе, в ужасной документации, но написать conan рецепт не могут

  4. сочетание пунктов 2 и 3 делает возможным поддержание рецептов для разных библиотек возможным только для больших компаний, которым некуда девать человекочасы

  5. нужен питон. Видимо какой-то стабильной версии

И самый большой нюанс в том, что у большинства библиотек никаких конан рецептов нет, писать их вы не хотите, а у одиночных разработчиков и маленьких команд зачастую нет сил/желания писать эти рецепты и проходить потом через процедуру ревью в conan-index-center и поддерживать этот рецепт потом в течение 40 лет (не забывайте, что уже есть conan2)

Основное применение конана сейчас это написать в комментариях к чему угодно "а почему не КоНАн?", эдакая заглушка для нормального решения проблемы зависимостей в С++

(почему точно не) vcpkg

Тут путь совсем странный и даже тупиковый. По сути в майкрософт решили сделать список одобренных ими библиотек - даже не знаю как в этот список попасть. Теоретически процесс похож на конан. Рецепт (порт) -> индекс -> использование. Но на практике оказывается, что даже версии библиотек это что-то невероятное для vcpkg, локальный индекс пакетов на уровне эксперимента, а ежемесячный отчёт об обновлениях всё больше похож на мем:

Давно уже ощущение, что не смотря на громадные возможности майксрософта - у них есть гитхаб, Windows, громадные деньги и влияние - проект просто загнулся и больше не развивается

CPM

CPM реализует простую и очевидную идею - CMakeLists.txt это уже и есть рецепт библиотеки. Преимущества:

  1. Простота. CPM это всего лишь один файл на cmake . Если проблемы возникают, они обычно понятные, так как механизм работы прост и прозрачен

  2. рецепты не нужно поддерживать специально, они просто есть, если CMakeLists.txt написан

  3. Не нужен выделенный реестр пакетов, индексом может стать и github и gitlab и ваш локальный файл и в целом что угодно

  4. Если автор библиотеки накосячил с "рецептом", всегда можно сделать патч прямо при добавлении зависимости

  5. Теоретически CPM может переиспользовать Conan и vcpkg через свой интерфейс CPMAddPackage, тогда как в обратную сторону это не работает

Теперь соберём из этого всего удобные шаблоны проектов

Моей целью стало не сделать самый универсальный инструмент для всего, а просто организовать удобным образом создание новых проектов на С++.

Например: вы хотите написать бенчмарк. Но стоит вам только подумать, что для этого нужно будет настраивать проект, подключать зависимости из google benchmark.. Люди часто бросают идею именно на этом этапе.

Из этой проблемы выросли целые проекты по типу https://quick-bench.com/, он хотя бы как-то запускает ваш бенчмарк. И даже не спрашивайте как ТУДА добавить свои зависимости.

Поэтому первым шаблоном стал шаблон бенчмарка

Задумка простая - вы скачиваете репозиторий, запускаете команду и перед вами готовый к использованию репозиторий, который можно уже менять под ваши задачи как угодно.

git clone https://github.com/kelbon/template_benchmark
cd template_benchmark
cmake -Dproject_name=<your-project-name> -P setup.cmake

Обычно после запуска скрипта у С++ программистов на глазах слёзы счастья, когда они видят, что после билда можно просто нажать F5 в vscode и проект запустится, потому что launch.json уже сгенерирован за них, compile_comands.json переложен туда, откуда clangd сможет организовать подсветку кода, а google benchmark в зависимостях с правильными опциями, чтобы он не ломал сборку (как он любит)

Потом появились шаблоны библиотеки и приложения, а потом и просто в репозиторий со списком всех шаблонов

Так, для библиотеки сразу в комплекте идёт CI на гитхабе с санитайзерами на gcc и clang, кеш сборки (кроссплатформенный ccache), clang-format, автоматическое добавление тестов и конечно же deps.cmake для перечисления зависимостей.

Для приложения ещё и добавляется сразу зависимость и файлы для описания CLI интерфейса на компиляции, в удобном и понятном виде

Радует, что мир С++ настолько очистился, что стало возможным создание таких проектов. В будущем планируется добавить также шаблон HTTP сервиса (там почти всё готово), но и нынешний набор уже очень помогает при создании новых проектов, что может очень сильно помочь в обучении языку, поэтому решил поделиться шаблонами проектов

@Kelbon
26.09.2025 20:04 UTC
Первоисточник

Комментарии

@TimurZhoraev
26.09.2025 20:53 UTC
-1

Turbo C также мог по Ctrl+F9 собрать и запустить, подсветив код не хуже чем сейчас. Это был где-то 1998й год, всё влезало на дискету 1.44. Тогда были обычные make, и сейчас тоже самое, главное чтобы батарейка у биоса не села и не сбросила незаметно время. В качестве пакета - lib с заголовочниками, директория с датой - версия, bat-файл для всего остального. Практически за 30 лет лишь косметические изменения. Если бы тогда спросили у будущего: до сих пор используете файловые системы для структурирования проекта? Представлен очевидный ответ. Интересно, есть ли у этого процесса хоть какая-то интегрированная прямая поддержка со стороны IDE.

@Kelbon
27.09.2025 05:33 UTC
0

Не проблема собрать и подсветить - возьмите visual studio и там нажмите кнопку "новый проект". Проблема в том чтобы это было кроссплатформенно и подключало зависимости

С++ оказался в тупике идеи о том что "у нас нет одного правильного способа сделать это, нужно ли делать папку /src для всех проектов, нужно ли /include?" и в итоге никто ничего не делает, все абы как собирают свои проекты. Я решил не изобретать способ на все случаи жизни и просто сделал как вижу и как удобно

@randomsimplenumber
27.09.2025 05:55 UTC
+2

14 стандартов.хксд ?

@SilverTrouse
27.09.2025 21:21 UTC
-1

Хоть кто-то адекватно описал почему не стоит использовать conan и vcpkg когда cmake умеет скачивать ( просто -чуть напильником дополить и адекватный пакетный менеджер)

@simplepersonru
28.09.2025 20:07 UTC
-1

Как цмэйком управлять бинарными зависимостями, их кэшированием, версиями и тд? Скачивать это хорошо, но ведь множество библиотек мы подключаем уже собранными, в т.ч. локальные внутри проекта, как этим всем управлять?

29.09.2025 05:35 UTC
0

Не поверите, просто дать флаг download only в add package, а вот в Conan это действительно невероятно неудобно, см. доклад по ссылке в статье

29.09.2025 11:55 UTC
0

см. доклад по ссылке в статье

а таймкод можно, где описаны конкретные проблемы?

20.10.2025 06:44 UTC
0

Да, но откуда он его скачает? Где мы разместим и будем хранить эти бинарные зависимости. У пакетных менеджеров есть свои registry, которые можно поднять. Если менеджить бинарные зависимости просто в гит репозитории, у этого есть свои существенные недостатки

Наверняка можно организовать это через условые releases из условного github, но эту логику со скачиванием определенной версии релиза и тд, ее нужно реализовывать руками. Если вам известно о другом существующем способе через cmake заниматься менеджментом бинарных зависимостей, поделитесь пожалуйста

@TLemur
28.09.2025 10:14 UTC
0

На сколько это удобнее, например, cargo в Rust?

@SilverTrouse
28.09.2025 19:59 UTC
-2

Если судить по пакетным менджерам в других ЯП то выйгрывают другие по сравнению С++.

@MusokeSman
29.09.2025 10:51 UTC
0

- даже не знаю как в этот список попасть - как в любой opensource через merge requests. https://learn.microsoft.com/en-us/vcpkg/get_started/get-started-adding-to-registry?pivots=shell-powershell

@kambala
29.09.2025 11:49 UTC
0

и что же делать с библиотеками, которые собираются не через смаке? (например, FFmpeg или Qt 5) Как шарить собранные бинари с другими людьми и CI тоже не увидел в их ридми. Наверное, как очень простая система управления зависимостями — пойдет.

совершенно неочевидно как же он должен быть написан - на примере множества людей и компаний выявлено, что написание conan рецепта это один из самых сложных навыков в программировании. Люди спокойно разбираются в шаблонах, в линуксе, в ужасной документации, но написать conan рецепт не могут

надо всего лишь смотреть на уже написанные рецепты в CCI и в документацию. И еще можно вопросы задавать — как в слаке, так и прямо в репе конана.

Также развивается Common Package Specification, который как раз и должен абстрагировать информацию о «пакете» от конкретного менеджера пакетов. В смаке 4.0 уже реализовано, вот тут статья какая-то на эту тему.

@Kelbon
29.09.2025 12:10 UTC
0

Рецепт для qt откуда-то взялся, видимо написали. Насколько я знаю современные версии Qt поддерживают cmake, получается написали рецепт для CPM. Бинари шарятся через тот же механизм, только с флагом download only

смотреть на уже написанные рецепты

именно так и получается, что все копируют, но никто не знает как же правильно, так что рецепты всё сложнее и сложнее, в них какие-то странные магические действия без объяснения почему

29.09.2025 13:46 UTC
0

Рецепт для qt откуда-то взялся, видимо написали

не увидел где искать Qt для CPM. В конане (и vcpkg) он есть, конечно.

Насколько я знаю современные версии Qt поддерживают cmake, получается написали рецепт для CPM

от того, что они поддерживают смаке, не значит, что они через него собираются. 6-ка собирается через него, да, а вот 5-ка — только через свой configure.

Вот глянул в issues CPM, там как раз кто-то поинтересовался как собрать FFmpeg (который на autotools). Открываю, а там жесть через ExternalProject_Add: https://github.com/cpm-cmake/CPM.cmake/issues/480

У FFmpeg миллион параметров — видимо, придется каждому их изучать, чтоб смочь собрать через CPM с нужными настройками. А теперь сравним с рецептом Конана, где параметры вынесены в область параметров. С Qt 5 аналогично.

все копируют, но никто не знает как же правильно, так что рецепты всё сложнее и сложнее, в них какие-то странные магические действия без объяснения почему

не понимаю что же мешает спросить. Коммьюнити вполне живое, мэйнтейнеры отвечают на вопросы достаточно активно.

29.09.2025 13:51 UTC
0

Вот глянул в issues CPM, там как раз кто-то поинтересовался как собрать FFmpeg (который на autotools)

а как его в конане добавить, если рецепт не написан? Уж не CPM виноват, что люди поддерживают проект десятки лет и не могут написать ему cmakelists.txt

29.09.2025 14:44 UTC
0

а как его в конане добавить, если рецепт не написан?

понятно, что никак, если не написать рецепт.

Но суть-то не в этом, а в удобстве использования рецепта. Конану все равно какая система сборки используется для библиотеки — рецепт будет выглядеть примерно одинаково (за исключением build метода, конечно), а у CPM получается, что если библиотека собирается не через смаке, то придется приложить гору усилий, чтоб его написать.

Уж не CPM виноват, что люди поддерживают проект десятки лет и не могут написать ему cmakelists.txt

какой-нить базель и мезон тоже надо на смаке переписать, получается?