Makefile -- 如果它已经存在,不要重建 order-only 依赖

Makefile -- do not rebuild order-only dependency if it already exists

我想知道是否可以创建一个仅不存在的目标,这样如果依赖项已经存在,则不考虑依赖项的子依赖项。

也就是说,如果我有以下内容:

A : | B
    @echo building $@
    @touch $@

B : C
    @echo build $@
    @touch $@

.PHONY: C 
C:
    @echo build $@

然后我 make A; make A。在第一个 make 中,它重建 CB,然后 A。在第二次调用中,它仍然重建 CB,即使它不需要构建 A。如果 B 已经存在,我想将其短路,这样它就不会考虑 B 的依赖关系...

有不止一种方法。

一种方法是使用递归生成 (DUHN-DUHN-DUHNNNN!)

B :
    @$(MAKE) C
    @echo build $@
    @touch $@

或者您可以将 C 从规则变成配方:

define c-steps
    @echo build C
    @echo with all the steps that C entails
endef

B :
    $(call c-steps)
    @echo build $@
    @touch $@
A : | B
    @echo building $@
    @touch $@

B : $(if $(filter B,$(MAKECMDGOALS)),C) | C
    @echo build $@
    @touch $@

C:
    @echo build $@
    @touch $@

您的依赖项 B : C 仅在您希望明确 B 时适用。需要注意的是,它仅在您删除 C.

的虚假性时才有效