Makefile——如果依赖项已经存在,则不要重建它
我想知道是否有可能创建一个不存在唯一的目标,这样,如果依赖项已经存在,就不会考虑依赖项的子依赖项 也就是说,如果我具备以下条件:Makefile——如果依赖项已经存在,则不要重建它,makefile,dependencies,Makefile,Dependencies,我想知道是否有可能创建一个不存在唯一的目标,这样,如果依赖项已经存在,就不会考虑依赖项的子依赖项 也就是说,如果我具备以下条件: A : | B @echo building $@ @touch $@ B : C @echo build $@ @touch $@ .PHONY: C C: @echo build $@ 然后我做了一个;制作一个。首先,它重建C,B,然后重建A。在第二次调用中,它仍然重建C和B,即使它不需要重建A。我想把它短路,这样就
A : | B
@echo building $@
@touch $@
B : C
@echo build $@
@touch $@
.PHONY: C
C:
@echo build $@
然后我做了一个
;制作一个
。首先,它重建C
,B
,然后重建A
。在第二次调用中,它仍然重建C
和B
,即使它不需要重建A
。我想把它短路,这样就不会考虑<代码> b <代码>的依赖关系。如果<代码> b>代码>已经存在……/p> < p>有不止一种方法。< /P>
一种方法是使用递归Make(DUHN-DUHN-duhnnn!)
或者,您可以将C从规则转换为配方:
define c-steps
@echo build C
@echo with all the steps that C entails
endef
B :
$(call c-steps)
@echo build $@
@touch $@
做这件事的方法不止一种 一种方法是使用递归Make(DUHN-DUHN-duhnnn!) 或者,您可以将C从规则转换为配方:
define c-steps
@echo build C
@echo with all the steps that C entails
endef
B :
$(call c-steps)
@echo build $@
@touch $@
您的依赖项B:C
仅在您希望显式创建B
时适用。需要注意的是,只有消除了C
的虚假性,它才会起作用
您的依赖项
B:C
仅在您希望显式创建B
时适用。需要注意的是,只有当您消除了C
的虚假性时,它才起作用。可能您可以使用$(shell…
函数在每个make
调用上无条件地执行这些命令,而不是将这些命令打包到一个虚假的目标中,从而触发其所有依赖项。但是如果我使用了make D
,那么我就不想运行A
、B
或C
的配方。可能你可以使用$(shell…
函数在每次make
调用中无条件地执行这些命令,而不是将这些命令打包到一个虚假的目标中,从而触发它的所有依赖项。但是如果我使用make D
,那么,那么我就不想运行A
、B
或C
的食谱了。不幸的是,我的例子非常简单。实际上,B是一系列大型组件,每个组件下面都有一个依赖关系网。话虽如此,递归make可能是最好的解决方案。@HardcoreHenry:那样的话。。。C
实际上做什么?也许你可以使用一个虚拟文件作为该规则的目标。不幸的是,我的是一个非常简单的例子。实际上,B是一系列大型组件,每个组件下面都有一个依赖关系网。话虽如此,递归make可能是最好的解决方案。@HardcoreHenry:那样的话。。。C
实际上做什么?也许您可以使用一个虚拟文件作为该规则的目标。但是,如果B
不存在(即第一次生成),则如果您执行了生成,它将不会生成C
。@HardcoreHenry是的,您是对的。如果(但仅当)C
不再是.PHONY
,则可以通过生成B
来解决此问题。但是,如果B
不存在(即第一次生成),如果您生成了a
,则不会生成C
。@HardcoreHenry是的,您是对的。如果(但仅当)C
不再是.PHONY
,则可以通过使B
也仅依赖于C
来解决此问题。
A : | B
@echo building $@
@touch $@
B : $(if $(filter B,$(MAKECMDGOALS)),C) | C
@echo build $@
@touch $@
C:
@echo build $@
@touch $@