Может ли система сборки поддерживать контроль версий?

#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:

Исключительная зависимость от временных меток на самом деле является недостатком этих систем сборки. Сбой, например, в следующих случаях:

  1. Вы хотите перестроить с другим набором флагов компилятора.
  2. Исходные тексты и артефакты сборки находятся в разных файловых системах с десинхронизированными часами.
  3. Временные метки настраиваются для оптимизации процесса сборки (как и в вашем случае), но это делается таким образом, что приводит к непоследовательному представлению исходных текстов (т. Е. Не Все, что должно было быть перестроено, фактически перестроено).

Make, ant, msbuild, … все известные мне инструменты сборки сравнивают временные метки артефактов, чтобы определить необходимость перестройки.

Посмотрите на scons. Одним из его заметных отличий от других инструментов сборки является надежное обнаружение изменений сборки с использованием подписей MD5. Это означает, что она хранит для каждой цели хэши MD5 исходных текстов и командной строки, которые использовались для построения этой цели. Перед перестройкой целевого объекта он повторно вычисляет хэши MD5 и знает, требуется ли перекомпиляция. Конечно, это медленнее, чем просто просмотр временных меток, но лишено упомянутых проблем. Однако scons также предоставляет дополнительную настраиваемую поддержку традиционных временных меток.