2017-03-27 35 views
1

有史以来第一次尝试写入一个小的Makefile,但遇到了问题 - 如何在每次构建之后停止执行make clean?如何停止每个构建的清理执行?

TASS64=64tass 
EXOMIZER=exomizer 
EXOMIZERFLAGS=sfx basic -n 
VICE=/Applications/VICE/x64.app/Contents/MacOS/x64 
VICEFLAGS=-sidenginemodel 1803 -keybuf "\88" 
SOURCES=$(wildcard *.asm) 
OBJECTS=$(SOURCES:.asm=.prg) 

.PRECIOUS=Calvin.prg 

all: $(TARGETS) 

%.prg: %.asm 
    $(TASS64) -C -a -o [email protected] -i $< 

%: %.prg 
    $(VICE) $(VICEFLAGS) $< 

.PHONY: clean 
clean: 
    rm $(OBJECTS) 
+3

显式列出您的目标。 “全部”规则正在消耗“干净”,所以它正在清洗。 – erip

+0

嗯,即使删除了所有的规则,它仍然会。例如,发布“make sprites”会将sprites.asm生成为sprites.prg并执行prg文件,但是之后仍然会删除sprites.prg –

+0

它是整个'Makefile'吗?我没有看到'TARGETS'的价值。 – uzsolt

回答

1

我想,它不会执行'make clean'。但是,可能发生的是中间(二级)结果被删除。 GNU Make默认是这样做的。为了避免这样做,何况这些中间结果X1, X2, ...

.SECONDARY: X1 X2 ... 

或者,为了留在原地任何辅助效果,只需键入:

.SECONDARY: 

没有任何具体的目标。

+0

SECONDARY没有目标是一个很好的提示,谢谢 –

0

因此,事实证明,默认的Make行为是在出现构建问题时删除输出。虽然在这种情况下构建正确,但我的makefile然后在VICE(c64模拟器)中启动PRG文件。它正确运行,所以我退出了模拟器。

的退出动作返回,使将其视为一个不成功建立一个退出代码,因此删除这是基于这个线程输出PRG

- 通过删除启动VICE目标和随后的测试 - Why does GNU make delete a file

+1

'$(VICE)$(VICEFLAGS)$ <|| true'是一种建议的解决方法,使模拟器始终运行“成功”。 –

+0

今天早上有更多的研究和测试 - 因为我将“运行”步骤作为最终目标,它将前面步骤的输出视为中间文件,从而删除它们。我正在考虑用.SECONDARY标志标记它们(请参阅https://www.gnu.org/software/make/manual/html_node/Special-Targets.html) –