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