Подтвердить что ты не робот

Как включить чистую цель в Makefile?

У меня есть 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

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

4b9b3361

Ответ 1

В языке makefile [email protected] означает "имя цели", поэтому rm -f [email protected] переводит на rm -f clean.

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

Ответ 2

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

binaries=code1 code2

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

all: clean $(binaries)

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

.PHONY: clean

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

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

Ответ 3

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

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

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

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