Так же, как make clean
удаляются все файлы, созданные make-файлом, я хотел бы сделать то же самое с CMake. Слишком часто я оказываюсь вручную, просматривая каталоги, удаляя такие файлы, как cmake_install.cmake
и CMakeCache.txt
, и CMakeFiles
папки.
Есть ли команда, как cmake clean
удалить все эти файлы автоматически? В идеале это должно следовать рекурсивной структуре, определенной в CMakeLists.txt
файле текущего каталога .
cd <location-of-cmakelists>/build && cmake ..
Официальный FAQ CMake гласит:
источник
В эти дни Git повсюду, вы можете забыть CMake и использовать
git clean -d -f -x
, что удалит все файлы, не находящиеся под контролем исходного кода.источник
-x
вариант, хотя. Это отличный трюк вgit
торговле. Хотя я бы лично еще сделать всухую первый,git clean -d -f -x -n
. Время от времени я держу файл удобства, который я использую для проекта, сgit
контролируемой папкой проекта , но я не хочу делиться этим с другими, поэтому я не делаюgit add
этого с проектом. Это уничтожило бы этот файл, если бы я не был осторожен, чтобы добавить-e <pattern>
опцию. На этой ноте было бы неплохо, еслиgit
бы был.gitcleanignore
файл. :)chattr +i $filename
(нужны права суперпользователя, не позволяет изменять файл после этого). Таким образом, git не сможет удалить этот файл, даже если попытается сделать это такrm -f
.git add
?Я гуглил его примерно полчаса, и единственное полезное, что я придумал, это вызов
find
утилиты:Кроме того, обязательно вызовите
make clean
(или любой другой генератор CMake, который вы используете) перед этим.:)
источник
rm -rf CMakeFiles ; rm -rf */CMakeFiles ; rm -rf */*/CMakeFiles ; rm -rf */*/*/CMakeFiles
и все еще не сделал ...Вы можете использовать что-то вроде:
Я обычно создаю команду «make clean-all», добавляя вызов «make clean» в предыдущий пример:
Не пытайтесь добавить «чистую» цель в качестве зависимости:
Потому что «чистый» не настоящая цель в CMake, и это не работает.
Более того, вы не должны использовать этот «clean-cmake-files» как зависимость от чего-либо:
Потому что, если вы сделаете это, все файлы CMake будут стерты до завершения clean-all, и make выдаст вам ошибку при поиске «CMakeFiles / clean-all.dir / build.make». Следовательно, вы не можете использовать команду clean-all перед «что-нибудь» в любом контексте:
Это тоже не работает.
источник
Просто выдача
rm CMakeCache.txt
работает для меня тоже.источник
cmake /build-path
снова бежать .Может быть, это немного устарело, но так как это первый хит, когда вы Google
cmake clean
, я добавлю это:Поскольку вы можете начать сборку в директории сборки с указанной целью с помощью
cmake --build . --target xyz
Вы можете, конечно, бежать
cmake --build . --target clean
запустить
clean
цель в сгенерированных файлах сборки.источник
Я согласен, что сборка вне исходного кода - лучший ответ. Но те времена , когда вы просто должны сделать сборку в истоке, я написал сценарий Python доступного здесь , который:
источник
make
когда нетMakefile
присутствия из-за предварительной очистки (то есть делает этот скрипт идемпотентным). Просто добавьте строку (правильно расположенную):if os.path.isfile(os.path.join(directory,'Makefile')):
прямо перед строкой 24:args = [
и, конечно, сделайте отступ для остальной части тела функции после только что добавленной строки. Это будет выполнено, толькоmake ... clean
если aMakefile
присутствует в текущем очищаемом каталоге. В остальном сценарий идеален!Решение, которое я недавно нашел, состоит в том, чтобы объединить концепцию сборки вне исходного кода с оболочкой Makefile.
В мой файл CMakeLists.txt верхнего уровня я включаю следующее, чтобы предотвратить сборку в исходном коде:
Затем я создаю Makefile верхнего уровня и включаю следующее:
Цель по умолчанию
all
вызывается с помощью вводаmake
и вызывает цель./build/Makefile
.Первое, что
./build/Makefile
делает цель , - это создаетbuild
каталог с$(MKDIR)
помощью переменнойmkdir -p
. В каталогеbuild
мы будем выполнять сборку вне исходного кода. Мы приводим аргумент,-p
чтобыmkdir
не кричать на нас за попытку создать каталог, который уже может существовать.Второе, что
./build/Makefile
делает цель - это изменить каталоги наbuild
каталог и вызвать егоcmake
.Возвращаясь к
all
цели, мы вызываем$(MAKE) -C build
, где$(MAKE)
автоматически создается переменная Makefilemake
.make -C
меняет каталог, прежде чем делать что-либо. Следовательно, использование$(MAKE) -C build
эквивалентно действиюcd build; make
.Подводя итог, вызов этой оболочки Makefile с помощью
make all
илиmake
эквивалентен выполнению:Цель
distclean
вызываетcmake ..
, а затемmake -C build clean
, наконец, удаляет все содержимое изbuild
каталога. Я считаю, что это именно то, что вы просили в своем вопросе.Последний фрагмент Makefile оценивает, является ли предоставленная пользователем цель или нет
distclean
. Если нет, он изменит каталоги,build
прежде чем вызывать его. Это очень мощно, потому что пользователь может напечатать, напримерmake clean
, и Makefile преобразует это в эквивалентcd build; make clean
.В заключение, эта оболочка Makefile в сочетании с обязательной конфигурацией CMake для сборки из источника делает ее такой, чтобы пользователю никогда не приходилось взаимодействовать с командой
cmake
. Это решение также предоставляет элегантный метод для удаления всех выходных файлов CMake изbuild
каталога.PS В Makefile мы используем префикс
@
для подавления вывода команды оболочки и префикс@-
для игнорирования ошибок команды оболочки. При использовании вrm
качестве частиdistclean
цели, команда вернет ошибку, если файлы не существуют (возможно, они уже были удалены с помощью командной строкиrm -rf build
или никогда не создавались). Эта ошибка возврата заставит наш Makefile выйти. Мы используем префикс,@-
чтобы предотвратить это. Это приемлемо, если файл уже был удален; мы хотим, чтобы наш Makefile продолжал работать и удалял все остальное.Еще один момент, на который следует обратить внимание: этот Makefile может не работать, если вы используете переменное число переменных CMake для построения вашего проекта, например
cmake .. -DSOMEBUILDSUSETHIS:STRING="foo" -DSOMEOTHERBUILDSUSETHISTOO:STRING="bar"
. Этот Makefile предполагает, что вы вызываете CMake последовательным способом, набираяcmake ..
или предоставляяcmake
непротиворечивое количество аргументов (которые вы можете включить в ваш Makefile).Наконец, кредит, где кредит должен. Эта оболочка Makefile была адаптирована из Makefile, предоставленного шаблоном проекта приложения C ++ .
источник
Конечно, сборки из исходного кода - это метод перехода для сборочных файлов Unix, но если вы используете другой генератор, такой как Eclipse CDT, он предпочитает собирать в исходном коде. В этом случае вам нужно будет удалить файлы CMake вручную. Попробуй это:
Или, если вы включили globstar с
shopt -s globstar
, попробуйте этот менее отвратительный подход:источник
build
. Это заняло немного больше времени, чем эти команды, но я должен был сделать это только один раз :)попробуйте использовать: cmake --clean-first path-of-CMakeLists.txt-file -B output-dir
--clean-first: сначала создать мишень, а затем построить.
(Только для очистки используйте --target clean.)
источник
В случае, когда вы передаете
-D
параметры в CMake при генерации файлов сборки и не хотите удалять весь каталог build /:Просто удалите каталог CMakeFiles / внутри вашего каталога сборки.
Это приводит к повторному запуску CMake, и системные файлы сборки восстанавливаются. Ваша сборка также начнется с нуля.
источник
Чтобы упростить очистку при использовании сборки «вне источника» (т. Е. При сборке в
build
каталоге), я использую следующий скрипт:Каждый раз, когда вам нужно очистить, вы должны получить этот скрипт из
build
каталога:источник
cd .. ; rm ; mkdir ; cd
последовательность наcd .. ; rm -rf build/*
.Если у вас есть пользовательские определения и вы хотите сохранить их перед очисткой, запустите следующее в вашей директории сборки:
Затем создайте новый каталог сборки (или удалите старый каталог сборки и воссоздайте его) и, наконец, запустите
cmake
аргументы, которые вы получите с помощью приведенного выше сценария.источник
Если вы бежите
это восстановит файлы CMake. Что необходимо, если вы добавляете новый файл в исходную папку, выбранную, например, * .cc.
Хотя это и не «чистый» как таковой, он «очищает» файлы CMake путем регенерации кешей.
источник
Я использую следующий скрипт для таких целей:
Если вы используете Windows, используйте Cygwin для этого скрипта.
источник
Забавно видеть, что этот вопрос получает так много внимания и сложных решений, что действительно показывает боль, когда у меня нет чистого метода cmake.
Ну, вы можете определенно
cd build
делать свою работу, а затем делать,rm -rf *
когда вам нужно убрать. Однакоrm -rf *
это опасная команда, учитывая, что многие люди часто не знают, в каком каталоге они находятся.Если вы
cd ..
,rm -rf build
а затемmkdir build
и тогдаcd build
, это просто слишком много печатать.Поэтому хорошим решением будет просто остаться вне папки сборки и указать cmake путь:
настроить:
cmake -B build
построить:
cmake --build build
очистить:
rm -rf build
воссоздать папку сборки: вам даже не нужно
mkdir build
, просто настройте ее,cmake -B build
и cmake создаст ееисточник
cmake
В основном готовитMakefile
, можно добавитьrm
в чистую ФОНИ .Например,
источник
У меня есть это в мой файл оболочки RC (
.bashrc
,.zshrc
):Вы должны использовать его только для сборок вне исходного кода. Допустим, у вас есть каталог
build/
для этой цели. Тогда вам просто нужно бежатьt-cmake-clean
изнутри.источник
Я успешно использовал ответ zsxwing, чтобы решить следующую проблему:
У меня есть источник, который я собираю на нескольких хостах (на плате Raspberry Pi Linux, на виртуальной машине VMware Linux и т. Д.)
У меня есть сценарий Bash, который создает временные каталоги на основе имени хоста компьютера, например:
источник
Создайте временный каталог сборки, например
build_cmake
,. Следовательно, все ваши файлы сборки будут в этой папке.Затем в вашем основном файле CMake добавьте команду ниже.
Следовательно, при компиляции
И для очистки сделать:
источник