Почему файл cmake GLOB-зло?

Документ CMake говорит о команде файл GLOB:

Мы не рекомендуем использовать GLOB для сбора списка исходных файлов из исходного дерева. Если файл CMakeLists.txt не изменяется при добавлении или удалении источника, сгенерированная система сборки не может знать, когда следует запросить регенерировать CMake.

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

Однако, чтобы система сборки узнала, что источник был добавлен или удален, достаточно сказать

touch CMakeLists.txt

Правильно?

Тогда это меньше усилий, чем редактирование CMakeLists.txt для вставки или удаления имени исходного файла. И это не так сложно запомнить. Поэтому я не вижу веских оснований советовать против file GLOB.

Что не так с этим аргументом?

Ответ 1

Проблема заключается в том, что вы не одиноки, работая над проектом.

Предположим, что у проекта есть разработчики A и B.

A добавляет новый исходный файл x.c. Он не изменяет CMakeLists.txt и совершает после того, как закончил реализацию x.c.

Теперь B делает a git pull, и поскольку никаких изменений в CMakeLists.txt не было, CMake снова не запускается, а B имеет ошибки компоновщика при компиляции, потому что x.c не был добавлен в его исходные файлы список.

Ответ 2

Это не по своей сути злой - у него есть преимущества и недостатки, которые относительно хорошо описаны в этом ответе здесь, на StackOverflow. Но если вы используете его небрежно, вы можете проигнорировать изменения зависимостей и потребовать чистых перестроек больших частей вашей кодовой базы.

Я лично поддерживаю его - в небольших проектах или в некоторых подкаталогах в более крупных - чтобы не вводить каждый файл вручную в файлы сборки. Изменить: Мое предпочтение изменилось, и в настоящее время я стараюсь избегать его.