Японские исследователи создали mkcheck2 — инструмент для анализа зависимостей между файлами во время сборки программ. В тестах на реальных проектах система сократила время проверки одного набора изменений с 21 минуты до 24 секунд — примерно в 54 раза быстрее, чем предыдущие решения.

На выборке из 300 открытых проектов, использующих Make, среднее время анализа одной фиксации упало с 1267 до 24 секунд. Дополнительная нагрузка на процесс сборки снизилась с 148% до 0,3%. Исследователи оценивают сокращение накладных расходов максимум в 99,7%.

Система проверяет не внешние библиотеки, а связи между файлами самого проекта. При изменении одного файла сборка должна точно определить, какие компоненты нужно пересобрать. Неверно описанная зависимость либо оставляет устаревший код в проекте, либо заставляет пересобирать код без необходимости. По оценкам авторов, ошибки в этих связях вызывают более половины сбоев сборки в больших проектах.

Прежние инструменты отслеживали файловые операции через ptrace — механизм, требующий остановки процесса и переключения между приложением и ядром при каждом системном вызове. На крупных сборках такие переключения накапливались и замораживали весь процесс.

mkcheck2 переносит наблюдение в ядро Linux и использует eBPF — технологию для запуска изолированного кода внутри ядра с минимальными затратами на производительность. Во время сборки система отслеживает все операции с файлами, восстанавливает фактический граф зависимостей и сравнивает его с тем, что указано в правилах сборки.

Второе ускорение достигается благодаря инкрементальному анализу. Вместо повторной проверки всего графа зависимостей mkcheck2 использует данные от предыдущих сборок и проверяет только изменившиеся связи. Это особенно полезно для непрерывной интеграции, где проверку нужно запускать после каждой правки кода.

В экспериментах mkcheck2 обнаружила все пропущенные зависимости и 92% лишних. Авторы уточняют, что эти результаты относятся к конкретному набору проектов и могут отличаться на других кодовых базах.

Текущая реализация ограничена Linux и не охватывает некоторые сценарии: обращения к файлам через отображение памяти, зависимости от динамически загружаемых библиотек, сетевые ресурсы и распределённые системы сборки. Исследователи планируют расширить поддержку других систем сборки, добавить автоматическое исправление ошибок и упростить интеграцию с инструментами непрерывной интеграции.