Makefile 如何在递归生成文件中获取目标的依赖关系?

Makefile 如何在递归生成文件中获取目标的依赖关系?,makefile,gnu-make,Makefile,Gnu Make,当一个项目依赖于另一个具有自己makefile的项目时,递归make的用法如下: LIBDIR := path/to/lib LIBNAME := library.a LIBPATH := $(LIBDIR)/$(LIBNAME) $(LIBPATH): $(MAKE) -C $(LIBDIR) $(LIBNAME) 然而,这种方法的明显问题是make无法确定$(LIBPATH)的依赖关系,因为它是在$(LIBDIR)中的递归makefile中定义的 我目前正在使用.PHON

当一个项目依赖于另一个具有自己makefile的项目时,递归make的用法如下:

LIBDIR := path/to/lib
LIBNAME := library.a
LIBPATH := $(LIBDIR)/$(LIBNAME)

$(LIBPATH):
        $(MAKE) -C $(LIBDIR) $(LIBNAME)
然而,这种方法的明显问题是make无法确定
$(LIBPATH)
的依赖关系,因为它是在
$(LIBDIR)
中的递归makefile中定义的

我目前正在使用.PHONY目标强制检查子项目是否需要重建:

$(LIBPATH): always_build
        $(MAKE) -C $(LIBDIR) $(LIBNAME)

.PHONY: always_build
虽然这允许我在需要时触发重建,但它仍然需要遍历许多目录并多次调用make,以发现不需要执行任何操作


有没有办法从子makefile中获取依赖项,这样我就可以将它们添加为
$(LIBPATH)
的依赖项,这样子makefile只有在真正需要调用时才会被调用?

如果你的意思是,以自动方式,那么就没有了。即使有,也没有任何意义

为了获得这些先决条件,您必须调用make来计算它们。一旦子制造商计算了这些条件,它将通知父制造商,父制造商将检查先决条件,然后如果任何先决条件过期,它将再次调用子制造商,该子制造商将重新计算先决条件以实际构建目标

你的工作效率非但没有提高,反而是原来的三倍

在递归生成场景中,当前将过期计算委托给子生成的方法是您所能做的最好方法

您真正需要的是使用非递归make环境,其中make的单个实例知道所有先决条件并确定哪些内容过时。但是,请注意,这并不能真正解决“不读取大量makefile”的问题


最终,如果不检查项目是否完全是最新的,您就无法知道您的项目是否完全是最新的。。。这意味着检查所有的依赖关系。

事实上,这是“为什么递归make被认为是有害的”的主要原因。将它重写为非递归的,或者直接使用它。这将帮助您开始使用非递归的makefast