Makefile 如何在递归生成文件中获取目标的依赖关系?
当一个项目依赖于另一个具有自己makefile的项目时,递归make的用法如下: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
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