【问题标题】:Where does a make program store its information?make 程序在哪里存储它的信息?
【发布时间】:2011-11-05 01:23:43
【问题描述】:

make 究竟如何知道文件是否被修改,以运行某些规则?这些信息必须在某个地方,那么是否有一个文件存储在某个地方,其中包含来自文件的时间戳?

有很多 make 程序,因此我不确定依赖检查背后的原理是否对所有程序都相同。如果它们差别很大,我最感兴趣的是 GNU Make。虽然知道其中的任何差异是件好事。

【问题讨论】:

  • 它对实际文件名使用stat() 系统调用。在运行时,它会密切关注它所处理的文件的时间,但它会在每次运行时通过查看文件系统来重新建立时间。

标签: dependencies makefile gnu-make


【解决方案1】:

检查输入与输出的时间戳。例如,如果 .o 比 .c 旧,则假定您必须对其进行编辑,并且 .o 需要重新制作。

【讨论】:

  • 原来这么简单,嗯?令人惊讶的是,我无法找到这个解决方案。
【解决方案2】:

简单。比较源文件(修改日期、创建日期等作为文件信息的一部分存储)和输出文件(可执行文件或目标文件)上的时间戳。如果源文件“较新”,则重新编译。

有时我的源文件上的时间戳有误,例如我在设置了未来日期的计算机上编辑它们,然后我只需 touch * 我的源文件来更改时间戳就可以了。

【讨论】:

    【解决方案3】:

    它从文件系统中实时读取时间戳。

    【讨论】:

      【解决方案4】:

      只有在通过build_check target_newer 请求时,makepp 才会使用传统的方法。这是因为网络文件系统并不总是就时间戳达成一致,并且当您复制文件时它们可能会被修改。此外,具有秒精度(FAT 甚至 2s)的文件系统仍然广泛传播。如今在那个时候可以发生很多事情。

      因此,makepp 计算内容的智能签名(不包括 cmets 和不重要的空格,例如对于 C 语言家族)。然后将其存储在.makepp/yoursourcename.mk 中,下次将被提取以查看是否有重大变化。所有依赖项的智能签名(顺便说一句是自动检测的)以及命令字符串和其他一些细节决定是否需要重建。

      makepp 还有很多。除了 GNU make 能做的几乎所有事情之外,还有更多有用的东西,您甚至可以通过一些 Perl 编程来扩展您的 makefile。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        • 1970-01-01
        • 2014-11-14
        • 2011-10-26
        • 2012-10-05
        • 2017-03-19
        • 1970-01-01
        相关资源
        最近更新 更多