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 и может какие-то красивые решения.

★★★★★

Ответ на: комментарий от 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)

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

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