存储缓存的位置在哪里?

Mat*_*att 9 makefile gnu-make

Make似乎将文件修改时间与某种修改时间的内部缓存进行比较.有谁知道这个缓存位于何处或如何访问它?

Tho*_*key 10

这样的缓存就是你的文件系统:

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

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

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


unp*_*nic 9

使用实用程序,strace以查看它正在做什么.在这里,我们可以遵循-e trace=filemake程序执行的所有文件操作().

比方说,我们有foo.cfoo它使用一个简单的Makefile看起来像它内置:

$ cat Makefile
foo: foo.c
Run Code Online (Sandbox Code Playgroud)

我们来吧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 +++
Run Code Online (Sandbox Code Playgroud)

在这里你看到它检查是否存在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 +++
Run Code Online (Sandbox Code Playgroud)

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