Я заметил, что когда я вношу изменения в некоторые файлы, а затем я набираю make, он будет запускать определенные команды, связанные с этими файлами. Если я ничего не изменю, тогда make ничего не делает, говоря, что программа обновлена. Это говорит мне, что make имеет способ узнать, какие файлы были изменены с момента последнего запуска. Как это знать? Кажется, он ничего не помещает в каталог, где он запущен, поэтому он должен хранить эту информацию где-то еще.
Как узнать, какие файлы для обновления
Ответ 1
Он проверяет метаданные даты изменения файловой системы.
См., например, stat() man-страница и член st_mtime
struct stat
.
У него есть встроенные правила, которые сообщают ему, что (например) файл .o должен быть сгенерирован, если соответствующий .c файл был изменен; раздел руководства по синтаксису правил говорит:
Критерием устаревания является указанных в предпосылки, которые состоят из файла имена, разделенные пробелами. (Wildcards и архивные элементы (см. Архивы) являются также разрешено здесь.) Цель не входит в если он не существует или если он старше любых предварительных условий (по сравнению с последней модификацией раза).
Ответ 2
make
определяет, должен ли быть восстановлен целевой файл X, проверяя, превышает ли его время модификации (записанное в файловой системе), чем любая из его зависимостей. Например, если у вас было правило make, например:
foo.o: foo.c foo.h common.h
Затем он знает, что ему нужно перестроить foo.o
, если какое-либо из foo.c
, foo.h
или common.h
имеет более новое время модификации, чем foo.o
. Это означает, что выполнение touch common.h
заставит foo.o
перестроить следующий make.
Это означает, что make
можно смутить, если время модификации ненадежное - например, если ваши системные часы перескочили назад или если вы храните файлы в определенных сетевых файловых системах и имеете несколько клиентов, обращающихся к ним (особенно если часы на разных компьютерах в вашей сети не синхронизированы). Если вы используете make
с файлами, распределенными по сети, обычно рекомендуется запустить NTP, чтобы правильно настроить часы.
Ответ 3
Make
намного сложнее, чем кажется на поверхности. Он имеет механизм вывода с сложным алгоритмом; в сочетании с вашими данными конфигурации Make
- это тип базы данных программы +, известная как экспертная система
stat(2)
файлы, чтобы получить время их модификации
make затем делает на графике, который он сделал из Makefile
Ответ 4
Он проверяет, является ли метка даты/времени в исходном файле более поздней, чем в соответствующем промежуточном файле (или, возможно, в выходном файле - это было некоторое время, так как я имел дело с файлами make). Если это то, файл должен быть выполнен. Затем это приведет к соединению окончательного исполняемого файла.