Лучший способ указать исходные файлы в CMake - это явно перечислить их .
Сами создатели CMake советуют не использовать globbing.
См .: https://cmake.org/cmake/help/v3.15/command/file.html?highlight=glob#file.
(Мы не рекомендуем использовать GLOB для сбора списка исходных файлов из вашего исходного дерева. Если файл CMakeLists.txt не изменяется при добавлении или удалении источника, сгенерированная система сборки не может знать, когда попросить CMake сгенерировать заново.)
Конечно, вы можете знать, что минусы - читайте дальше!
Когда срывается глобализация:
Большим недостатком глобализации является то, что создание / удаление файлов не приведет к автоматическому обновлению системы сборки.
Если вы добавляете файлы, это может показаться приемлемым компромиссом, однако это создает проблемы для других людей, создающих ваш код, они обновляют проект из системы контроля версий, запускают сборку, а затем связываются с вами, жалуясь на то, что
«сборка сломана».
Что еще хуже, сбой, как правило, дает некоторую ошибку компоновки, которая не дает никаких указаний на причину проблемы, и теряется время на ее устранение.
В проекте, над которым я работал, мы начинали с глобализации, но получали столько жалоб при добавлении новых файлов, что было достаточно оснований явно перечислять файлы вместо глобализации.
Это также нарушает общие рабочие процессы git
( git bisect
и переключение между функциональными ветвями).
Поэтому я не могу порекомендовать это, проблемы, которые это вызывает, намного перевешивают удобство, когда кто-то из-за этого не может создать ваше программное обеспечение, он может потерять много времени, чтобы отследить проблему или просто сдаться.
И еще одно замечание: просто помнить о прикосновении CMakeLists.txt
не всегда достаточно, с автоматическими сборками, использующими глобирование, мне приходилось запускать cmake
перед каждой сборкой, поскольку файлы могли быть добавлены / удалены со времени последней сборки *.
Исключения из правила:
Есть моменты, когда предпочтительнее использовать шатание:
- Для настройки
CMakeLists.txt
файлов для существующих проектов, которые не используют CMake.
Это быстрый способ получить ссылку на весь источник (как только система сборки запустится - замените глобализацию на явные списки файлов).
- Когда CMake не используется в качестве основной системы сборки, если, например, вы используете проект, который не использует CMake, и вы хотели бы сохранить для него собственную систему сборки.
- Для любой ситуации, когда список файлов меняется так часто, что его становится нецелесообразно поддерживать. В этом случае это может быть полезно, но тогда вам придется принимать запуск
cmake
для генерации файлов сборки каждый раз, чтобы получить надежную / правильную сборку (что противоречит намерению CMake - возможности отделить конфигурацию от сборки) .
* Да, я мог бы написать код для сравнения дерева файлов на диске до и после обновления, но это не очень хороший обходной путь, и что-то лучше оставить для системы сборки.