【发布时间】:2015-08-05 07:45:29
【问题描述】:
在我的 gnu-make-3.81 Makefile 中,我希望定义两个隐式规则,以便更具体的第一个优先于更一般的第二个:
src/%_bar.o : src/%_bar.c
$(CC) -Wall -Wno-unused-but-set-variable -c $^ -o $@
src/%.o : src/%.c
$(CC) -Wall -c $^ -o $@
我遇到的问题是 foo_bar.c 代表自动生成的代码,该代码会触发带有 -Wall 的警告,我希望禁止该代码,因此第一条规则旨在捕捉这种特殊情况。
可能会有多个模式规则满足这些条件。在这种情况下,make 将选择具有最短词干的规则(即最具体匹配的模式)。
我认为对于src/foo_bar.o 的文件名,第一条规则将生成词干foo,第二条规则将生成foo_bar。前者是最短的,所以我希望它适用。然而,情况似乎并非如此,第二条规则由 make 选择并执行。运行 make -d 甚至不会显示与 foo 匹配的尝试 - 仅考虑 foo_bar。
如果我进行以下更改,通过将前缀从 src/ 缩短为 sr 故意使第二条规则的词干更长,则仍然选择第二条规则:
src/%_bar.o : src/%_bar.c
$(CC) -Wall -Wno-unused-but-set-variable -c $^ -o $@
sr%.o : sr%.c
$(CC) -Wall -c $^ -o $@
我无法将其与 make 文档相协调。
另外,如果我完全去掉src/前缀,第二条规则是被选中的:
src/%_bar.o : src/%_bar.c
$(CC) -Wall -Wno-unused-but-set-variable -c $^ -o $@
%.o : %.c
$(CC) -Wall -c $^ -o $@
虽然这解决了我的问题,但它实际上并不合适,因为它会覆盖/与我需要保留的当前目录上的另一个隐式规则进行交互:
%.o : %.c
# do something else
我的问题是为什么make 在这种情况下会这样,这是否与文档一致?如果是这样,是否有更好的方法来指定更专业的隐式规则?
【问题讨论】:
标签: makefile gnu-make gnu rule