PunchKwara doctors lament poor pay, illegal salary deductionsEl Comercio¿Meta favorece a Flávio Bolsonaro y perjudica a Lula? Las claves de la polémica electoral en BrasilRTP DesportoMotoGP: terminou a temporada para RazgatliogluESPNTransfer rumors, news: Premier League clubs eye Alexander-Arnold amid Real Madrid uncertaintyThe Jerusalem PostMandelblit says he approved questioning Netanyahu as suspect, defense challenges wordingDaily MaverickHegseth meets Netanyahu in unannounced visit to Israel, source saysInquirerMarcos vows reforms to boost investor confidence, stock marketCollider‘Sense and Sensibility’ Officially Posts One of the Weekend’s Best Per-Theater AveragesObservador DesportoMoçambique. Supostos terroristas abatidos por fuzileirosSky TG24I titoli di Sky TG24 del 20 ottobre, edizione delle 8
The Daily Newsstand · Free, Always
Tuesday, October 20, 2026

Bootstrap Swift 6.3 for Linux

Translate

На самом деле, к моменту написания статьи я уже собрал тулчейны Swift 6.3.3 и Swift 6.4.

Почему именно Swift? Потому что он опенсорсный, кроссплатформенный и не очень популярен за пределами яблочной экосистемы. А ещё мне нравится на нём писать.

Почему собрать из исходников? Потому что сборка и установка из исходников — одно из двух моих любимых компьютерных хобби. Второе — дистрохоппинг.

Почему именно под Linux? Потому что мне немного приелась macOS, и я хочу использовать это как входную точку для углубления своих знаний о Linux.

От слов к делу

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

  • Из ОС поддерживаются macOS и Ubuntu. Для Windows — отдельный гайд. Есть упоминание Amazon Linux, но ссылка на докерфайл для него ведёт на 404.

  • Тулчейн состоит из нескольких разных компонентов. Все компоненты расположены в разных репозиториях. Репозиторий github.com/swiftlang/swift — только один из них.

  • Синхронизация репозиториев делается скриптом swift/utils/update-checkout, а сборка — swift/utils/build-script.

  • Из инструментов на Ubuntu точно нужны установленные: Python 3 для исполнения скриптов, Git 2.x, CMake для конфигурирования и ninja для сборки. Полные списки зависимостей лучше смотреть в докерфайле для своей версии Ubuntu. На macOS всё необходимое будет собрано автоматически с помощью Xcode.

  • Для ускорения инкрементальной сборки можно использовать sccache.

  • Необходимо иметь установленный Swift‑тулчейн для сборки компонентов компилятора, написанных на Swift.

  • Рекомендуется иметь 150 ГБ свободного дискового пространства и хотя бы 8 ГБ RAM.

Для меня было принципиально собрать тулчейн, не имея установленного Swift. А единственный ноутбук, на котором у меня хватало свободного места под артефакты сборки, располагает 4 ГБ RAM и процессором Intel Pentium N3520.

Тот самый Asus X200MA

Тот самый Asus X200MA

Воодушевлённый ограничениями, которые предстоит обойти, я приступил к сборке:

  • установил зависимости для своей ОС;

  • проверил, что все инструменты нужных версий присутствуют;

  • склонировал все репозитории;

  • переключился на тэг swift-6.3.0-RELEASE (мало ли что там в мастере).

В общем, дошёл до этапа сборки. Запустив build-script с необходимыми аргументами, я дождался, пока соберутся первые модули, не требующие установленного Swift‑компилятора, и, ожидаемо, получил ошибку: No CMAKE_Swift_COMPILER could be found.

Но что делать, если установить его нет возможности или не хочется? Решение есть.

Так как Swift изначально был написан на C++ и не содержал модулей на Swift, то я понимал, что можно собрать компилятор Swift, написанный на C++, и с его помощью собрать модули, написанные на Swift. Этот процесс называется bootstrapping. И про него интересно почитать даже в отрыве от сборки Swift: 1, 2.

Поиск подробностей бутстрапинга Swift сначала привёл меня к пресетам. Это фиксированные наборы опций для сборки конкретного варианта тулчейна либо для запуска тестов. Они перечислены в файле build-presets.ini, который лежит рядом с build-script. Ближе к концу файла есть раздел Toolchain Bootstrapping Stages. В нём есть пресеты: bootstrap-stage0, bootstrap-stage1, bootstrap-stage2.

Из комментариев, содержимого пресетов и истории коммитов (0, 1, 2) у меня вырисовалась следующая картина:

  • bootstrap-stage0 не требует установленного Swift Toolchain и генерирует очень ограниченный компилятор и стандартную библиотеку. С его помощью можно собрать только bootstrap-stage1.

  • bootstrap-stage1 генерирует промежуточный тулчейн, скорее всего, подходящий для сборки релизного тулчейна.

  • bootstrap-stage2 генерирует предпочтительный набор инструментов для сборки релизного Swift‑тулчейна. Так как для его сборки требуется минимум bootstrap-stage1, компилятор в нём содержит все Swift‑оптимизации.

Дальше я собрал все три бутстрап‑тулчейна подряд. Процесс каждый раз почти идентичный:

  1. Запускаю команду типа utils/build-script –preset=bootstrap_stageХ build_subdir=bootstrap_stageХ install_destdir=toolchain_stageХ.

  2. Спотыкаюсь об ошибки билда (они в основном были связаны с файлом подкачки; bootstrap-stage0 ругнулся, что ему нужны clang и lld).

  3. Радуюсь, что всё собралось, меняю путь к каталогу toolchain_stageХ/usr/bin/ в $PATH, чтобы ресолвился путь до swift и swiftc.

С готовым bootstrap-stage2 компилятором я решился запустить сборку релизного тулчейна. Результат — в директории ~/swift-project/build/Ninja-RelWithDebInfoAssert/toolchain-....

Для проверки работоспособности взял свой же пет‑проект и прогнал тесты. Для начала мне показалось, что этого достаточно.

It's ain't so much, but it's honest work

It's ain't so much, but it's honest work

Но неужели нет более очевидного способа?

Есть, и он даже описан в документации про Swift‑части компилятора. Если коротко, с опцией --bootstrapping=bootstrapping build-script должен запустить сборку в несколько этапов:

  1. Сначала собираются level‑0 компилятор и стандартная библиотека, написанные на C++.

  2. Они используются для сборки level‑1 компилятора и стандартной библиотеки со Swift‑модулями.

  3. А уже level‑1 компилятор и библиотека используются, чтобы получить оптимизированный и быстрый релизный тулчейн.

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

Вновь воодушевлённый, я решил собрать уже Swift 6.4 «по красоте». С опцией --bootstrapping=bootstrapping вместо пресетов.

Сборка всё равно остановилась с ошибкой: No CMAKE_Swift_COMPILER could be found. Как мне объяснили в топике на Swift Forums:

It stopped working after Swift 5.10. There were several things that landed in the Swift 6.0 timeframe that make it tricky to say exactly what caused 6.0 to stop building with the bootstrap flag.

Ладно, будь по-вашему, решил я. И ограничился сборкой Swift 6.4, используя свой Swift 6.3.3.

Мои ошибки

Я мало того что проигнорировал требование про 8 ГБ RAM, так ещё и поставил на ноутбук полноценную Ubuntu вместо Xubuntu/Lubuntu. Даже с отключённым GUI командаfree -h показывала в столбце available 2.6 Gi. Но я попытался компенсировать это файлом подкачки на 16 GB. Ещё я не использовал --sscache. Хотя и не уверен, что это ускорило бы хоть что-то в моем случае.

Сначала всё было нормально. Если можно считать нормальным сборку, занимающую 16–24 часа. Ведь каждый раз в начале компилировалась новая LLVM, а это 5800+ built steps.

bootstrap-stage0 собрался без проблем, а вот при сборке bootstrap-stage1 и bootstrap-stage2 я начал иногда ловить CPU soft‑lock, связанные с kswapd. В таких случаях я перезагружал ноутбук и запускал сборку опять, радуясь, что ninja не начнёт компилировать всё с самого начала.

При сборке Swift‑модулей для релизного тулчейна CPU soft‑lock начал происходить стабильно, что окончательно заблокировало процесс сборки.

Практическим решением этой проблемы оказался аргумент build-jobs. Ограничение количества параллельных операций сборки до 1 дало результат. Сборка стала ещё медленней, но ноутбук перестал зависать намертво. Для меня к этому моменту было важнее получить результат, чем разбираться с причинами ошибки и пытаться подобрать оптимальные параметры для swap, так что меня это устроило.

Весь процесс сборки Swift 6.3 занял у меня что‑то около двух недель. И я твёрдо решил, что второй раз такой ерундой заниматься не буду.

Когда, после этого, я решил собрать Swift 6.4, я сначала установил Xubuntu. У неё с со свободной памятью получше. Без GUI было доступно около 3 Gi RAM. Вместо --release-debuginfo я в этот раз передавал просто --release.

Но даже с таким раскладом build-jobs пришлось оставить равным 1, а файл подкачки я пересоздал на 4 GB. Сборка опять заняла примерно полтора дня, но теперь у меня есть два релизных тулчейна на жутко тормозящем ноутбуке.

Это усмпех

Это усмпех

Заключение

Да, Swift Toolchain сильно проще и быстрее скачать из сети Интернет. Но есть что‑то приятное в надписи «BUILD SUCCEED», которую получил, даже не до конца понимая, как происходит этот BUILD под капотом.

А ещё набивание шишек и расширение кругозора не скачаешь. Ещё пару месяцев назад я слабо представлял себе процесс бутстрапинга компилятора и не знал ничего про zram, free, утилиты управления демонами.

А без кругозора нет вдохновения. Крутишь в руках скачанный тулчейн — что с ним делать, непонятно. А пока смотришь, как компилируется очередной этап бутстраппинга, либо пока копаешься в Swift‑репозиториях, в голову лезут интересные мысли. Например, навайбкодить контрибушн в https://github.com/swiftlang/swift-driver или написать свой маленький куценький BoolgenOS display manager.

В любом случае собранный тулчейн — это не конец, а только начало.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.