未能注意到更改

时间:2018-07-06 16:02:38

标签: makefile

我遇到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,它可以正常工作,所以确实有一些它不喜欢的东西,但是我真的不确定发生了什么。

有什么想法吗?

1 个答案:

答案 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。