将依赖项添加到现有的 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++
中代码的其他指令,我认为现在我最好只修改几行而不是移植整个Makefile
到autotools
,除非我不引入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) $<
这样,您的“正常”情况完全被触发编译的规则涵盖,您的“异常”情况脱颖而出,因为它们是唯一的附加规则。
条件 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++
中代码的其他指令,我认为现在我最好只修改几行而不是移植整个Makefile
到autotools
,除非我不引入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) $<
这样,您的“正常”情况完全被触发编译的规则涵盖,您的“异常”情况脱颖而出,因为它们是唯一的附加规则。