Makefile 向隐式规则的所有用途添加依赖项
我有一个makefile,可以使用现有的Makefile 向隐式规则的所有用途添加依赖项,makefile,gnu-make,Makefile,Gnu Make,我有一个makefile,可以使用现有的%.c到%.o将c文件编译成目标文件 但是,我希望使用此隐式规则构建的所有.o文件也依赖于附加的头文件foo.h 我知道我可以添加额外的一次性规则,使单个.o文件依赖于foo.h,例如: bar.o : foo.h 。。。但是我想添加foo.h作为从.c文件生成的所有.o文件的依赖项 与上述类似,我尝试了以下方法: %.o : %.c foo.h 这是: %.o : foo.h 看看是否可以“添加”依赖项,但保留隐式规则 它不起作用。我当然可以将配方
%.c
到%.o
将c文件编译成目标文件
但是,我希望使用此隐式规则构建的所有.o
文件也依赖于附加的头文件foo.h
我知道我可以添加额外的一次性规则,使单个.o
文件依赖于foo.h
,例如:
bar.o : foo.h
。。。但是我想添加foo.h
作为从.c
文件生成的所有.o
文件的依赖项
与上述类似,我尝试了以下方法:
%.o : %.c foo.h
这是:
%.o : foo.h
看看是否可以“添加”依赖项,但保留隐式规则
它不起作用。我当然可以将配方从隐式规则复制粘贴到我的模式规则中,如下所示:
%.o : %.c foo.h
$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
%.o:%.c foo.h
$(CC)-c$(CPPFLAGS)$(CFLAGS)$<
但如果可能的话,我不想复制它。您的困难在于如何处理模式规则。要强制考虑<代码> fo.h < /C>作为所有对象文件的先决条件,必须显式列出对象文件,而不依赖于模式规则。但是make提供了一种方法:静态模式规则,它看起来像一个模式规则,但更像是一组类似规则的紧凑形式。例如:
OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
$(OBJS): %.o: foo.h
唯一的限制是必须找到一种方法来枚举所有对象文件。这通常不是一个真正的问题
请注意,在您的特定情况下,甚至不需要模式功能,因为所有目标的先决条件都是相同的。您还可以使用:
OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
$(OBJS): foo.h
谢谢我想这与复制隐式规则差不多。@BeeOnRope我认为它与。请参阅步骤4…引用手册:“它们比具有多个目标的普通规则更通用,因为目标不必具有相同的先决条件。”。。。但是由于本例中的先决条件是相同的,因此我认为使用静态模式规则与普通的
$(OBJS):foo.h
相比没有任何优势。我错过了什么吗?@Vroomfondel你是对的,在这种情况下,它相当于标准的非模式规则。我提到了静态模式规则,因为原始模式也是基于模式的,而且静态模式规则很好理解。编辑了我的答案,包括你的评论。