Как избежать "Нет такого файла или каталога" Ошибка для `make clean` Makefile target
У меня есть Makefile, который определяет чистую цель.PHONY для очистки.o файлов и исполняемых файлов, эта цель выглядит следующим образом:
...
.PHONY : clean
clean:
rm $(addprefix $(vq_DIR),$(vq_OBJS)) \
$(addprefix $(vq_DIR),vq) \
$(addprefix $(covq_DIR),$(covq_OBJS)) \
$(addprefix $(covq_DIR),covq) \
$(addprefix $(covq_2_DIR),$(covq_2_OBJS)) \
$(addprefix $(covq_2_DIR),covq_2) \
$(addprefix $(covq_2_DIR),$(test_OBJS)) \
$(addprefix $(covq_2_DIR),test)
Все работает как надо, но когда некоторые из этих файлов не существуют, rm
выдает ошибку (нет такого файла или каталога), и в выводе говорится, что цель Makefile не удалась, когда она явно сделала то, что я хотела.
Есть ли хороший способ в основном рассказать rm
команда "удалить эти файлы, если они существуют, и не жаловаться, если они не существуют"? Я посмотрел справочную страницу для rm
и не нашел такого флага.
Редактировать: я на самом деле не заметил описание -f
флаг на странице руководства, это решение.
4 ответа
Использование rm -f
(или даже лучше $(RM)
, обеспеченный встроенным make
правила, которые можно узнать с помощью make -p
) вместо rm
в вашем clean
править.
Когда цели терпят неудачу
Когда цель выполняется, она возвращает статус в зависимости от того, была ли она успешной - если цель потерпела неудачу, make не выполнит никаких целей, которые зависят от нее. Например, в приведенном выше примере, если "clean" завершится неудачно, перестроение не выполнит цель "build". К сожалению, это может произойти, если нет основного файла для удаления. К счастью, эту проблему можно решить достаточно легко, добавив знак минус перед командой, статус которой следует игнорировать:
clean: -rm -f *.o core
Поздно к вечеринке, но вот еще одно решение, которое работает с нашей необычной средой сборки:
if exist *.exe rm -f *.exe
Не выводится бесплатно, но уменьшается и выходит чисто:
# make clean
if exist *.exe rm -f *.exe
Я перепробовал много альтернатив, у всех были проблемы, прежде чем остановиться на этом.
Я сдался с рм. Следующая команда удалит файлы и каталоги.
find . -delete
Чтобы удалить только файлы или только каталоги, есть опция -type:
# remove only files
find . -type f -delete
# remove only dirs
find . -type d -delete
На самом деле, я создал небольшой скрипт (на основе этого фрагмента) с именем bomb, который удаляет файлы без жалоб: https://github.com/lingtalfi/bomb