Make 不会在更改时重建模式规则的传递依赖关系,为什么?

Make 不会在更改时重建模式规则的传递依赖关系,为什么?

我有一个Makefile,大致是这样的:

.PRECIOUS: %.a %.b %.c

%.a:
        touch $@

%.b: %.a
        touch $@

%.c: %.b
        touch $@

如果我使用 a 创建“test.c” make test.c,则所有 3 个文件(test.atest.btest.c)都会正确创建。但是,如果我现在删除test.a,然后尝试重新创建test.c,则什么也不会发生。

原因很明显:因为test.c只依赖于test.b,并且test.b没有改变,所以不需要重建。然而,test.b应该重建,因为test.a消失了,而且应该传播到test.c。我发现这种行为是一种非常不直观的副作用。

我可以以某种方式让 make 以直观的方式处理“传递”依赖项吗? (即删除 后test.a,必须重建所有目标。)

该问题仅发生在模式规则中。

(Ps我需要所有中间文件,这就是为什么PRECIOUS。GNU Make的默认行为是删除中间文件。)

答案1

通常,您会使用传统上命名为的虚假目标力量作为 的先决条件%.a,因此如果它不存在,则始终会构建它。另外,gnu make 有一个 .NOTINTERMEDIATE 特殊目标它不会删除中间文件(但会在错误和中断时执行此操作,与 不同.PRECIOUS)。

.NOTINTERMEDIATE: %.a %.b %.c
.PHONY: FORCE
%.a: FORCE
    touch $@
%.b: %.a
    touch $@
%.c: %.b
    touch $@

相关内容