LINUX.ORG.RU

Система сборки для C/C++ c поддержкой VCS

 , , ,


1

5

В продолжение Чем собираете нативный код?

Возникла идея, что если бы система собрки могла анализировать данные, предоставленные системой контроля версий (кто сейчас ей не пользуется?). Это бы могло сократить время, требуемое на анализ файловой системы при сборке. Конечно, такое взаимодействие может наложить определённые ограничения (первой в голову приходит мысль о генерируемых файлах, которые игнорируются VCS).

Так вот, может я изобретаю велосипед (наверняка). Но всё же хочется услышать ваше мнение по поводу такой идеи. Может уже даже нечто подобное существует? (Может плагин какой для CMake?)

обновление метаданных vcs должно производится после проверки билда на работоспособность, а не перед. С предложенным подходом хлебнёшь горя.

Bfgeshka ★★★★★
()

Для C/C++ инкрементальная сборка (с пропуском того, что уже собрано, исходя из неизменности исходного текста и наличия результирующих файлов с бинарным кодом) — очень больная тема. Ибо #include в исходниках совсем не суть модульности, а лишь вставка текста подпрограмм в общую «простыню» текста, подлежащего компиляции. И VCS тут не помогут - только специальные механизмы кэширования, например, CCACHE. Но последний не учитывает флаги компиляции — при их изменении и неизменности исходников всё равно будет произведена компиляция.

Для языка Pascal, например, проблема отслеживания изменений в исходных текстах, раздельная компиляция и инкрементная сборка так остро не стояла и была решена ещё в середине 1980-х, когда реализовали понятие модульности — результирующие файлы .tpu в Turbo Pascal и компоненты из 1990-х-2000-х в Delphi (.dcu).

iZEN ★★★★★
()

если бы система собрки могла анализировать данные, предоставленные системой контроля версий

IMHO, это очень плохая идея, особенно в процессе интенсивной правки проекта между коммитами.

hobbit ★★★★★
()
Ответ на: комментарий от iZEN

Вот, кстати, да. В кресты надо нормальные модули завозить, а не систему сборки к VCS прибивать.

hobbit ★★★★★
()
Ответ на: комментарий от annulen

Не, это бы было слишком. В терминах Git можно по просту отслеживать хеш последней сборки (плюс staged/unstaged изменения) до текущего момента (учитывая HEAD, staged, unstaged).

Ну и в конце​-концов я думаю, что информацию с VCS нужно все равно будет дополнять...

KennyMinigun ★★★★★
() автор топика

В пределах предыдущего проекта я написал такую систему сборки на основе CMake BYPRODUCTS + Git. Идея была в том, чтобы собирать тяжёлые зависимости когда они обновились, но позже переросла и в регулярную проверку зависимостей для обычных проектов. Дело в том, что анализ зависимостей трудоёмкая операция, но полностью перенести все тяжелые зависимости в пререквизиты тоже не получится, поскольку рано или поздно они неявно обновятся и сборка посыпется. Git уже предоставляет индекс и практически мгновенную проверку рабочей директории средствами ФС.

Таким образом у нас, к примеру, автоматически пересобирался Qt и строился сисрут. При пересборке грязной рабочей директории её индекс неявно сохранялся в виде отдельной ревизии (что-то вроде git stash), чтобы не пересобирать при следующем проходе. При сборке сравнивались только 20 байт хеш суммы последней собранной ревизии.

Ещё одна идея, вопрощённая на определённом уровне, это генерация версии собираемого продукта на основе истории Git, чтобы по версии можно было точно идентифицировать ревизию исходного кода, рассыпанного по множеству Git-репозиториев, и переключиться на неё для отладки.

Dendy ★★★★★
()

к premake 5 можно пририсовать.

anonymous
()
Ответ на: комментарий от KennyMinigun

git ничего не знает про unstaged изменения, чтобы из обнаружить он сканирует файловую систему. Да, результат будет точнее чем от сравнениея timestamp в духе make, но с холодным кэшом ФС может быть намного медленнее. Не проще ли взять ccache и не заморачиваться?

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.