OpenWRT: сборочный адъ
klink0v — 10.03.2025
Сегодня сделал второй подход к снаряду. Снова попытался собрать chan_quectel под OpenWRT. TL;DR: ни хрена не получилось, промудохался целый день без видимого результата. Понял что нуегонафуй. Похоже, зря покупал момед, т.к. скорее всего я не осилю осуществить задуманное тупо потому что в это придется вбухать неразумное количество времени, измеряемое неделями.
Как сделано во "взрослых" пакетных дистрибутивах наподобие Debian или красных шапок? Мантейнер (сопровождающий) пакета берет "авторский" исходный код, накладывает на него патчи, фомирует дефолтные конфиги, пришет всякие wrapper-скрипты, systemd-модули, после чего запапковывает это всё в пакет исходного кода. В шапках это "*.src.rpm", в Debian оно поставляется в виде трёх файлов. Каждый желающий может скачать себе такой SRC-пакет, при необходимости в нём что-нибудь поменять / добавить и пересобрать из него уже "полноценный" бинарный пакет. При этом в SRC-пакетах точно так же прописываются зависимости, так что если тебе хочется просто повторить у себя на компе подвиг мантейнера, то ты в одну-две команды можешь без особых проблем собрать ровно такой же бинарный пакет из исходного, как и он.
В OpenWRT всё не так. Они код "стороннего" софта к себе не копируют, пакетов исходного кода не формируют. Внутри репозитория OpenWRT содержатся только отсылки на GIT-репозитории других авторов, патчи, makefile-ы и указания того какой номер версии нужно вытягивать. Само "вытягивание" кода (git pull) происходит в момент сборки. При этом за консистентность среды сборки никто, мягко говоря, не ручается. То есть если у тебя какие-нибудь "неподходящие" версии компиляторов или "не те" шеллы, то это сугубо твои проблемы.
При этом тебе дается на выбор несколько вариантов.
Ты можешь собрать эту build-среду (так называемый buildroot) "с нуля" сам, включая компиляторы. Это долго даже на до фига многоядреном серваке с кучей оперативы. Можешь компиляторы взять готовые в виде бинарников под нужную целевую архитектуру на офсайте "openwrt.org". У них это называется "toolchain". Можно взять сразу комплект "toolchain + скрипты + Makefiles". Это у них выставляется под именем "SDK". При этом управление исходными кодами и разруливание зависимостей осуществляется через так называемые "feeds".
Если тебе нужно собрать какую-нибудь относительно простенькую софтинку, которая особо ни от чего не зависит и/или её автор предоставляет к ней правильные "feeds", то это несложно. Качаешь SDK, прописываешь feed, две-три команды и всё готово. А вот если нет... Нельзя просто так взять и собрать что-то не адаптированное заранее под OpenWRT кем-то достаточно грамотным.
При этом ещё и компиляция некоторых утилит наподобие каких-нибудь ncurses / iconv / libxml2 идет сразу под две архитектуры: под ту, на которой собираешь и под ту, для которой собираешь. Среда компиляции разваливается от малейшего чиха. Где-то shell не понимает пустой команды перед точкой с запятой, где-то libtool не той версии. Разный код собирается пачкой разных компиляторов: g++, gcc, cpp. Кто-то из разработчиков может использовать в своем проекте какой-нибудь meson / bison и прочую живность. Плюс последние версии OpenWRT заточены на musl вместо glibc. И вот развлекаешься пытаясь выяснить что кому невкусно и почему оно не хочет собираться в каждом конкретном случае. И так для каждого пакета, который отметился в зависимостях для того что тебе нужно.
Я сначала попытался зайти по-простому через SDK. Ага, хрен там. Chan_quectel хочет Asterisk, Alsa и зачем-то sqlite. Казалось бы, может не будем собирать Asterisk и Alsa, а просто возьмем header-ы от них? Хрен там. Во-первых, некоторые header-ы типа "buildopts.h" формируются только в ходе процедуры сборки. Во-вторых, линкер жы потом хочет эти библиотеки в бинарном виде поиметь. Так что либо таки собирать, либо пытаться их выдирать их "готовых" пакетов чтобы подсунуть потом в среду разработки. И ещё непонятно что геморройнее.
Ладно, поматерился, пошел формировать buildroot. А дальше песТня. В зависимости сразу поехали asterisk, jansson, libcap, libedit, libiconv, libxml2, ncurses, openssl, util-linux, zlib. C помощью кувалды и какой-то там матери я конечно почти что всё это собрал, но радость моя была недолгой. Asterisk почему-то наотрез отказался линковаться с libiconv. А Alsa захотела аж модуль ядра "gpio-button-hotplug". Я тогда психанул и руками убрал из Makefile вообще все зависимости, просто посмотреть что будет. Не, линкер, безжалостная сука, всё равно хочет бинарные библиотеки, так что никуда не денешься.
В общем, OpenWRT — очень прикольная штука, но ровно до тех пор пока сам не пытаешься что-нибудь под неё собрать. Мне вот интересно как это делают сами владельцы проекта. Потому что можете сами чисто из спортивного интереса склонировать из их репозитория последнюю стабильную ветку и самостоятельно пересобрать из неё тот же sqlite3 или Asterisk "как есть", даже без внесения каких-либо корректив. Красные глаза и покрытая свитером кожа вам гарантированы.
|
|
</> |
Какие стикеры для автомобиля держатся дольше всего и не выгорают
Центр Москвы предновогодний. Большая прогулка
Баварское Вязание
Прощание
Оказывается и при Хрущёве люди могли моментально слететь с высокой должности
Елене Прокловой так и не отдали тело мёртвого сына. Она верит, что он жив
Вопрос-загадка. Для чего применялся такой посеребреный дельфинчик?
Ни о чём
Железнодорожное. Вокзал

