#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
Cargo довольно сильно сопротивляется патчингу исходников.
Натуральный способ патчинга в случае сборки с cargo - это завендорить все исходники, и, перед сборкой, запатчить завендоренное.
Есть вот такой вот тикет https://github.com/rust-lang/cargo/issues/11063 (полагаю, не единственный), там обсуждаются разные всратые решения этой проблемы.
Понятное дело, что #errogant upstream на хую вертел downstream, потому что "собирайтесь как автор кода захотел левой пяткой", а проблемы негров (конкретно, людей, которым нужно собираться в разных необычных окружениях, типа моего) их не волнуют.
Я потырил решение у
Мне на завендоренные исходники, в силу статической сборки, в целом, пофиг, но, к сожалению, авторы этих 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
GitHub
allow .cargo-checksum.json to be missing · Issue #11063 · rust-lang/cargo
Problem Cargo requires .cargo-checksum.json to be present in all crates vendored in the vendor/ directory but provides no convenient means for generating the file when manually adding a crate to th...
👍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 ругается, и говорит, что любой мой кастомный профиль должен делать 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.
Каждый уважающий себя растаман считает своим долгом впендюрить какие-то свои сборочные настройки в 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.
GitHub
cosmic-panel/Cargo.toml at master · pop-os/cosmic-panel
WIP. Contribute to pop-os/cosmic-panel development by creating an account on GitHub.
🤡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, когда ему надо выполнить первую команду, строит объединение feature флагов этих двух пакетов, и собирает каждый их этих пакетов с объединением их флагов.
Вот и получается, что, по отдельности, пакеты собираются, а вместе - https://gist.github.com/pg83/d2b61ba29587503d58d191a98829f526
Такое ощущение, что разработчики cargo однажды решили, "а давайте вообще все сделаем по-другому". Не "хорошо" или "плохо", а просто иначе.
TIL что
cargo build --package A --package B
и
cargo build --package A
cargo build --package B
- это две разные команды!
Да, да, собрать два артефакта одновременно - это совсем не то же самое, что собрать их последовательно.
Как так получается?
Очень просто, #cargo, когда ему надо выполнить первую команду, строит объединение feature флагов этих двух пакетов, и собирает каждый их этих пакетов с объединением их флагов.
Вот и получается, что, по отдельности, пакеты собираются, а вместе - https://gist.github.com/pg83/d2b61ba29587503d58d191a98829f526
Такое ощущение, что разработчики cargo однажды решили, "а давайте вообще все сделаем по-другому". Не "хорошо" или "плохо", а просто иначе.
Gist
gist:d2b61ba29587503d58d191a98829f526
GitHub Gist: instantly share code, notes, and snippets.
🥴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 не умеет в
#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
Продолжаем срывать покровы про #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
GitHub
cosmic-edit/justfile at 3d9240927588efe9a33e16c014979798f78e1d7a · pop-os/cosmic-edit
COSMIC Text Editor. Contribute to pop-os/cosmic-edit development by creating an account on GitHub.
🤡10😁5🐳4🤯2❤1🆒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 считает, что
Я, наверное, долблюсь в глаза, но вижу тут 4 поля.
Задачка со звездочкой - где тут у Rust стоят группирующие скобки?
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), для того, чтобы изготовить бинарь из результата.
Неприятная, штучная, работа, результат которой больше нигде не пригодится.
К счастью, с таким сталкиваться приходится довольно редко.
Собрал себе 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), для того, чтобы изготовить бинарь из результата.
Неприятная, штучная, работа, результат которой больше нигде не пригодится.
К счастью, с таким сталкиваться приходится довольно редко.
GitHub
GitHub - ikatson/rqbit: A bittorrent client in Rust
A bittorrent client in Rust. Contribute to ikatson/rqbit development by creating an account on GitHub.
🐳6👍4❤3🔥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.
Обновлял 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 нет, ага)
Да, да, никогда такого не было, и вот, опять, зумеры подложили
#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.
Telegram
commit -m "better"
Будни #bootstrap
Собрал себе https://github.com/ikatson/rqbit
Вроде бы, ничего сложного, а, с другой стороны, и не очень просто.
Пакет, с точки зрения сборки, странный:
* бинарник собирается через #cargo
* gui собирается с помощью npm - https://githu…
Собрал себе https://github.com/ikatson/rqbit
Вроде бы, ничего сложного, а, с другой стороны, и не очень просто.
Пакет, с точки зрения сборки, странный:
* бинарник собирается через #cargo
* gui собирается с помощью npm - https://githu…
😁12👍5🤡4❤2🐳2🦄2❤🔥1
#rant
#cargo разрабатывают какие-то упыри.
Ну вот надо вам передать строковый параметр, как вы это сделаете?
Я сделаю вот так -
К чему пришло извращенное Rust-ом сознание?
Правильно, к
#cargo разрабатывают какие-то упыри.
Ну вот надо вам передать строковый параметр, как вы это сделаете?
Я сделаю вот так -
cargo --config A=B
.К чему пришло извращенное Rust-ом сознание?
Правильно, к
cargo --config "A = 'B'"
, не упустите ничего, особенно того, как в такой схеме экранировать спецсимволы.😁32🤡13👍5🔥3💯3🐳2🙈2❤1🤔1