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 $@