Как избежать ошибки "нет такого файла или каталога" для "make clean" Makefile target
у меня есть Makefile, который определяет a .Фальшивые цели "очистить" для очистки .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
команда "удалить эти файлы, если они существуют, и не жаловаться, если нет"? Я поискал в manpage для rm
, и не нашел такого флага.
Edit: я на самом деле не заметил описание -f
флаг в manpage, это решение.
4 ответов
использовать rm -f
(или даже лучше $(RM)
, обеспечивается встроенным make
правила, которые можно узнать с помощью make -p
) вместо rm
в своем clean
правило.
Когда Цели Терпят Неудачу
когда цель выполняется, она возвращает состояние в зависимости от того, выполнена она или нет это было успешно-если цель терпит неудачу, то make не будет выполнять никаких цели, которые от этого зависят. Например, в приведенном выше примере, если "очистить" не удается, а затем перестроить не будет выполнять цель "построить". К сожалению, это может произойти, если нет основного файла для удаления. К счастью, эта проблема может быть решена достаточно легко, включив знак "минус" в перед командой, статус которой следует игнорировать:
clean: -rm -f *.o core
Я отказался от rm. Следующая команда удалит файлы и каталоги.
find . -delete
чтобы удалить только файлы или только dirs, есть опция-type:
# remove only files
find . -type f -delete
# remove only dirs
find . -type d -delete
На самом деле, я создал небольшой скрипт (основанный на этом фрагменте) с именем bomb, который удаляет файлы без жалоб:https://github.com/lingtalfi/bomb