Ответ 1
В языке makefile [email protected]
означает "имя цели", поэтому rm -f [email protected]
переводит на rm -f clean
.
Вам нужно указать rm
, что именно вы хотите удалить, например rm -f *.o code1 code2
У меня есть Makefile, который выглядит как
CXX = g++ -O2 -Wall
all: code1 code2
code1: code1.cc utilities.cc
$(CXX) $^ -o [email protected]
code2: code2.cc utilities.cc
$(CXX) $^ -o [email protected]
Что я хочу сделать дальше, это включить clean target
, чтобы каждый раз
Я запустил make
, он автоматически удалит существующие двоичные файлы code1
и code2
перед созданием новых.
Я попытался поместить эти строки в конец файла makefile, но он не работает
clean:
rm -f [email protected]
echo Clean done
Какой правильный способ сделать это?
В языке makefile [email protected]
означает "имя цели", поэтому rm -f [email protected]
переводит на rm -f clean
.
Вам нужно указать rm
, что именно вы хотите удалить, например rm -f *.o code1 code2
Лучше всего, вероятно, создать переменную, содержащую ваши двоичные файлы:
binaries=code1 code2
Затем используйте это в all
-target, чтобы избежать повторения:
all: clean $(binaries)
Теперь вы можете использовать это с помощью clean
-target, а также просто добавить некоторые глобы для захвата объектных файлов и файлов:
.PHONY: clean
clean:
rm -f $(binaries) *.o
Обратите внимание на использование .PHONY
, чтобы сделать clean
a псевдо-цель. Это функция GNU make, поэтому, если вам нужно быть переносимым для других реализаций make, не используйте его.
Кстати, он написан, чистое правило вызывается только в том случае, если оно явно вызывается:
сделать чистым
Я думаю, что это лучше, чем очищать каждый раз. Если вы хотите сделать это по-своему, попробуйте следующее:
CXX = g++ -O2 -Wall all: clean code1 code2 code1: code1.cc utilities.cc $(CXX) $^ -o [email protected] code2: code2.cc utilities.cc $(CXX) $^ -o [email protected] clean: rm ... echo Clean done