gpt4 book ai didi

makefile - 何时应该在 make recipe 中评估对 *eval* 的调用

转载 作者:行者123 更新时间:2023-12-01 10:34:24 25 4
gpt4 key购买 nike

我有一些作为 RPM 分发的软件项目。它们使用 semantic versioning 进行版本控制我们附上一个版本号。使用常规约定,这是 MAJOR.MINOR.PATCH-REL_NUM .尽管超出了本文的范围,但版本号存储在 git 中。 发布目标 makefile看起来像这样:

release:
make clean
$(BLD_ROOT)/tools/incr_rel_num
# Although the third step, this was re-ordered to step 1
$(eval RELEASE_NUMBER=$(shell cat $(BLD_ROOT)/path/to/rel_num.txt))
make rpm RPM_RELEASE_NUM=$(RELEASE_NUMBER)

在调试时,我最终发现,虽然调用了 评估 是配方的第三步,实际上正在评估 第一 !这就是为什么 RPM 的版本号总是比我看到的推送到 Remote 的版本号少。

我已经在谷歌上搜索了很多,但我没有找到任何解释关于 的评估顺序的结果。评估 在食谱中使用时。也许它甚至不是关于 评估 但功能一般。此外,我也没有在 make 的 GNU 手册中找到有关此内容的详细说明(如果有,请指出是哪一章)。我已经解决了这个问题,所以它不是一个麻烦,我只是想知道,这是预期的,如果是,为什么?

最佳答案

上面没有人得到的遗漏点很简单:当 make 要运行一个配方时,它首先扩展配方的所有行,然后才开始第一行。所以:

release:
make clean
$(BLD_ROOT)/tools/incr_rel_num
# Although the third step, this was re-ordered to step 1
$(eval RELEASE_NUMBER=$(shell $(BLD_ROOT)/path/to/rel_num.txt))
make rpm RPM_RELEASE_NUM=$(RELEASE_NUMBER)
当 make 决定运行 release target 它首先扩展配方中的所有行,这意味着 eval被扩展,然后运行结果行。这就是为什么你会得到你所看到的行为。
我真的不明白你为什么需要使用 eval在这里;为什么不只是使用:
release:
$(MAKE) clean
$(BLD_ROOT)/tools/incr_rel_num
$(MAKE) rpm RPM_RELEASE_NUM="$$(cat $(BLD_ROOT)/path/to/rel_num.txt))"
(顺便说一句,你不应该在你的 makefile 中使用裸 make;你应该总是使用 $(MAKE) (或 ${MAKE} ,同样的事情)。

关于makefile - 何时应该在 make recipe 中评估对 *eval* 的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38227975/

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