Pull to refresh

Comments 19

Блин, туториалы по cmake еще непонятнее, чем официальная справка

Официальная справка очень даже неплохая.
Если нужно что-то конкретное разъяснить — спрашивайте.

Вот я хочу сделать модульную структуру для игрового движка: кидаешь в корневую директорию набор папок, в каждой папке своя библиотека. У каждой библиотеки свой CMakeLists.txt с зависимостями от других библиотек и в корневой директории CMakeLists.txt в котором просто набор add_subdirectory().
Так вот движок может быть разных версий и библиотеки могут предназначаться для разных версий движка. Т.е. при использовании add_subdirectory() нет контроля за версиями и нужно оформлять в виде пакетов и подключать через find_package() и тут я запнулся, ничего понятно. Какие-то разные способы создания пакетов, какие-то конфиги, нигде нет нормального коротенького примера. Еще вопрос по поводу install. Я так понял, он ставит библиотеку в систему, но зачем мне загаживать систему, если все библиотеки используются в пределах одного проекта.

Насколько эти библиотеки независимы?
Если это просто куски проекта, то, вроде, нет необходимости следить за версиями, поскольку и так всё лежит под контролем версий.
Если это реальные модули, то, возможно, имеет смысл отделить их от основного проекта и использовать либо гитовые подмодули, либо, собственно, подключение через CMake. В последнем случае можно использовать модуль FetchContent.

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

А как гит может помешать собрать всё локально?

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

модули могут быть из разных источников и под разные версии движка

Всё это выглядит для меня странно, но могу предложить таки сделать папки полноценными CMake-модулями, которые будут устанавливаться. Просто прописать отдельный путь -DCMAKE_INSTALL_PREFIX=path/to/install, чтобы не захламлять систему.

Ну я на крайняк могу ставить в cmake_binary_dir, осталось выяснить как делать полноценные cmake модули. Такой туториал я как раз и гуглил
Я не люблю критиковать чужую работу, но не нашел

Да я видел уже. Там тоже есть вопросы. Если уж оформлять mylib как отдельную библиотеку, то очевидно ее .h и .cpp должны быть отделены от общей мешанины, а в .cpp должно быть обращение к своим заголовочным файлам как #include "", как это во всех библиотеках сделано. И только когда заголовки проинсталлятся, другие библиотеки/приложения будут обращаться к этим заголовкам через #include <>.

В директории src можно делать что угодно, т.к. это скрытая часть. В интерфейсе, то есть директории include, нужно обращаться по <>.


В любом случае, не вижу проблемы сделать так, как вам нужно.

В интерфейсе, то есть директории include нужно обращаться по <>.

Нет. В директории include к другим заголовкам из той же библиотеки тоже нужно обращаться через "".

Делайте, как хотите. К CMake это отношения не имеет.

Это обосновывает процесс установки. При разработке изолированной библиотеки не будешь же каждый раз при отладке ставить заголовки, поэтому обращение обязательно через "". А чтобы другие либы/приложение могли использовать эту либу, ее надо ставить, и тогда они подключают заголовки через <>.

CMake способен правильно обрабатывать ситуацию с <> даже при разработке изолированной библиотеки.


См. инструкцию и проект-шаблон.

Sign up to leave a comment.

Articles