将依赖项添加到现有的 make 目标

Add dependencies to existing make targets

条件 0:

说,我有几个源代码,a.c, b.c, ..., z.c,我想要一个规则来编译每个源代码。这是一个解决方案:

%.o: %.c
    $(CC) -c -o $@ $(CFLAGS) $<

条件一:

然后我介绍一个headerc.h用在c.c,还有一个headere.h用在c.c和[=18] =],事情变得复杂:

%.o: %.c
    $(CC) -c -o $@ $(CFLAGS) $<

c.o: c.c c.h e.h
    $(CC) -c -o $@ $(CFLAGS) $<

e.o: e.c e.h
    $(CC) -c -o $@ $(CFLAGS) $<

我的问题:

根据条件1的解法,make中有没有类似add_dependency的解法简化得到如下的解法?

%.o: %.c
    $(CC) -c -o $@ $(CFLAGS) $<

add_dependency(c.o, c.h e.h)
add_dependency(e.o, e.h)

或者,您认为条件 1 的更好解决方案是什么?

已编辑:

感谢您的通知@ctheo :)
是的,我确实看过 autotools 并了解到这将满足我的所有需求。然而,我正在处理的是一个现有项目,它的 Makefile 包含处理 C++ 中代码的其他指令,我认为现在我最好只修改几行而不是移植整个Makefileautotools,除非我不引入autotools找不到满意的解决方案。 :)

起初我没想到会有解决方案。在我看来,它被 autotools 覆盖了。然而,经过一些搜索,我找到了 this section of GNU/make 手册。

它指出:

One file can be the target of several rules. All the prerequisites mentioned in all the rules are merged into one list of prerequisites for the target.

所以您的查询有一个解决方案

c.o: c.h e.h
e.o: e.h

%.o: %.c
        $(CC) -c -o $@ $(CFLAGS) $<

谢谢你的坚持。我今天学到了一些东西:)

此外,您示例中的 .o 文件都依赖于具有相同主干的 .h 文件,因此您也可以概括这部分规则:

c.o: e.h

%.o: %.c %.h
        $(CC) -c -o $@ $(CFLAGS) $<

这样,您的“正常”情况完全被触发编译的规则涵盖,您的“异常”情况脱颖而出,因为它们是唯一的附加规则。