Как включать чистую цель в Make-файл?

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

Что правильный путь состоит в том, чтобы сделать это?

22
задан Mateusz Piotrowski 4 April 2016 в 02:21
поделиться

3 ответа

На языке make-файлов $ @ означает «имя цели», поэтому rm -f $ @ преобразуется в rm -f clean .

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

19
ответ дан 29 November 2019 в 03:59
поделиться

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

binaries=code1 code2

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

all: clean $(binaries)

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

.PHONY: clean

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

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

35
ответ дан 29 November 2019 в 03:59
поделиться

По тому, как написано, правило 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
2
ответ дан 29 November 2019 в 03:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: