Кратко:
Есть десяток SDK в которых сишные хедеры с разными сущностями в виде функций, структур, макросов, переменных и др. которые делали разные разработчики. Нужно аккуратно сравнить их между собой. Сравнить грамотно, то есть пропуская разное именование аргументов функций и разный стиль кодирования разработчиков. И на основе этих разниц сделать всеобъемлющий SDK, включающий в себя наработки всех этих десяти SDK. Есть ли какие-нибудь инструменты для решения подобных задач?
TL;DR:
В середине нулевых было сообщество по реверсу прошивок под некоторые железки. Сообщество пилило приложения на C/C++, но как это и было ожидаемо от тех лет, разработчики из этого сообщества были рассредоточены в превалирующем большинстве на Windows. Отсюда вытекают проблемы разработки тех лет: Win-1251 вместо Unicode, RAR-архивы вместо использования VCS, обмазанность BAT-скриптами с адовой логикой вида запишем результат в файлик чтобы прочитать его и отправить в следующую утилиту, регистронезависимость в именах хедеров и прочее подобное, те кто сталкивался с этим, тот знает.
В таком бардаке разработчики так и не смогли договориться между собой или просто не знали про существование SVN и наплодили с десяток разных и собственных SDK, которые представляют собой кучку сишных хедеров с разными сущностями в виде собственно функций, структур, макросов, глобальных переменных и прочего подобного.
Собственно я решил в качестве хобби для сообщества ROM-хакеров объединить эти древние разрозненные SDK и сделать инструментарий кросс-платформенным, доступным и для Linux.
И вот столкнулся с интересной задачей по сравнению SDK. Я конечно ручками и git diff
перенёс и всё более-менее полно и работает, но хочется проверить как себя, так и просто подумать над частичной автоматизацией подобной задачи.
То есть, к примеру, сделать такой инструмент, которому я бы кормил директорию SDK, он бы проходил по каждому .h-файлику в нём, собирал информацию о сущностях в этих файлах не смотря на стиль кодирования, названия аргументов и прочие незначительные вещи и выдавал сортированный листинг используемых сущностей. Сравнивая подобные листинги между собой, мне было бы очень просто выявить различия и на их основе собрать всеобъемлющий SDK, который бы охватывал изменения всех разработчиков и я ничего бы не потерял.
Нутром чую что без всяких clang-tidy
, clang-format
и прочих тут видимо не обойтись, если ставить задачу именно по сравнению AST и приведённого к единому стилю кода. Может кто-то когда-то создал уже похожий инструмент для подобного сравнения или сталкивался с похожей задачей? Интересно было бы услышать ваши варианты решения подобного.