Как избежать "Нет такого файла или каталога" Ошибка для `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

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

Поздно к вечеринке, но вот еще одно решение, которое работает с нашей необычной средой сборки:

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

Другие вопросы по тегам