作者anoymouse (没有昵称)
看板C_and_CPP
标题[问题] makefile 自动生成依赖范例问题
时间Mon Jan 20 15:36:33 2020
Ubuntu
GCC
Makefile手册 4.13 Generating Prerequisites Automatically
%.d: %.c
@set -e; rm -f $@; \
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed ’s,\($*\)\.o[ :]*,\1.o $@ : ,g’ < $@.$$$$ > $@; \
rm -f $@.$$$$
sources = foo.c bar.c
include $(sources:.c=.d)
上网查了语法解释 最终会产生一个foo.d,假设prerequisite是foo.c
然後内容是:foo.o foo.d: foo.c foo.h defs.h common.h
1.想请问include後 下一行是不就应该要下recipe了? 不然新增一个规则没recipe是
做什麽呢? 因为我看我的一个专案的makefile就是在最後一行include 一个.d档,但
没有recipe。
2.foo.o foo.d: foo.c .....common.h ,为什麽foo.d要摆在target的位置呢?
不是已经根据prerequisite %.c(foo.c) 判断要不要产生.d档了吗?
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.216.7.85 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1579505795.A.8BE.html
1F:推 Schottky: recipe 没写就会使用 implicit rules 01/20 16:01
3F:→ Schottky: 第二个问题是你误会了,文意是在解释 sed 的作用 01/20 16:04
4F:→ anoymouse: 喔喔对 忘记了 01/20 16:19
5F:→ anoymouse: 但是第二个问题 还是不懂 sed的作用就是这个结果啊? 01/20 16:20
6F:→ Schottky: 用意是当 foo.c *以外* 的 dependencies 有变化时 01/20 17:30
7F:→ Schottky: 依然能触发 foo.d 的 remake 01/20 17:31
8F:→ Schottky: 比如说有人改了 common.h 造成 foo.d 必须更新 01/20 17:32
9F:→ anoymouse: 可是implicit rules会推导出foo.d的remake吗? 01/21 09:16
remake一次 是不是就要做类似范例的动作一次?
※ 编辑: anoymouse (61.216.7.85 台湾), 01/21/2020 09:24:53
10F:→ Schottky: foo.d 没有 implicit rules 01/21 14:58
11F:→ Schottky: 它的 rule/recipe 已经写在前面了,就是 sed 那几行 01/21 14:58
厘清一下:
所以有两个地方有foo.d的rules
1. %.d:%.c
sed .....
2. foo.o foo.d: foo.c foo.h defs.h common.h
foo.d的recipe只有在1.有写,也就是foo.c比foo.d还新的的时候才会执行吧?
就算2中的.h有任何一个比foo.d还新,也不会因为就这样跳到1.的rule去执行1.的recipe
吧?
12F:→ MOONRAKER: 你要不要看简单一点的范例。 01/22 15:31
※ 编辑: anoymouse (61.230.114.99 台湾), 01/24/2020 15:30:17
※ 编辑: anoymouse (61.230.114.99 台湾), 01/24/2020 15:33:44