首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量"$?“的扩展错误?在makefile

变量"$?“的扩展错误?在makefile
EN

Stack Overflow用户
提问于 2015-08-20 09:37:50
回答 2查看 117关注 0票数 1

来自https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html#Automatic-Variables

$?所有比目标更新的先决条件的名称,它们之间有空格。

现在,给出一个makefile:

代码语言:javascript
复制
# Create target 'all', that is created later than 'old', which was created after 'older'.
$(shell touch older)
$(shell sleep 1)
$(shell touch old)
$(shell sleep 1)
$(shell touch all)

all : old phony;
    @echo '"$$?" is: "$?"'

# A command to turn the file 'old' even "older", by acquiring the modification-time of 'older'.
old ::
    cp -p 'older' 'old'


.PHONY: phony

运行,我得到:

代码语言:javascript
复制
$ make
cp -p 'older' 'old'
"$?" is: "old phony"

# Trying again, but this time, with a *parallel-execution*.
$ make -j
cp -p 'older' 'old'
"$?" is: "phony"

您看到了吗,这使得对于一个$? (**-j**),的并行执行的值的扩展与对 non-parallel-execution*的扩展不同

让我们首先分析第一种情况,即non-parallel的执行。

allold的修改时间如下:

  • 在构建之前,oldall更“老”。这是不言而喻的。对吗?
  • 在完成构建先决条件之后,即在Make "builds“old之后,old通过”获取“名为:older的文件的修改时间而”变老“。这基本上是shell命令cp -p older old的净结果。现在,不难看出,olderway“老”于all

现在,Make最终构建了目标all,因为是其他的先决条件,即:phony

但是,根据文档,$?应该只扩展到“所有先决条件的名称,这些先决条件都是比目标更新的更新的”。这是一个精确的引语。

我们是否可以同意,old从来没有比all新。而且,如果不是phony的话,Make甚至不会重建all

那么,对于Make来说,将$?扩展到old phony是多么的错误。

我明白了phony。但是old呢?真的?!

但是,现在让我们将注意力转向并行执行,其中Make将$?扩展为phony

在此:

  1. 当然,可以说,这个扩展是正确的(与非并行执行中的扩展相比)。原因是,只有phony 才是,该文件触发了all的重新构建。如果没有它,Make根本不会费心重新构建all
  2. 尽管如此,人们还是会想,对于这两种执行模式,如何才能使变量的扩展有所不同。我甚至无法想象,这怎么可能与$?的扩展有任何关系。

总之,看起来一个“随机”的变化(即对执行模式的修改,从并行到非并行)影响着一个看似不相关的实体,即自动变量的扩展。为什么?

EN

回答 2

Stack Overflow用户

发布于 2015-08-20 10:26:40

在使用规则构建了old之后,Make now认为它是依赖关系图中的最新文件。在制作old后,不检查。

对于虚假目标来说,这显然是正确的,而且对于文件目标来说,这通常也是正确的。

票数 1
EN

Stack Overflow用户

发布于 2015-08-20 10:24:36

任何由make构建或更新的文件都已被更新,因此它将隐式地假设它是更新的,即使您黑进了一个使其更老的命令。

理论上,Make应该处理文件的内容,而不是日期。如果内容不同,则应运行依赖构建。考虑到我们没有文件系统提供简单的内容派生(散列之类的),它使用最后修改的日期来完成这个任务。因为这也不是100%可靠的--例如,看看那些日期没有足够准确性的系统,或者只是在将来--它也将使用它作为一个信息源。如果它只是建造它,它必须被修改,因此它是正确的认为它“更新”或“重建”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32114743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档