Здравствуйте, коллеги-разработчики! Я Максим, и я хочу поделиться новостью из мира C++. Я смог в 15 лет собрать Clang, LLD, LLDB, clang-extra-tools нативно в Windows, и оно работает. Но начнем мы издалека: как я вообще выбрал C++; почему не остался на MSVC, G++; как я собрал LLVM; почему не скачал уже готовые сборки от Мартина Сторшё.

Как я начал в программировании?
Еще в детстве я очень увлекался компьютерами, так как у меня был старый ПК от отца. Но он был, по меркам 2017, терпимый: можно было им пользоваться и играть. Но в один день, пока я играл в свою любимую игру, у меня появились синие полосы на экране. Как в итоге выяснилось - отвал чипа, и новый чип стоил почти как две новые видеокарты (на тот момент это был 2020, я не знал про существование Avito/Olx). Но в материнскую плату была встроена какая-то видеокарта, но она была просто очень слабой, и даже Windows 7 очень тормозила.
Я начал разбираться в ПК и понял, что мне надо его прокачать. Я пометил те детали, которые я хотел, и начал копить деньги со школьных обедов. В итоге через 3 года я накопил на ПК. Конечно, с того момента сильно детали поменялись, и то, что было тогда актуально, уже было морально устаревшим, и я выбрал детали актуальнее. И в тот момент мне было 13 лет, и я хотел что-то круче, чем просто играть в игры. Я решил попрограммировать, тем более что мне нравилось разбираться в ПК.
Я начал гуглить, с чего начать, и начал с Python. Какое-то время меня всё устраивало в нем: простой, красивый и понятный ЯП. Но в один момент я написал код такой, что даже компилятор падал. А на тот момент (2023) ИИ плохо понимали, что я хочу, и выдавали код или советы, которые еще сильнее усугубляли положение. И так я использовал Python 1 год, и я решил, что попробую другой ЯП. Думал - Java. Попробовал и понял, что очень много надо писать кода для простого действия (тогда я не знал, но правильно описать это можно как через абстрактный-синтаксис язык).
В итоге Java я изучал ~0.5 года и увидел C++. Подумал: «Ну, на C++ пишут крутые программы, операционки и очень крутые игры, и я хочу так же». И начал учить C++, и как обычно пошел гуглить и скачал MSVC.
Почему не остался на MSVC/GCC?
На тот момент я думал, что это предел мечтаний, но в один момент я решил поговорить с ИИ и рассказать о своих достижениях на тот момент. И он говорит, что компилятор проприетарный, и если я сделаю что-то крутое, то Microsoft потребует денег за использование их компилятора, и 100% где-нибудь мелким шрифтом найдется пункт, где я должен буду им денег. Но самое страшное - это вес в 20+ ГБ, что очень много.
Я начал искать замены и нашел GCC от WinLibs. Какое-то время меня в нем всё устраивало, но чем больше я использовал GDB, G++, тем больше меня раздражала топорность ответов и страшные ошибки, которые надо гуглить или у ИИ спрашивать. И сейчас я решил попробовать у WinLibs скачать G++ с Clang, и это было неописуемо - всё удобно, как в MSVC! И я подумал, что он тоже платный, и пошел искать. Как оказалось - нет,
он не платный, и наоборот - даже свободнее G++ (в плане лицензии).
Примерно в тот день я узнал, что WinLibs не обновляет LLVM, и я использовал старый LLVM 19, хотя был уже LLVM 21. И я пошел гуглить, как собрать LLVM 21 под MinGW, и у ИИ спрашивать. И я скачал MSYS2 и там начал свои первые попытки.
Как я собрал Clang?
Как я уже написал, я начал гуглить и спрашивать у ИИ, как собрать LLVM. Мой первый конфиг был очень простой и наивный: я думал, что LLVM просто и быстро заработает. К моему удивлению, оно заработало с первой попытки, но конфиг был очень примитивный: я включил только clang и lld, так как больше ничего не хотел.
Со временем я понял, что хочу собрать LLVM Runtimes и уйти от GNU Runtimes, и вот тут начались проблемы. Самая первая и бесячая моя ошибка - LLD не мог импортировать символы. Я очень долго разбирался, почему же так происходит. Пробовал модифицировать конфиги очень по-разному, но это не помогало. И в один момент я просто случайно нашел решение: оказалось, что нельзя линковать статичные и динамичные либы вместе. На это я потратил от 1 до 2 месяцев. Я уже думал сдаться на этом моменте, но решил: либо я LLVM, либо я LLVM - и продолжил работу.
Через время я смог сделать LLVM Runtimes, но появилась новая ошибка, которую я не мог распознать. Со временем до меня дошло, что C++ использует C Runtimes, а locale.h - это часть Lib C. Я начал гуглить и искать, наткнулся на статью, где говорилось, что MSCRT старое и использовать его не надо, а вот UCRT — новое, и надо использовать именно его. Я начал искать MinGW UCRT, и да, я был прав — оно есть и даже работает прекрасно без «танцев с бубном».
Позже я захотел LLDBи ClangD. Будь я нормальным человеком, я бы просто скачал ClangD, но нет — я решил его собрать. На удивление, clang‑extra‑tools (частью которого является ClangD) работает прекрасно. А вот с LLDB была проблема: он падал на MainLoopWindows.cpp. Я спросил у ИИ, хотя был настроен скептично и думал, что придется разбираться и руками модифицировать код. НО он с первой попытки выдал полностью рабочий код!
Я удивился «Странно, обычно ИИ дает что-то не то, а тут даже докопаться нельзя». Я хотел уже выдать себя за гения, который портировал LLDB на MinGW-UCRT, но чувствовал что-то не то. Мне казалось, что ИИ украл откуда-то этот код, потому что не бывает таких идеальных совпадений. И знаете что? Я был прав! Он взял этот код из LLVM 22 (на 22.12.2025 это экспериментальная ветка).
У меня были смешанные эмоции. С одной стороны — я был прав, с другой — если я опубликую этот код как свой, то это — карма на всю жизнь. И я решил удалить любые упоминания, что код мой. Но пока я удалял упоминания, заметил, что можно добавить std::mutex, и подумал: с одной стороны — там работают умные люди и они бы не упустили такое, с другой — они же тоже люди и могли не заметить или не подумать.
В итоге я решил прогнать тесты и с борку. Результаты тестов ninja check-lldb вы можете посмотреть на фото ниже.


Но я подумал: а если тесты слишком «сухие» и на реальной работе это скажется? Я попросил ИИ сделать какой-нибудь супернавороченный код с Atomic, Threads, Vector, и LLDB с этим тоже справился. На мое удивление, даже не было ничего страшного, потому я оставил мой вариант кода (кто шарит - можете проверить и написать, я, как и говорил, новичок, поэтому буду рад экспертному мнению).
Почему не готовые варианты?
Пока я гуглил, как собрать, не раз натыкался на сборки Мартина Сторшё, известного в мире как mstorsjö. Я смотрел на его сборки, но проблема в том, что он очень сильно модифицирует исходники и собирает их из‑под Linux (могу ошибаться, но сайты, которые я смотрел, говорили про Linux). Любой, кто использует его сборки, может сказать, что они отлично работают, и вообще — как��я разница, меняет он код или нет?
На что я отвечаю: допустим, он гений программирования, но он один. А в LLVM — 50 хороших программистов (условно). Пока он один будет сам себя проверять и сам писать, команда LLVM будет писать 50 разных частей, потому что каждый пишет свое. Плюс каждый сможет оценить работу своего коллеги и заметить ошибку, о которой знал только он. И что немаловажно: проект mstorsjö популярен в кругах MinGW, а не глобально. Инженеру на Linux/MacOS вообще все равно на MinGW, а в глобальном проекте огромная посещаемость и шанс, что кто‑то что‑то заметит, куда выше.
Заключение
Начал я свою работу 1 сентября 2025 года и надеялся, что максимум это займет пару дней. Но в итоге это переросло в нечто большее, на что я потратил около 3.8 месяца. Собралось оно у меня ровно так, как я обещал в самом начале статьи, только к 19 декабря 2025 года. Работал я по 3-5 часов (как я писал, я школьник, поэтому работал, когда мог, и предпочитал не играть, а работать).
Надеюсь, вам понравилось и вы оцените мой труд. Кому интересно — вот ссылка на репозиторий.
