Почему .SECONDARY не работает с шаблонами (%), а .PRECIOUS работает?

Мой вопрос состоит в том, чтобы лучше понять, что я пропустил в процессе создания и .SECONDARY цели против .PRECIOUS, чтобы не заставить мой сценарий работать, так как он уже работает.

Я использую make, чтобы либо открыть редактор emacs для файла (Java, но не имеет отношения к цели этого вопроса), либо создать его с шаблоном, если он не существует.

Если это хорошо работает с существующими файлами,при использовании сгенерированного файла он удаляется в конце.

Я добавил предпосылку в .SECONDARY, но это не помогло, мне пришлось добавить ее в .PRECIOUS.

Это вопроспочему это не работает в. ВТОРИЧНЫЙ? .

Из того, что я нашел на SO.SECONDARY не работает с шаблонами (%), но даже зная, что мне интересно, если это дизайн или это ошибка в make. (.SECONDARY для шаблонного правила с GNU Make а такжеШаблонное правило makefile либо игнорирует фальшивое правило, либо самопроизвольно удаляет выходной файл )

Вот урезанное содержимое моего Makefile, чтобы воспроизвести мою проблему (пожалуйста, создайте каталог com / stackoverflow / question для его проверки).

PACKAGE=com.stackoverflow.question
PACKAGE_DIR=$(subst .,/,$(PACKAGE))
OUT=out

clean:
    find $(OUT) -name "*.class" -type f -print0|xargs -0 rm

# does not work : deleted at end due to intermediate file removal.
$(PACKAGE_DIR)/%.java:
    @echo "package com.stackoverflow.question;\npublic class $(subst .java,,$(subst $(PACKAGE_DIR)/,,$@))\n{\n /** TODO */ \n}" >$@ 

work/%: $(PACKAGE_DIR)/$(subst work/,,%).java
    emacs 
PACKAGE=com.stackoverflow.question
PACKAGE_DIR=$(subst .,/,$(PACKAGE))
OUT=out

clean:
    find $(OUT) -name "*.class" -type f -print0|xargs -0 rm

# does not work : deleted at end due to intermediate file removal.
$(PACKAGE_DIR)/%.java:
    @echo "package com.stackoverflow.question;\npublic class $(subst .java,,$(subst $(PACKAGE_DIR)/,,$@))\n{\n /** TODO */ \n}" >$@ 

work/%: $(PACKAGE_DIR)/$(subst work/,,%).java
    emacs $<

.PHONY: clean work/%

# tried to avoid intermediate file removal : does not work
.SECONDARY: $(PACKAGE_DIR)/%.java 

# if not commented this does work : once precious intermediate file is not removed.
#.PRECIOUS: $(PACKAGE_DIR)/%.java 
lt; .PHONY: clean work/% # tried to avoid intermediate file removal : does not work .SECONDARY: $(PACKAGE_DIR)/%.java # if not commented this does work : once precious intermediate file is not removed. #.PRECIOUS: $(PACKAGE_DIR)/%.java

пытаться

сделать работу / SoTest

Я понимаю, что это помечено промежуточное звено.

затем, глядя в SO, я попытался установить его в .SECONDARY: target list: тоже не работает.

Глядя на исходный код make, я заметил, что удаление промежуточных файлов выполняется в этом контексте:

if (f->intermediate && (f->dontcare || !f->precious)
    && !f->secondary && !f->cmd_target)

поэтому я установил свой файл в. PRECIOUS: и теперь он работает.

он отображает на консоли:

ком / StackOverflow / вопрос / SoTest.java

он запускает Emacs с правильным шаблоном, так что создание в порядке здесь я выхожу из Emacs

и он удаляет файл в конце

rm com / stackoverflow / question / SoTest.java

Удаление в конце происходит из-за промежуточного файла, это можно увидеть с опцией -d на make

LANG = C make -d work / SoTest

...
Must remake target 'work/SoTest'.
emacs com/stackoverflow/question/SoTest.java
Putting child 0xc3b580 (work/SoTest) PID 20681 on the chain.
Live child 0xc3b580 (work/SoTest) PID 20681 
Reaping winning child 0xc3b580 PID 20681 
Removing child 0xc3b580 PID 20681 from chain.
Successfully remade target file 'work/SoTest'.
Removing intermediate files...
rm com/stackoverflow/question/SoTest.java

Чтобы это работало, мне нужно раскомментировать абзац .PRECIOUS.

сделать - версия

GNU Make 4.0
Construit pour x86_64-pc-linux-gnu
Copyright (C) 1988-2013 Free Software Foundation, Inc.
Licence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/gpl.html>
Ceci est un logiciel libre : vous êtes autorisé à le modifier et à la redistribuer.
Il ne comporte AUCUNE GARANTIE, dans la mesure de ce que permet la loi.

Ответы на вопрос(2)

Ваш ответ на вопрос