Перевод статьи подготовлен специально для студентов курса «Разработчик С++».
Детерминированная сборка — это процесс сборки одного и того же исходного кода с одной и той же средой и инструкциями сборки, при котором создаются одни и те же двоичные файлы в любом случае, даже если они сделаны на разных машинах, в разных каталогах и с разными именами. Такие сборки также иногда называют воспроизводимыми или герметичными сборками, если гарантируется, что они будут создавать одни и те же двоичные файлы даже при компиляции из разных папок.
Детерминированные сборки не являются чем-то, что происходит само собой. Они не создаются в обычных проектах, и причины, по которым этого не происходит, могут быть разными для каждой операционной системы или компилятора.
Детерминированные сборки должны быть гарантированы для заданной среды сборки. Это означает, что некоторые переменные, такие как операционная система, версии системы сборки и целевая архитектура, предположительно остаются одинаковыми в разных сборках.
В последние годы различные организации, такие как Chromium, Reproducible builds или Yocto, предпринимали много усилий для достижения детерминированных сборок.
Существуют две основные причины, почему детерминированные сборки так важны:
Что такое детерминированная сборка?
Детерминированная сборка — это процесс сборки одного и того же исходного кода с одной и той же средой и инструкциями сборки, при котором создаются одни и те же двоичные файлы в любом случае, даже если они сделаны на разных машинах, в разных каталогах и с разными именами. Такие сборки также иногда называют воспроизводимыми или герметичными сборками, если гарантируется, что они будут создавать одни и те же двоичные файлы даже при компиляции из разных папок.
Детерминированные сборки не являются чем-то, что происходит само собой. Они не создаются в обычных проектах, и причины, по которым этого не происходит, могут быть разными для каждой операционной системы или компилятора.
Детерминированные сборки должны быть гарантированы для заданной среды сборки. Это означает, что некоторые переменные, такие как операционная система, версии системы сборки и целевая архитектура, предположительно остаются одинаковыми в разных сборках.
В последние годы различные организации, такие как Chromium, Reproducible builds или Yocto, предпринимали много усилий для достижения детерминированных сборок.
Важность детерминированных сборок
Существуют две основные причины, почему детерминированные сборки так важны:
- Безопасность. Изменение двоичных файлов вместо исходного кода может сделать изменения невидимыми для оригинальных авторов. Это может быть фатальным в критических для безопасности условиях, таких как медицина, авиация и космос. Потенциально идентичные результаты для данных материалов позволяют третьим сторонам прийти к консенсусу относительно правильного результата.
- Отслеживаемость и двоичное управление. Если вы хотите иметь репозиторий для хранения ваших двоичных файлов, то скорее всего вы не хотите создавать двоичные файлы со случайными контрольными суммами из источников в одной и той же ревизии. Это может привести к тому, что система репозитория будет хранить разные двоичные файлы как разные версии, когда они должны быть одинаковыми. Например, если вы работаете в Windows или MacOS, в библиотеке есть поля со временем создания/модификации входящих в нее объектных файлов, что приведет к различиям в бинарных файлах./li>
kibb
У вас clang создает статические библиотеки? А как же ar?