Make 似乎将文件修改时间与修改时间的某种内部缓存进行比较。有谁知道这个缓存位于何处或如何访问它?
答案 0 :(得分:8)
使用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()
。
答案 1 :(得分:8)
缓存就是文件系统:
make
程序读取 makefile 当它执行规则时,它构建的目标预计会更新(更新),但是即使目标没有实际更新,它也会从文件系统的初始检查开始转移到下一个过时的目标。
使用文件系统的当前状态重新执行make
强制它重新开始分析。