Как избежать ошибки "нет такого файла или каталога" для "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правило.


rm-f

заставит и не выведет никакой ошибки


Когда Цели Терпят Неудачу

когда цель выполняется, она возвращает состояние в зависимости от того, выполнена она или нет это было успешно-если цель терпит неудачу, то make не будет выполнять никаких цели, которые от этого зависят. Например, в приведенном выше примере, если "очистить" не удается, а затем перестроить не будет выполнять цель "построить". К сожалению, это может произойти, если нет основного файла для удаления. К счастью, эта проблема может быть решена достаточно легко, включив знак "минус" в перед командой, статус которой следует игнорировать:

clean:
        -rm -f *.o core

~ http://www.cprogramming.com/tutorial/makefiles.html


Я отказался от 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