Por que .SECONDARY não funciona com padrões (%) enquanto .PRECIOUS?

Minha pergunta é entender melhor o que eu perdi no processo de fabricação e no .SECONDARY purpose vs .PRECIOUS, para não fazer meu script funcionar, pois ele já funciona.

Estou usando o make para abrir um editor emacs em um arquivo (java, mas irrelevante para o propósito desta pergunta) ou para criá-lo com um modelo, se não existir.

Se funcionar bem com arquivos existentes,ao usar o arquivo gerado, ele é removido no final.

Eu adicionei o pré-requisito no .SECONDARY, mas não ajudou, eu tive que adicioná-lo no .PRECIOUS.

Esta é uma perguntapor que não estava funcionando no. .

Pelo que encontrei no SO.SECONDARY não funciona com padrões (%), mas mesmo sabendo que me pergunto se é por design ou se é um bug no make. (. SECUNDÁRIO para uma regra de padrão com o GNU Make eA regra do padrão Makefile ignora a regra falsa ou exclui espontaneamente o arquivo de saída )

Aqui está um conteúdo simplificado do meu Makefile para reproduzir o meu problema (crie um diretório com / stackoverflow / question para testá-lo).

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

experimentar

fazer o trabalho / SoTest

Eu entendo que isso é sinalizado como intermediário.

Então, procurando no SO, tentei defini-lo em .SECONDARY: target list: também não funciona.

olhando para fazer código-fonte que descobri que faz a remoção intermediária de arquivos é feito dentro deste contexto:

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

então eu configurei meu arquivo em .PRECIOUS: e agora ele funciona.

ele exibe no console:

com / stackoverflow / question / SoTest.java

ele roda o emacs com o template certo, então a criação é boa aqui eu saio do emacs

e remove o arquivo no final

rm com / stackoverflow / question / SoTest.java

A remoção no final é devido ao arquivo intermediário, isso pode ser visto com a opção -d no make

LANG = C faz-d funcionar / 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

Para que ele funcione, preciso descomentar o parágrafo .PRECIOUS.

make --version

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.

questionAnswers(2)

yourAnswerToTheQuestion