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 中,它重建 C
、B
,然后 A
。在第二次调用中,它仍然重建 C
和 B
,即使它不需要构建 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
.
的虚假性时才有效
我想知道是否可以创建一个仅不存在的目标,这样如果依赖项已经存在,则不考虑依赖项的子依赖项。
也就是说,如果我有以下内容:
A : | B
@echo building $@
@touch $@
B : C
@echo build $@
@touch $@
.PHONY: C
C:
@echo build $@
然后我 make A; make A
。在第一个 make 中,它重建 C
、B
,然后 A
。在第二次调用中,它仍然重建 C
和 B
,即使它不需要构建 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
.