LINUX.ORG.RU

Организация структуры каталогов в cmake проектах

 


0

2

Дано: пол сотни программ и ещё пол сотни библиотек, которые используются этими программами.

Вопрос: как лучше всего организовать этот проект.

Цель: минимизировать время компиляции.

Само собой напрашивается решение вида:

./programs/a/CMakeLists.txt:
add_subdirectory("../../libs/blib")
add_subdirectory("../../libs/clib")
...
./programs/b/CMakeLists.txt:
add_subdirectory("../../libs/blib")
add_subdirectory("../../libs/dlib")
...
Очевидно, что мне не нравятся относительные пути. Так же для каждой программы придется собирать требуемые ей библиотеки отдельно. (Но зато каждая программа собирается отдельно в своем binary dir)

Вариант два: добавить один cmake и в нем подоьавлять все программы. Проблема: свалка всего и возможно неоправданно длинный этап конфигурации. Проблему относительных путей не рещает.

Посоветуйте best practices и может какие-то красивые решения.

★★★★★

В корневом каталоге главный CMakeLists файл, который заинклудит все библиотеки, а программы можно собирать по флагам.

a1batross ★★★★★
()
Ответ на: комментарий от a1batross

Ну как бы мне не хочется собирать все библиотеки без надобности. То есть программа лучше знает о своих зависимостях.

Либо нагородить что-то типа макроса my_find_package, который будет более гибким чем add_subdirectory и в нем не будут захардкодены пути...

invy ★★★★★
() автор топика
Ответ на: комментарий от KivApple

Если структура проекта меняется - все разваливается. Если бы все необходимые библиотеки были а подкаталогах - другой вопрос.

invy ★★★★★
() автор топика
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от a1batross

Хотя в принципе норм. Собирать по частям выбирая нужный target.

Вроде не плохой пример.

https://cliutils.gitlab.io/modern-cmake/chapters/basics/structure.html

https://gitlab.com/CLIUtils/modern-cmake/blob/master/examples/extended-projec...

invy ★★★★★
() автор топика
Последнее исправление: invy (всего исправлений: 2)
Ответ на: комментарий от invy

Тогда лучше распилить репозиторий на пачку мелких. Ну а чо, зато красиво!

a1batross ★★★★★
()
Ответ на: комментарий от invy

Ещё можно попробовать библиотеки определять с опцией EXCLUDE_FROM_ALL, чтобы собирались только библиотеки нужные для выбранных программ.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Хорошая идея кстати

invy ★★★★★
() автор топика

Посоветуйте best practices и может какие-то красивые решения.

  1. Не использовать дремучие версии CMake.
  2. Оформить либы в отдельных директориях с COMPONENT и EXCLUDE_FROM_ALL в install(). См [пример].(https://habr.com/ru/post/461817/#installation).
  3. Подумать/попробовать install(EXPORT) и подключать либы через find_package().
  4. Если есть либы, которые 100% используются только одной прогой или другой либой, то их обычно удобнее размесить в под-директории соответствующего компонента.
Deleted
()

В корневом CMakeLists.txt - только add_subdirectory до всех программ и библиотек, в программах target_link_libraries с нужными библиотеками. Всё.

slovazap ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.