在移植ipq5018的uboot的时候,发现dtb每次读重编。原因是.S和.dtb被删除了,编译日志打印:
rm arch/arm/dts/ipq5018-mp02.1.dtb.comb.S arch/arm/dts/ipq5018-mp02.1.dtb
还以为是Makefile的rule删除的,搜索了源码,没有发现执行rm的地方。原来是GNU Make搞的鬼。GNU Make会删除中间文件。例子如下:
run-%: d/%.out $< d/%.out: d/%.c gcc -o $(subst .c,.out,$<) $<
执行: make run-a,中间文件d/%.out被删除了。
GNU make会删除implicit rule的中间文件。这里使用了%,就相当于使用了隐式规则,导致中间文件被删除。
解决办法是使用.PRECIOUS伪目标。
.PRECIOUS: $(obj)/%.dtb.comb.S $(obj)/%.dtb
参考:
https://unix.stackexchange.com/questions/517190/what-causes-make-to-delete-intermediate-files