Подтвердить что ты не робот

Как узнать, какие файлы для обновления

Я заметил, что когда я вношу изменения в некоторые файлы, а затем я набираю make, он будет запускать определенные команды, связанные с этими файлами. Если я ничего не изменю, тогда make ничего не делает, говоря, что программа обновлена. Это говорит мне, что make имеет способ узнать, какие файлы были изменены с момента последнего запуска. Как это знать? Кажется, он ничего не помещает в каталог, где он запущен, поэтому он должен хранить эту информацию где-то еще.

4b9b3361

Ответ 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 - это тип базы данных программы +, известная как экспертная система

make stat(2) файлы, чтобы получить время их модификации make затем делает на графике, который он сделал из Makefile

Вы правы, Make обычно не оставляет никаких файлов cookie или другого файла отслеживания состояния. (Иногда некоторые Makefile сами создают файлы с меткой времени, но это редко.) Но это не имеет значения, ведь последний Make Run может быть неудачным в любом случае. То, что он делает, просто сравнивает даты на целевых файлах, которые он создает, с датами в исходных файлах. Он заботится только о том, соответствуют ли цели актуальной, но обычно это не имеет значения, когда последний раз Make.

Ответ 4

Он проверяет, является ли метка даты/времени в исходном файле более поздней, чем в соответствующем промежуточном файле (или, возможно, в выходном файле - это было некоторое время, так как я имел дело с файлами make). Если это то, файл должен быть выполнен. Затем это приведет к соединению окончательного исполняемого файла.