#linux #makefile #rm
#linux #makefile #rm
Вопрос:
Я унаследовал файл проекта, в котором есть Makefile, который делает то, чего я никогда раньше не видел — вводит команду rm. Я не могу найти никакой причины для команды rm, поэтому я упускаю что-то очень очевидное или очень эзотерическое.
Спасибо
Результаты выполнения make:
bison --defines --xml --graph=calc.gv -o calc.c calc.y
Bison flags =
cc -c -o calc.o calc.c
Making BASE = calc
cc -o calc calc.o
Done making BASE
rm calc.c <======== WHERE IS THIS COMING FROM?
Файл Makefile является:
BASE = calc
BISON = bison
XSLTPROC = xsltproc
all: $(BASE)
%.c %.h %.xml %.gv: %.y
$(BISON) $(BISONFLAGS) --defines --xml --graph=$*.gv -o $*.c
lt;
@echo "Bison flags = " $(BISONFLAGS)
$(BASE): $(BASE).o
@echo "Making BASE = " $(BASE)
$(CC) $(CFLAGS) -o $@ $^
@echo "Done making BASE"
run: $(BASE)
@echo "Type arithmetic expressions. Quit with ctrl-d."
./
lt;
html: $(BASE).html
%.html: %.xml
$(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $($(BISON) --print-datadir)/xslt/xml2xhtml.xsl
lt;
CLEANFILES = $(BASE) *.o $(BASE).[ch] $(BASE).output $(BASE).xml $(BASE).html $(BASE).gv
clean:
@echo "Running clean" $(CLEANFILES)
rm -f $(CLEANFILES)
Комментарии:
1. Как объяснил Максим в своем ответе, это нормальное поведение,
calc.c
это промежуточная цель, которую вы явно не запрашивали. Я просто добавляю, что, если вы хотите сохранить эту цель, вы можете объявить ее как драгоценную, добавив ее в качестве предварительного условия специальной цели.PRECIOUS
. Просто добавьте строку.PRECIOUS: calc.c
где-нибудь в свой Makefile.2. Не стоит сохранять промежуточный файл, поскольку это помешает make перестроить его при изменении calc.y .
3. Вы не должны использовать
.PRECIOUS
..PRECIOUS
потенциально опасна и должна использоваться только в определенных ситуациях и с тщательным рассмотрением. Вам все равно не нужно этого делать, вам просто нужно указать файл в качестве целевого или предварительного условия В ЛЮБОМ МЕСТЕ . Если у вас действительно нет другой необходимости в этом, то это сделает что-то столь же простое, как добавление фиктивного правила, напримерmake-src: $(BASE).c
.4. Почему это
.PRECIOUS
плохо: подумайте, находится лиbison
он в середине записиcalc.c
, и вы используете^C
. Поскольку вы объявили файл.PRECIOUS
, make не очистит его для вас, и у вас будет наполовину записанный файл с более новым временем модификации, поэтому повторный запуск make не приведет к его восстановлению. Возможно, это приведет к очевидному сбою, но, возможно, это приведет к незначительному сбою..PRECIOUS
используется только в ситуациях, когда вы хотите сохранить выходные данные, даже если сборка прервана. На самом деле это не имеет ничего общего с промежуточными файлами.5. Спасибо всем за ответы. Я пропустил эту ссылку в документации о промежуточных файлах, хотя я искал «rm».
Ответ №1:
См. https://www.gnu.org/software/make/manual/make.html#Chained-Rules:
Второе отличие заключается в том, что если make создает
b
, чтобы обновить что-то еще, он удаляетb
позже, когда он больше не нужен. Следовательно, промежуточный файл, который не существовал до make, также не существует после make.make
сообщает вам об удалении, печатаяrm -f
команду, показывающую, какой файл она удаляет.