CMake/Ninja пытается скомпилировать удаленный файл `.cpp`

Я обнаружил, что когда я удаляю cpp файлы из моего проекта с использованием cmake а также ninjaЯ не могу легко скомпилировать его, не удалив сначала полностью мой каталог сборки и не начав с нуля. CMake и / или Ninja, по-видимому, сжимает ряд ссылок на все cpp файлы, которые он компилирует, даже удаляя кэш CMake перед повторным запуском CMake, не удаляет все ссылки.

Это известная проблема? Есть ли решение? Я иногда просто бегаю rm $(grep -R <filename> <builddir>)но это ужасный клудж.

РЕДАКТИРОВАТЬ: кажется, я ошибся, так как я не смог дублировать эту проблему. Перезапуск CMake вручную, кажется, всегда генерирует правильный список .cpp файлы, даже используя GLOB сформировать списки источников.

1 ответ

Превращаю мои комментарии в ответ

Сбор ваших исходных файлов с file(GLOB ...)

Да, CMake не будет знать о новых или удаленных исходных файлах при сборе исходных файлов с помощью file(GLOB ...) команда. Это известное ограничение с CMake. Я изменил свой проект (ы) CMake, чтобы перечислять все исходные файлы индивидуально именно из-за этого. Для удобства я все еще собираю свои файлы заголовков с file(GLOB ...) команда.

Цитата из CMake's file() командная документация:

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

Удаление CMakeCache.txt перезапустить конфигурацию

Просто удаляю CMakeCache.txt может быть недостаточно для повторного запуска конфигурации CMake. Проблема 0014820: предупредить пользователей об удалении только CMakeCache.txt утверждает, что вам нужно также удалить все CMakeFiles каталоги.

Из моего опыта самый надежный способ перезапустить конфигурацию CMake - это прикоснуться к одному из проектов. CMakeLists.txt файлы.

Примечание: для ninja CMake добавляет rebuild_cache цель для удобного запуска CMake для вашего проекта снова.

Retrigger после обновлений из системы контроля версий

Всего лишь одна мысль: если удаление исходных файлов происходит из-за того, что они были удалены из вашего контроля версий, возможно, существует обходной путь, который все еще позволяет вам использовать file(GLOB ...) в ваших исходных файлах.

Например, если вы используете GIT, вы можете добавить следующее в свой основной CMakeLists.txt:

configure_file(${CMAKE_SOURCE_DIR}/.git/index ${PROJECT_BINARY_DIR}/git_index.tmp) 

Недостаток: Это приведет к повторной настройке конфигурации каждой операции GIT (обновление, фиксация, ...).

Некоторые ссылки:

Другие вопросы по тегам