commit -m "better"
2.96K subscribers
868 photos
105 videos
3 files
2.07K links
just random thoughts
Download Telegram
#cargo #rust

Cargo довольно сильно сопротивляется патчингу исходников.

Натуральный способ патчинга в случае сборки с cargo - это завендорить все исходники, и, перед сборкой, запатчить завендоренное.

Есть вот такой вот тикет https://github.com/rust-lang/cargo/issues/11063 (полагаю, не единственный), там обсуждаются разные всратые решения этой проблемы.

Понятное дело, что #errogant upstream на хую вертел downstream, потому что "собирайтесь как автор кода захотел левой пяткой", а проблемы негров (конкретно, людей, которым нужно собираться в разных необычных окружениях, типа моего) их не волнуют.

Я потырил решение у IBM RedHat сообщества федоры - https://src.fedoraproject.org/rpms/rust//blob/rawhide/f/rust.spec#_615, им, сюрприз-сюрприз, тоже хочется уметь развендоренные исходники, чего бы там себе не воображали школота зумеры разработчики на Rust. Потому что баги в libz/libgit2/openssl патчить им, а не тем, кто принудительно завендорил исходники, без возможности сборки с системным вариантом.

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

Развендориваю я их довольно грубо - сначала ищу все крейты в которых есть c/c++ файлы (https://github.com/pg83/ix/blob/main/pkgs/bld/rust/devendor/scripts/classify.py), потом "обнуляю" сборку этих крейтов (https://github.com/pg83/ix/blob/main/pkgs/bld/rust/devendor/scripts/devendor.sh#L14-L17) Федора развендоривает какие-то заранее известные крейты - https://src.fedoraproject.org/rpms/rust//blob/rawhide/f/rust.spec#_585
👍15🔥7🆒3🤬2🥱1
#rant

Каждый уважающий себя растаман считает своим долгом впендюрить какие-то свои сборочные настройки в release/dev profile. #cargo

Например, https://github.com/pop-os/cosmic-panel/blob/master/Cargo.toml#L16

Проблема в том, что эти дети не понимают, что творят.

Они, наверное, думают, что делают мне хорошо тем, что их программа у меня будет собираться в 10 раз дольше, и работать на полпроцента быстрее.

Нет, это не так.

Меня это, в конце-концов, заебало, и я решил это починить.

Благо, https://doc.rust-lang.org/cargo/reference/profiles.html это, вроде, позволяет - запили свой профиль, да передай его в cargo --profile.

Но, как оказалось, система сопротивляется тому, чтобы переопределить авторские настройки:

* Если попробовать запилить полностью новый свой профиль, то cargo ругается, и говорит, что любой мой кастомный профиль должен делать inherit от какого-то существующего модуля.

* А если сделать наследование от profile.release, то я получаю в нагрузку все эти лютые донастройки от автора софта.

В общем, как обычно, пришлось решать проблему по рабоче-крестьянски, а именно:

* https://github.com/pg83/ix/blob/main/pkgs/bld/rust/devendor/scripts/strip.py - выпиздить к хуям все авторские экзерсизы. Я было хотел сделать честно, через парсинг toml, но, как оказалось, toml там уже совсем не toml (но об этом в другой раз), поэтому регулярочкой.

* https://github.com/pg83/ix/blob/main/pkgs/die/rust/cargo.sh#L130*-L137 - после выпиливания гениальной авторской мысли, доливаем свои, хорошие, настройки, в которых заведомо нет LTO.
🤡18🤣12👍10🔥4😁3😱2❤‍🔥1
commit -m "better"
#rant Каждый уважающий себя растаман считает своим долгом впендюрить какие-то свои сборочные настройки в release/dev profile. #cargo Например, https://github.com/pop-os/cosmic-panel/blob/master/Cargo.toml#L16 Проблема в том, что эти дети не понимают, что…
Продолжаю свои страдания по rust. #rant

TIL что

cargo build --package A --package B


и

cargo build --package A
cargo build --package B


- это две разные команды!

Да, да, собрать два артефакта одновременно - это совсем не то же самое, что собрать их последовательно.

Как так получается?

Очень просто, #cargo, когда ему надо выполнить первую команду, строит объединение feature флагов этих двух пакетов, и собирает каждый их этих пакетов с объединением их флагов.

Вот и получается, что, по отдельности, пакеты собираются, а вместе - https://gist.github.com/pg83/d2b61ba29587503d58d191a98829f526

Такое ощущение, что разработчики cargo однажды решили, "а давайте вообще все сделаем по-другому". Не "хорошо" или "плохо", а просто иначе.
🥴29👍6🤡4🐳4💩3🤔1🤯1
commit -m "better"
Продолжаю свои страдания по rust. #rant TIL что cargo build --package A --package B и cargo build --package A cargo build --package B - это две разные команды! Да, да, собрать два артефакта одновременно - это совсем не то же самое, что собрать их последовательно.…
#rant

#cargo проектировали сумасшедшие (если его вообще проектировали).

Не верите - попробуйте выразить с помощью cargo "собери мне пакет X с набором фич по умолчанию, за исключением Y".

"Это никому не нужно"?

Ну, как сказать, вот есть у меня пакет, в котором есть ['A', 'B', ..., 'X11', 'wayland'], и я хочу исключить X11.

Спрашивается, что мне делать, и чего употребляли авторы cargo?

2024-ый год, cargo не умеет в -feature, ага. Про -feature_group я вообще молчу, это какой-то космос.
😢12🤡8🗿4🐳3💯2🎃2👍1
commit -m "better"
#rant #cargo проектировали сумасшедшие (если его вообще проектировали). Не верите - попробуйте выразить с помощью cargo "собери мне пакет X с набором фич по умолчанию, за исключением Y". "Это никому не нужно"? Ну, как сказать, вот есть у меня пакет, в…
#rant

Продолжаем срывать покровы про #cargo.

Если вы делаете нативную сборку, то бинарники будут лежать в $CARGO_TARGET_DIR/$CARGO_BUILD_TYPE (release/debug)

А если кросс-компилируете, то в $CARGO_TARGET_DIR/$CARGO_TARGET_PLATFORM/$CARGO_BUILD_TYPE

Поэтому install скрипты, которые живут своей жизнью (а это все install скрипты для rust/cargo проектов, потому что cargo не умеет в сколько-нибудь разумный install) работают только или для нативной сборки, или только для кросс-сборки.

Указать этой ебанине блядской что-то в стиле "положи результат ВОТ СЮДА" - невозможно.

Вот, даже рукопожатный #COSMIC хардкодит эти пути (для нативной сборки только) - https://github.com/pop-os/cosmic-edit/blob/3d9240927588efe9a33e16c014979798f78e1d7a/justfile#L11-L13
🤡10😁5🐳4🤯21🆒1
commit -m "better"
#rant Продолжаем срывать покровы про #cargo. Если вы делаете нативную сборку, то бинарники будут лежать в $CARGO_TARGET_DIR/$CARGO_BUILD_TYPE (release/debug) А если кросс-компилируете, то в $CARGO_TARGET_DIR/$CARGO_TARGET_PLATFORM/$CARGO_BUILD_TYPE Поэтому…
#rant, #cargo

https://doc.rust-lang.org/nightly/rustc/platform-support.html

Rust считает, что x86_64-unknown-linux-gnu - triplet, описывающий платформу.

Я, наверное, долблюсь в глаза, но вижу тут 4 поля.

Задачка со звездочкой - где тут у Rust стоят группирующие скобки?
😁10👍5🐳3🤔1
Будни #bootstrap

Собрал себе https://github.com/ikatson/rqbit

Вроде бы, ничего сложного, а, с другой стороны, и не очень просто.

Пакет, с точки зрения сборки, странный:

* бинарник собирается через #cargo
* gui собирается с помощью npm - https://github.com/ikatson/rqbit/blob/main/Makefile#L4-L6
* все это оркестрируется через Makefile

Обычно я такие пакеты делю на 2, и каждый собираю с помощью своего шаблона, а потом объединяю эти пакеты в одну сущность.

Вот, например, сборка prometheus - https://github.com/pg83/ix/blob/main/pkgs/bin/prometheus/ix.sh

Но, в данном случае, так не вышло, потому что бинарь rqbit хочет включить (embed) в себя js/html gui.

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

Поэтому пришлось соорудить херобору - собрать два пакета-исходника, один с cargo vendor, другой - c npm install (https://github.com/pg83/ix/blob/main/pkgs/bin/rqbit/web/ix.sh#L22-L41), и слить их в один (https://github.com/pg83/ix/blob/main/pkgs/bin/rqbit/ix.sh#L26-L32), для того, чтобы изготовить бинарь из результата.

Неприятная, штучная, работа, результат которой больше нигде не пригодится.

К счастью, с таким сталкиваться приходится довольно редко.
🐳6👍43🔥2🤯2🆒1
Будни #bootstrap, #rant

Обновлял rqbit.

Это который упаковывает кучу js кода себе в бинарь, и вызывает для этого npm - https://t.iss.one/itpgchannel/2410

Обновление упало с ошибкой - https://gist.github.com/pg83/cd1ec54f5a4fd4f2e5cfc4b82e063c12

TL;DR - при обновлении приехал новый https://vite.dev/, который притащил за собой новый https://github.com/rollup/rollup (не спрашивайте, это говно бандлит JS код в 1 файл), который переписали на "мамой-клянусь memory safe" языке (https://github.com/rollup/rollup/tree/master/rust), а чтобы не портить пользователям малину, положили в пакет предкомпилированные даже не бинари, а .so для nodejs.

Вона там их сколько, даже для loongson есть:

https://github.com/rollup/rollup/blob/master/package.json#L19-L37

(для #stal/ix нет, ага)

Да, да, никогда такого не было, и вот, опять, зумеры подложили очередную вирусню в репу очередной supply chain attack:

#blob

https://t.iss.one/itpgchannel/1281
https://t.iss.one/itpgchannel/1301
https://t.iss.one/itpgchannel/2264
https://t.iss.one/itpgchannel/2084
https://t.iss.one/itpgchannel/1789
https://t.iss.one/itpgchannel/535

Что я сделал?

Даунгрейднул все эти зависимости, и все заработало:

https://github.com/pg83/ix/blob/main/pkgs/bin/rqbit/ix.sh#L22-L23

Что я буду делать, когда оно перестанет так собираться?

Стану проституткой!

Не знаю, изучу JS, наушники с котоушками у меня уже есть https://t.iss.one/itpgchannel/2444.
😁12👍5🤡42🐳2🦄2❤‍🔥1
#rant

#cargo разрабатывают какие-то упыри.

Ну вот надо вам передать строковый параметр, как вы это сделаете?

Я сделаю вот так - cargo --config A=B.

К чему пришло извращенное Rust-ом сознание?

Правильно, к cargo --config "A = 'B'", не упустите ничего, особенно того, как в такой схеме экранировать спецсимволы.
😁32🤡13👍5🔥3💯3🐳2🙈21🤔1