【问题标题】:Where does make store its cache?make 在哪里存储它的缓存?
【发布时间】:2016-02-23 21:06:22
【问题描述】:

Make 似乎将文件修改时间与某种修改时间的内部缓存进行比较。有谁知道这个缓存在哪里或者如何访问它?

【问题讨论】:

  • 我认为它只检查是否有任何来源比结果更新
  • 萨米语是正确的。没有缓存。

标签: makefile gnu-make


【解决方案1】:

使用诸如strace 之类的实用程序来查看它在做什么。在这里,我们可以跟踪 make 程序执行的所有文件操作 (-e trace=file)。

假设我们有 foo.c 和一个 foo,它是使用一个简单的 Makefile 构建而成的,如下所示:

$ cat Makefile
foo: foo.c

让我们运行make

$ strace -e trace=file make
execve("/usr/bin/make", ["make"], [/* 20 vars */]) = 0
...
open("Makefile", O_RDONLY)              = 3
stat("Makefile", {st_mode=S_IFREG|0644, st_size=11, ...}) = 0
...
stat("foo", 0x7ffd4373c8c0)             = -1 ENOENT (No such file or directory)
stat("foo.c", {st_mode=S_IFREG|0644, st_size=36, ...}) = 0
cc     foo.c   -o foo
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27717, si_status=0, si_utime=0, si_stime=0} ---
stat("foo", {st_mode=S_IFREG|0755, st_size=8549, ...}) = 0
+++ exited with 0 +++

这里你看到它检查foo 的存在并没有找到它,它检查foo.c 的存在,然后它调用规则来编译它。

现在你可以再次调用 make,得到的结果略有不同:

$ strace -e trace=file make
...
stat("foo", {st_mode=S_IFREG|0755, st_size=8549, ...}) = 0
stat("foo.c", {st_mode=S_IFREG|0644, st_size=36, ...}) = 0
make: `foo' is up to date.
+++ exited with 0 +++

如果使用了某种缓存文件,我们希望看到一个open() 和一个read() 反对它。如果在运行之间使用了这个缓存,那么我们也希望看到一个write()

【讨论】:

    【解决方案2】:

    缓存就是你的文件系统

    • make 程序读取 makefile,
    • 确定目标依赖项的列表,
    • 观察这些目标和依赖关系的时间戳,
    • 从您指定的目标(或默认目标,即 makefile 中的第一个目标)向后工作,以查找其依赖项较新的目标。
    • 它运行过期目标的规则,并重复执行,直到所有内容都是最新的。

    当它执行规则时,它构建的目标预计会更新(更新),但即使目标实际上没有更新,它也会从对文件系统的初始检查移至下一个过期目标。

    重新执行 make 会强制它使用文件系统的当前状态重新开始分析。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      相关资源
      最近更新 更多