#git #makefile #version-control #msbuild #build-system
#git #makefile #контроль версий #msbuild #build-system
Вопрос:
Make, ant, msbuild, … все известные мне инструменты сборки сравнивают временные метки артефактов, чтобы определить необходимость перестройки.
Git сбрасывает временную метку исходного файла на ‘now’ при проверке любой версии, чтобы сообщить системе сборки: артефакты, зависящие от этих файлов, должны быть перестроены.
Однако:
$ git checkout old_version # retrieving a.cpp@old_version
$ make # building a.out from a.cpp
$ git checkout new_version # updating a.cpp@new_version
$ git checkout - # resetting a.cpp@old_version
$ make # ...
может быть эквивалентно отказу от операции, если только make может определить, что a.out
было построено с помощью old_version.
Есть ли способ достичь этого? Знаете ли вы какую-либо систему сборки / систему контроля версий, которая может взаимодействовать таким образом?
Комментарии:
1. Может
post-checkout
быть, может помочь хук.
Ответ №1:
Исключительная зависимость от временных меток на самом деле является недостатком этих систем сборки. Сбой, например, в следующих случаях:
- Вы хотите перестроить с другим набором флагов компилятора.
- Исходные тексты и артефакты сборки находятся в разных файловых системах с десинхронизированными часами.
- Временные метки настраиваются для оптимизации процесса сборки (как и в вашем случае), но это делается таким образом, что приводит к непоследовательному представлению исходных текстов (т. Е. Не Все, что должно было быть перестроено, фактически перестроено).
Make, ant, msbuild, … все известные мне инструменты сборки сравнивают временные метки артефактов, чтобы определить необходимость перестройки.
Посмотрите на scons. Одним из его заметных отличий от других инструментов сборки является надежное обнаружение изменений сборки с использованием подписей MD5. Это означает, что она хранит для каждой цели хэши MD5 исходных текстов и командной строки, которые использовались для построения этой цели. Перед перестройкой целевого объекта он повторно вычисляет хэши MD5 и знает, требуется ли перекомпиляция. Конечно, это медленнее, чем просто просмотр временных меток, но лишено упомянутых проблем. Однако scons также предоставляет дополнительную настраиваемую поддержку традиционных временных меток.