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 (обновление, фиксация, ...).
Некоторые ссылки: