Команда Linux make удаляет исходный файл

#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 команду, показывающую, какой файл она удаляет.