我有一个makefile,我可以使用现有的%.c
到%.o
将C文件编译为目标文件。
但是,我希望使用此隐式规则构建的所有.o
文件还依赖于其他标头foo.h
。
我知道我可以添加其他一次性规则,以使单个.o
文件依赖foo.h
,例如:
bar.o : foo.h
...但我想添加foo.h
作为从.o
文件生成的所有 .c
文件的依赖项。
与上面类似,我试过这个:
%.o : %.c foo.h
和此:
%.o : foo.h
看看我是否可以“添加”依赖项,但保留隐式规则。
它不起作用。我当然可以将配方从隐式规则复制粘贴到我的模式规则中,如:
%.o : %.c foo.h
$(CC) -c $(CPPFLAGS) $(CFLAGS) $<
但如果可能,我不想复制它。
答案 0 :(得分:3)
你的困难是由于如何处理模式规则。要强制make将foo.h
视为所有目标文件的先决条件,必须显式列出目标文件,而不是依赖于模式规则。但是make提供了一种方法:静态模式规则,它看起来像一个模式规则,但更像是一组类似的常规规则的紧凑形式。例如:
OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
$(OBJS): %.o: foo.h
唯一的限制是你必须找到一种枚举所有目标文件的方法。这通常不是一个真正的问题。
请注意,在您的特定情况下,甚至不需要模式功能,因为所有目标的先决条件都相同。你也可以使用:
OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
$(OBJS): foo.h