我遇到Make无法重建目标的问题,因为它不相信任何更改。我将问题简化为以下两个Makefile:
1)Makefile
.DEFAULT_GOAL := all
%:
@echo "Catch all for $@"
@make -sf common.mk $@
2)common.mk
.PHONY: all clean
all:
@make -s package
@echo "Nothing to do for all"
package: ${shell find ./src -type f}
@echo "The following files have changed... $?"
@echo "Making 'package'"
@touch package
clean:
@echo "Cleaning 'package'"
@rm -f package
使用上述方法,您可以通过以下方式重现该问题:
$mkdir src
$touch src/test.c
$make
在这一点上,如果您尝试重新制作,则可以正确地确定没有任何变化...
$make
但是,如果您模拟更改并尝试重建,它认为没有任何变化...
$touch src/test.c
$make
如果我将“包”目标从common.mk移到Makefile,它可以正常工作,所以确实有一些它不喜欢的东西,但是我真的不确定发生了什么。
有什么想法吗?
答案 0 :(得分:1)
这里:
all:
@make -s package
在对Make的调用中,您没有指定要使用的makefile,因此Make 查找默认值并找到名为“ Makefile”的文件。 Make的新实例尝试重建{ {1}}使用生成文件package
,并找到以下规则:
Makefile
请注意,此规则没有先决条件,尚未声明%:
@echo "Catch all for $@"
@make -sf common.mk $@
package
,并且已经存在一个名为“ package”的文件。因此,Make [1]认为没有理由重建文件,然后终止,将控制权交还给其父Make。