Я начинающий, make
и мне интересно, когда использовать make clean
.
Один коллега сказал мне, что инкрементные сборки с make
использованием временных меток файлов. Таким образом, если вы извлекаете старую версию файла в вашей VCS, у нее будет «старая» временная метка, и она будет помечена как «нет необходимости перекомпилировать этот файл». Тогда этот файл не будет включен в следующую сборку.
По словам того же коллеги, это будет поводом для использования make clean
.
В любом случае, я примерно получил ответ на вопрос «когда использовать make clean
» из других вопросов StackExchange, но другой мой вопрос:
Почему инкрементные сборки используют
make
временные метки файлов, а не SHA-1, например? Git, например, показывает, что мы можем успешно определить, был ли файл изменен с использованием SHA-1.
Это из-за проблем со скоростью?
make
был создан в 70-х годах. SHA-1 был создан в 90-х годах. Git был создан в 00-х годах. Последнее, что вы хотите, - это чтобы некоторые неясные сборки, которые работали в течение 30 лет, внезапно потерпели неудачу, потому что кто-то решил перейти на все современное с проверенной и испытанной системой.make
ПО, ваше программное обеспечение не сломается, ноmake
прилагает все усилия для обеспечения обратной совместимости в новых версиях. Изменение основного поведения без уважительной причины в значительной степени противоположно этому. И даты показывают, почему он изначально не был создан для использования SHA-1, или почему было нелегко дооснастить его, когда он стал доступен (к тому времениmake
уже было десятилетия).Ответы:
Очевидная (и, возможно, поверхностная) проблема заключается в том, что системе сборки придется вести учет хэшей файлов, которые использовались для последней сборки. Хотя эта проблема, безусловно, может быть решена, она потребует побочного хранения, когда информация о метках времени уже присутствует в файловой системе.
Более серьезно, однако, хэш не передал бы ту же семантику. Если вы знаете, что файл T был создан из зависимости D с хеш-кодом H 1, а затем обнаруживаете, что D теперь хеширует H 2 , вам следует пересобрать T ? Вероятно, да, но также может быть, что H 2 фактически ссылается на более старую версию файла. Отметки времени определяют порядок, а хэши сопоставимы только по равенству.
Функция, поддерживаемая отметками времени, заключается в том, что вы можете просто обновить отметку времени (например, с помощью утилиты командной строки POSIX
touch
), чтобы уловитьmake
мысль о том, что зависимость изменилась или - что более интересно - цель более свежая чем это на самом деле. Хотя играть с этим - отличная возможность выстрелить себе в ногу, это полезно время от времени. В системе, основанной на хэше, вам потребуется поддержка самой системы сборки для обновления внутренней базы данных хэшей, использованных для последней сборки, без фактической сборки чего-либо.Хотя можно было бы привести аргумент в пользу использования хэшей над временными метками, я хочу сказать, что они не являются лучшим решением для достижения той же цели, а представляют собой другое решение для достижения другой цели. Какая из этих целей более желательна, может быть открытым для обсуждения.
источник
D
настоящее время хэшейH2
, и у вас нет какой - то выходT2
построен изD@H2
, вы должны производить и хранить его. После этого, независимо от того, в каком порядке происходитD
переключение между состояниямиH1
иH2
, вы сможете использовать кэшированный вывод.Хэширование всего проекта происходит очень медленно. Вы должны прочитать каждый байт каждого файла. Git не хеширует каждый файл каждый раз, когда вы запускаете a
git status
. Кроме того, проверки VCS обычно не устанавливают время модификации файла в исходное авторское время. Резервное восстановление будет, если вы позаботитесь об этом. Причина, по которой файловые системы имеют временные метки, заключается в таких случаях использования.Разработчик обычно запускается,
make clean
когда зависимость, не отслеживаемая непосредственно Makefile, изменяется. Как ни странно, это обычно включает сам Makefile. Обычно он также включает в себя версии компилятора. В зависимости от того, насколько хорошо написан ваш Makefile, он может включать версии внешних библиотек.Это те вещи, которые имеют тенденцию обновляться, когда вы выполняете обновление контроля версий, поэтому большинство разработчиков просто имеют привычку запускать их
make clean
одновременно, так что вы знаете, что начинаете с чистого листа. Вы можете уйти, не делая этого много времени, но действительно трудно предсказать времена, когда вы не можете.источник
Несколько моментов, касающихся хэшей и временных меток в сборочных системах:
источник