【问题标题】:How does Makefile know that a file changed and then recompile it?Makefile 如何知道文件更改然后重新编译它?
【发布时间】:2014-05-03 01:41:03
【问题描述】:

出于好奇,Makefile 如何知道文件已更改(然后重新编译)?是make吗?这取决于编译器吗?如果是,它是否依赖于语言?

【问题讨论】:

    标签: makefile programming-languages


    【解决方案1】:

    它查看文件时间戳 - 就这么简单。如果依赖项比目标更新,则重新构建目标。

    【讨论】:

    • 还有一件事......它会处理这些更改,例如,git 呢?是否可以读取该文件?谢谢:)
    • @makeMonday:我不明白你的问题。 makefile 所做的正是克利福德在您的回答中所说的。 Make 工作不包括保留以前文件的副本以便与最近的文件进行比较。
    • @TheMask 是的,现在我完全明白了。我读到了那些时间戳。我只是想知道他们是如何工作的。谢谢;)
    • @syam :时间戳由文件系统/操作系统确定,而不是由 make。
    • @user13267 :如果您有问题,请发布问题;这个答案是三年前的,所以不是一个讨论论坛。您可以通过完全执行该实验来回答您自己的问题。它是否会重新编译取决于目标文件通过一系列依赖关系相对于源文件的时间戳。前一天不是问题;使它比目标更旧是导致规则被调用的原因(不需要编译;它可以是任何命令)。 make 有一个调试选项,它输出有关它如何处理规则的详细信息。
    【解决方案2】:

    通过检查有关文件的信息而不是其内容来制作作品。

    Make 计算出目标及其依赖项之间的依赖关系,然后查看文件是否存在。如果有,它会询问操作系统上次修改文件的时间和日期。这是用于此目的的“时间戳”,尽管该术语可以有其他含义。

    如果目标文件不存在,或者存在且早于其依赖文件,则 Make 通过应用规则从依赖文件重建目标。

    如果依赖项不存在,Make 会发出错误信号。

    这样做的结果是您可以通过删除目标来强制重建,或者通过“接触”依赖项以使其晚于目标。您可以通过“触摸”目标来避免重建。触摸只是将时间戳更新到现在。

    【讨论】:

    • 这是最好的答案!
    猜你喜欢
    • 2019-02-01
    • 2011-12-10
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多