Как включить чистую цель в Makefile? - PullRequest
21 голосов
/ 14 апреля 2010

У меня есть Makefile, который выглядит следующим образом

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

Какой правильный способ сделать это?

Ответы [ 3 ]

33 голосов
/ 14 апреля 2010

Лучше всего, вероятно, создать переменную, которая содержит ваши двоичные файлы:

binaries=code1 code2

Затем используйте это в цели all, чтобы избежать повторения:

all: clean $(binaries)

Теперь вы можете использовать это и с целью clean и просто добавить несколько глобусов, чтобы перехватить объектные файлы и прочее:

.PHONY: clean

clean:
    rm -f $(binaries) *.o

Обратите внимание на использование .PHONY для создания clean a псевдо-цели . Это GNU make, поэтому если вам нужно быть переносимым на другие реализации make, не используйте его.

19 голосов
/ 14 апреля 2010

На языке makefile $@ означает «имя цели», поэтому rm -f $@ означает rm -f clean.

Вам необходимо указать rm, что именно вы хотите удалить, например rm -f *.o code1 code2

2 голосов
/ 14 апреля 2010

Между прочим, чистое правило вызывается, только если оно явно вызывается:

сделать чистым

Я думаю, что это лучше, чем чистить каждый раз. Если вы хотите сделать это по-своему, попробуйте следующее:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...