2016-02-23 2 views
2

Сделать, похоже, сравнивает время изменения файла с каким-то внутренним кешем времени модификации. Кто-нибудь знает, где находится этот кеш, или как получить к нему доступ?Где хранится его кеш?

+4

Я думаю, что он проверяет, не найден ли какой-либо из источников, чем результат. –

+0

Sami is correct. Нет кеша. – reinierpost

ответ

4

Используйте служебную программу, такую ​​как strace, чтобы посмотреть, что она делает. Здесь мы можем следить за всеми действиями файла (-e trace=file), которые выполняет программа make.

Давайте предположим, что мы имеем 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, а затем вызывает правило для его компиляции.

Теперь вы можете позвонить сделать снова, и вы получите немного разные результаты:

$ 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 заставляет его начать с анализа, используя текущее состояние вашей файловой системы.

Смежные вопросы