为隐式规则的所有使用添加依赖项

时间:2017-10-26 02:57:41

标签: makefile gnu-make

我有一个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) $<

但如果可能,我不想复制它。

1 个答案:

答案 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