- Нужен ли каждому каталогу файл CMakeLists
Нет, в этом нет необходимости.
Вероятно, хорошая идея иметь CMakeLists.txt для каждого подмодуля и библиотеки - и один в корне для самого проекта.
Нужно ли указывать каждый каталог, содержащий исходные файлы, или он может автоматически искать исходные файлы и файлы заголовков в каталогах?
Во-первых, см. Ответ на ваш вопрос 3.
Во-вторых, я не понимаю, зачем вам искать файлы заголовков.Просто укажите включаемые каталоги.
Наконец, если вы хотите использовать подстановку вопреки рекомендациям, можно поместить все исходные файлы в один каталог и использовать один глобус.
Я также вижу, что многие другие проекты CMake предоставляют каждый источник ... файл отдельно, почему?
Поскольку CMake имеет проблемы с глобальным кэшированием и не может перекомпилироваться, когдановые файлы добавлены или старые удалены.Документы CMake гласят:
Примечание
Мы не рекомендуем использовать GLOB для сбора списка исходных файлов из дерева исходных текстов.Если файл CMakeLists.txt не изменяется при добавлении или удалении источника, сгенерированная система сборки не может знать, когда попросить CMake сгенерировать заново.Флаг CONFIGURE_DEPENDS может работать не надежно на всех генераторах, или, если в будущем будет добавлен новый генератор, который не сможет его поддерживать, проекты, использующие его, будут заблокированы.Даже если CONFIGURE_DEPENDS работает надежно, проверка каждой перестройки все равно требует затрат.
... каждый заголовочный файл отдельно, почему?
Я никогда не видел этого.
Есть ли что-нибудь еще, что я могу улучшить?
Используйте target_include_directories
вместо include_directories
.В общем, всегда используйте директивы target_X
.