Сделать, похоже, сравнивает время изменения файла с каким-то внутренним кешем времени модификации. Кто-нибудь знает, где находится этот кеш, или как получить к нему доступ?Где хранится его кеш?
ответ
Используйте служебную программу, такую как 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()
.
кэш как таковой ваш файловая система:
- Программа
make
читает файл сборки, - определяет список целей и зависимостей,
- отмечает временные метки для этих целей и зависимостей,
- работает назад от заданного вами целевого объекта (или целевого объекта по умолчанию, то есть первого в файле makefile), чтобы найти цель, зависимости которой новее.
- он управляет правилом для устаревшей цели и повторяет, пока все не обновится.
Поскольку он выполняет правила, ожидается, что цель, которую он строит, будет обновляться (новее), но она переходит к следующей устаревшей цели из первоначальной проверки файловой системы, даже если цель не является фактически обновлено.
Повторное выполнение make
заставляет его начать с анализа, используя текущее состояние вашей файловой системы.
- 1. Где хранится кеш memoized python?
- 2. Где хранится кеш DNS для Ubuntu?
- 3. Где на диске хранится кеш WebClient?
- 4. Где хранится его объект android.graphics.Path?
- 5. Grails - Где хранится кэш
- 6. На iOS, где хранится кеш NSURLCache, если diskPath: nil?
- 7. Где хранится кеш памяти L1 процессоров Intel x86?
- 8. Rails 3.2 где хранится информация о кеш-памяти?
- 9. Как хранится кеш-память B +?
- 10. NSData хранится где-то
- 11. Где хранится кеш google guava? .. Безопасно ли использовать его в EJB?
- 12. Где хранится контекст OpenGL?
- 13. Звездочка: Где хранится звездочка
- 14. Где хранится последний голос?
- 15. Где хранится PFFile?
- 16. Где хранится task_struct?
- 17. Найти, где хранится шрифт
- 18. Где хранится временный объект?
- 19. Где хранится документ EXC_BAD_ACCESS?
- 20. где хранится window.somedata
- 21. Где хранится JSESSIONID? (JavaEE)
- 22. Где хранится эталонная переменная
- 23. Где хранится ссылка MediaStream?
- 24. Где хранится AspnetIdentity UserTokens?
- 25. Где хранится объект возврата?
- 26. $ routeProvider - где хранится var .when хранится
- 27. где хранится история svn?
- 28. Где хранится выход gluLookAt?
- 29. Где хранится JSESSIONID?
- 30. Где хранится ответ формы?
Я думаю, что он проверяет, не найден ли какой-либо из источников, чем результат. –
Sami is correct. Нет кеша. – reinierpost