Makefile 在Make中通过grep查找依赖项

Makefile 在Make中通过grep查找依赖项,makefile,gnu-make,Makefile,Gnu Make,我正在用纯C进行一个相当大的项目,出于各种原因,我们不使用CMake 我们有一个很好的系统,它使用各种shell命令,只需要很少的维护。它将自动查找新的头文件和C文件,并将头文件添加到依赖项中,并将编译C文件并将其包含在输出中。然而,我们已经到了对头文件所做的任何更改都会成为问题的地步,因为它需要重新编译整个项目,而不仅仅是直接或间接包含它的C文件 我在一个系统上工作,以确保作为依赖项添加的头文件是C文件本身所需的头文件(递归地向上) 我原以为我自己就能解决这个问题,但make对于变量的展开似乎

我正在用纯C进行一个相当大的项目,出于各种原因,我们不使用CMake

我们有一个很好的系统,它使用各种shell命令,只需要很少的维护。它将自动查找新的头文件和C文件,并将头文件添加到依赖项中,并将编译C文件并将其包含在输出中。然而,我们已经到了对头文件所做的任何更改都会成为问题的地步,因为它需要重新编译整个项目,而不仅仅是直接或间接包含它的C文件

我在一个系统上工作,以确保作为依赖项添加的头文件是C文件本身所需的头文件(递归地向上)

我原以为我自己就能解决这个问题,但make对于变量的展开似乎有着相当不一致的规则

我提出的解决方案是尝试使用ag并从文件中获取所有包含内容。这是按照预期的方式工作的,我将它导入tr,这样我就可以确保没有添加换行符,从而弄乱了组合。但我遇到的问题是确定搜索哪个文件。这是它用于相关章节的配方:

$(GAMEOBJDIR)/%.o : $(GAMEDIR)/%.c $(shell ag -o '(?<=(^#include "))(.*?)(?=("$$))' $(GAMEDIR)/%.c | tr '\n' ' ')
    $(CC) $(CFLAGS) $(if $(RELEASE),$(RELFLAGS),$(DBFLAGS)) -c -o $@ $<

$(GAMEOBJDIR)/%.o:$(GAMEDIR)/%.c$(shell ag-o'(?Make的扩展规则是完全一致的…但有时它们不是人们想要的。这不是一回事:)

这里解释了扩展规则。在您的例子中,您使用的是一个先决条件列表,这意味着在分析makefile时变量会被扩展。这包括shell命令和所有其他变量。因为您使用的是模式规则,这意味着在分析makefile时,它与任何特定文件都不匹配,它只是定义了模式规则本身。因此,
%
不能在这里展开。它将在以后的make开始遍历依赖关系图并试图找到构建目标的方法时展开

通常情况下,您的方法无法有效工作。您可以使用推迟先决条件列表的这些部分的扩展。但是,这意味着每次make想要尝试使用此模式时,它都会运行这些命令,这将非常缓慢

您是否考虑过使用更标准的方法来管理检测先决条件?例如,尝试阅读,看看它是否适合您