gpt4 book ai didi

Makefile 隐式规则匹配 - 前缀长度不影响匹配

转载 作者:行者123 更新时间:2023-12-02 21:42:30 25 4
gpt4 key购买 nike

在我的 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's manual :

It is possible that more than one pattern rule will meet these criteria. In that case, make will choose the rule with the shortest stem (that is, the pattern that matches most specifically).

我认为文件名 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在这种情况下,行为方式与文档一致吗?如果是这样,是否有更好的方法来指定更专门的隐式规则?

最佳答案

首先,请注意模式匹配的“最短词干”方法是在 GNU make 3.82 中引入的。如果您使用的是 GNU make 3.81,那么您的 make 版本将使用旧方法,即“第一个匹配”。如果可能的话,最好阅读发行版附带的文档,而不是 Web 文档,因为 Web 文档适用于最新版本的 GNU make。 GNU make 3.81 于 2006 年 4 月发布...已经很老了。

但是,您提供的示例实际上确实按照您希望的方式工作:

src/%_bar.o : src/%_bar.c ; @echo shorter: $*

src/%.o : src/%.c ; @echo longer: $*

all: src/foo_bar.o

$ make-3.81
shorter: foo

$ make-3.82
shorter: foo

我怀疑当您在这里提出问题时,您没有使用与实际环境中使用的代码相同的代码。在这种环境中,您必须在较长的模式之后使用较短的模式,如下所示:

src/%.o : src/%.c ; @echo longer: $*

src/%_bar.o : src/%_bar.c ; @echo shorter: $*

all: src/foo_bar.o

$ make-3.81
longer: foo_bar

$ make-3.82
shorter: foo

提出问题时,确保问题中的简化示例准确反射(reflect)真实情况非常重要。

关于Makefile 隐式规则匹配 - 前缀长度不影响匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31826383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com