2016-02-23 146 views
2

使似乎比較文件修改時間與某種修改時間的內部緩存。有誰知道這個緩存位於何處或如何訪問它?哪裏使存儲緩存?

+4

我認爲它只檢查是否有任何來源比結果 –

+0

薩米是正確的。沒有緩存。 – reinierpost

回答

4

使用實用程序(如strace)查看它在做什麼。在這裏,我們可以關注make程序執行的所有文件操作(-e trace=file)。

比方說,我們有foo.c和由它使用簡單的Makefile看起來建成了foo,如:

$ 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,然後調用規則來編譯它。

現在,你可以打電話再次進行,你會得到略有不同的結果:

$ 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()

4

緩存因此是您文件系統

  • make程序讀取 makefile文件,
  • 決定目標依賴
  • 列表
  • 觀察到這些目標和依賴項的時間戳,
  • 從您指定的目標(或默認目標,即生成文件中的第一個目標)後退工作,以找到其依賴關係較新的目標。
  • 它運行過時目標的規則,並重復,直到一切都是最新的。

由於它執行規則,它構建的目標預計會更新(更新),但它會從文件系統的初始檢查轉移到下一個過期目標,即使目標不是實際更新。

重新執行make強制重新開始分析,使用文件系統的當前狀態。