【问题标题】:Make is deleting my target. Why?Make正在删除我的目标。为什么?
【发布时间】:2015-08-09 08:15:31
【问题描述】:

来自docs

通常当配方行失败时,如果它改变了目标文件 根本上,文件已损坏且无法使用——或者至少它不是 完全更新。然而文件的时间戳表明它现在是 日期,因此下次运行“make”时,它不会尝试更新该文件。 情况与shell被信号杀死时的情况相同; *注意中断::.所以通常正确的做法是删除 目标文件,如果配方在开始更改文件后失败。 如果“.DELETE_ON_ERROR”作为目标出现,“make”将执行此操作。这是 几乎总是你想要“制作”的东西,但这不是历史性的 实践;所以为了兼容性,你必须明确地请求它。

所以,这里我有一个makefile:

# The idea here is to auto-generate the file ('make.include')
#    and to use it as a makefile.
# For simplicity, I replaced the "auto-generate" part, with "touch".
# I also simplified the dependency-tree with 'phony'.
#    In practice, we re-generate, only when "need" to.

make.include : phony
    +touch '$@'
    make -f '$@'

.PHONY: phony

跑步:

$ make -q

我明白了:

touch 'make.include'
make: *** Deleting file 'make.include'

现在,我不知道如何防止 make 删除这个新自动生成的“make.include”(重新运行可能是一个相当昂贵的过程),除非我求助于 .PRECIOUS 特殊目标。

但是,要求用户明确定义他们的“宝贵”目标,并不符合上述文档中的引用。对吧?

【问题讨论】:

    标签: makefile


    【解决方案1】:

    这是因为您在+touch '$@' 中使用了+ 并使用-q 选项执行make。从GNU Make Manual -q 选项是

    “提问模式”。不要运行任何食谱或打印 任何事物;如果指定,则只返回一个为零的退出状态 目标已经是最新的,如果需要重新制作,则需要一个,或者 两个如果遇到错误。请参阅代替执行配方。

    + 符号仅在使用 -t-n-q 选项执行 make 时相关,它告诉 make 执行它之前的任何命令 make 使用任何选项-t-n-q。因此,当您使用make -q 执行当前的makefile 时,您是在要求make 在不运行任何命令的情况下检查所有内容是否是最新的,但是因为您在touch '$@' 之前指定了+make 必须执行这个命令。要让所有内容保持在执行 make -q make 之前的状态,必须删除它使用 +touch '$@' 创建的文件。

    具体回答您的问题。如果您不希望make 删除make.include,那么您可以运行make,而无需在问题中指定makefile 上的-q 选项。

    但是,目标的配方,即make.include 不应使用make -f make.include 调用其自身。重写makefile 可能会更好,这样make.include 的配方只会创建make.include,然后在另一个配方中使用make -f make.include 调用它。

    make.include: 
        +touch $@
    
    all: make.include
        make -f $<
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2011-04-25
      相关资源
      最近更新 更多