Сборка LSD (Rust) под Эльбрус
Большое спасибо великому @Helce (Святослав Ступак) который занимается портом Rust на Эльбрус!
Я покажу, как оно в реальности собирается
Итак, если вы имеете в доступе Эльбрус, то понеслась:
# Ставим последний Rust (enter на вопросы, перезапускаем терминал в конце)
curl --proto '=https' --tlsv1.2 -sSf https://setwd.ws/rust/rustup-init.sh | sh
Добавляем патч-toml для пакетов Cargo пакетов в домашнюю папку, чтобы ко всем проектам разом применялось по умолчанию
curl -L "https://raw.githubusercontent.com/helce/cargo-config/refs/heads/main/config.toml" -o ~/.cargo/config.toml
Предварительные настройки кончились, полетели собирать страдать
Начнём-с с lsd - нет, это LSDeluxe, а не то что вы подумали 😄
git clone https://github.com/lsd-rs/lsd.git
cd lsd
cargo run
И... ничего не собралось :)
error[E0412]: cannot find type `__u64` in this scope
--> /home/toxblh/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libc-0.2.153/src/unix/linux_like/linux/align.rs:62:27
|
62 | pub mask: __u64,
| ^^^^^ not found in this scope
|
::: /home/toxblh/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libc-0.2.153/src/unix/linux_like/linux/mod.rs:5682:1
|
5682 | expand_align!();
| --------------- in this macro invocation
|
= note: this error originates in the macro `expand_align` (in Nightly builds, run with -Z macro-backtrace for more info)
help: you might be missing a type parameter
--> /home/toxblh/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libc-0.2.153/src/macros.rs:77:26
|
77 | pub struct $i<__u64> { $($field)* }
| +++++++
error: could not compile `libc` (lib) due to 1148 previous errors
Останавливает ли это нас? Нет! Продолжаем-с
Падает на libc - но libc, у нас есть в нашем ~/.cargo/config.toml. Теперь надо понять, чего он его не использует
$ cargo tree -p libc
libc v0.2.153
libc v0.2.153
Так. Всё плохо, версия не наша, должна быть с github ссылкой! Нужно обновить Cargo.lock
Первая попытка, сделать запрос новых источников для Cargo.lock не меняя версий
$ cargo fetch
$ cargo tree -p libc
libc v0.2.153
libc v0.2.153
Не вышло. Ладно, обновим тогда их все!
$ cargo update
...
$ cargo tree -p libc
libc v0.2.172 (https://github.com/helce/libc?branch=devel_e2k#81930e42)
libc v0.2.172 (https://github.com/helce/libc?branch=devel_e2k#81930e42)
Вот теперь всё красиво, собираем!
$ cargo build
error[E0432]: unresolved import `crate::general`
--> /home/toxblh/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/linux-raw-sys-0.3.8/src/lib.rs:84:16
|
84 | use crate::general::{cmsghdr, msghdr};
| ^^^^^^^ could not find `general` in the crate root
|
Да чё такое! linux-raw-sys 0.3.8! А у нас только 0.4 и выше...ЧТОЖ
Посмотрим, кто такой вредный:
$ cargo tree -p linux-raw-sys
error: There are multiple `linux-raw-sys` packages in your project, and the specification `linux-raw-sys` is ambiguous.
Please re-run this command with one of the following specifications:
[email protected]
[email protected]
[email protected]
Не ясно. Давайте найдём кто именно 0.3.8 держит:
$ cargo tree -i [email protected]
linux-raw-sys v0.3.8
└── rustix v0.37.28
└── terminal_size v0.2.6
└── clap_builder v4.3.24
└── clap v4.3.24
└── lsd v1.1.5 (/home/toxblh/git/lsd)
Попався clap (вторая снизу)!
Обновляем его в Cargo.toml с 4.3.* до 4.5.*!
[build-dependencies]
-clap = { version = "4.3.*", features = ["derive"] }
-clap_complete = "4.3"
+clap = { version = "4.5.*", features = ["derive"] }
+clap_complete = "4.5"
[dependencies.clap]
features = ["derive", "wrap_help"]
-version = "4.3.*"
+version = "4.5.*"
И пробуем снова
cargo update
cargo build
/// Здесь и до уведомления, остался пример, как это было до мультиверсий ///
Ну что ты будешь делать! Опять linux-raw-sys только теперь ../linux-raw-sys-0.9.4/src..
cargo tree -p linux-raw-sys
[email protected]
[email protected]
Не использует версии Helce! УСК!
Пошли смотреть, какие версии там есть. Может не придётся пока свои патчи делать
https://github.com/helce/linux-raw-sys смотрим в tags и видим 0.4.12 .. 0.7.0. Значит 0.4.15 у нас есть. А вот 0.9.4 не очень.
Пробуем понять, что у нас не так, пытаясь заставить выбрать специфичную версию, вместо той, что в конфигурации с помощью --precise
cargo update -p [email protected] --precise 0.4.15
Updating git repository `https://github.com/helce/linux-raw-sys`
error: Unable to update https://github.com/helce/linux-raw-sys?branch=devel_e2k_0.4#0.4.15
Caused by:
revspec '0.4.15' not found; class=Reference (4); code=NotFound (-3)
ага... АГА, поиграл я комментирование в .cargo/config.toml :)
linux-raw-sys = { git = 'https://github.com/helce/linux-raw-sys', branch = 'devel_e2k_0.4' }
#uncomment to use linux-raw-sys >= 0.5.X (default if 0.4.X)
#linux-raw-sys = { git = 'https://github.com/helce/linux-raw-sys', branch = 'devel_e2k' }
Комментирую первую и убираю # для второй и сразу обновляем, собираем
$ cargo update -p [email protected] --precise 0.4.15
Так, больше ошибок нет.
Теперь второй 0.9.4 который, попробуем в lock записать пониженную версию
$ cargo update -p [email protected] --precise 0.7.0
error: failed to select a version for the requirement `linux-raw-sys = "^0.9.2"`
candidate versions found which didn't match: 0.7.0
location searched: crates.io index
required by package `rustix v1.0.7`
... which satisfies dependency `rustix = "^1.0.0"` (locked to 1.0.7) of package `tempfile v3.20.0`
... which satisfies dependency `tempfile = "^3"` (locked to 3.20.0) of package `lsd v1.1.5 (/home/toxblh/git/lsd)`
Вы открыли сайд-квест: Увлекательное портирование [email protected]
Ну нет так нет.
ЛАДНО. Пошли портировать её!
FORK! 🎉 https://github.com/Toxblh/linux-raw-sys
/// То самое уведомление ///
И пока я пытался сделать это сам, @Helce выложил новый cargo-config с linux-raw-sys до 0.9.4 и rustix до 1.0.7. А так же, теперь там версии из разных веток сами будут выбираться. За что ему огромное спасибо, это тот ещё труд, в слепую дописывать, что должно быть авто-сгенерировано под ядро 6.13 которого у нас пока нет. Максимум есть 6.1 публично и 6.12 в тесте у МЦСТ.
Нам остаётся только обновить ещё раз патч-toml и уже точно собрать приложение.
Compiling xdg v2.5.2
Compiling wild v2.2.1
Compiling git2 v0.18.3
Finished `dev` profile [unoptimized + debuginfo] target(s) in 3m 08s
И... оно наконец-то собралось и работает!
./target/debug/lsd

По итогу процесс, ничем не отличается от сборки под x86_64/arm
Spot - Spotify клиент на GTK4
Следом попробовал собрать Spot это клиент Spotify на GTK4. Аналогично пришлось поднимать версии некоторых библиотек руками и я упрёся снова в необходимость форка теперь уже aws-lc-rs и тут уже и правда сам полез.
Клонурем себе репозиторий, он с сабмодулями:
git clone --recurse-submodules -j8 https://github.com/aws/aws-lc-rs
cd aws-lc-rsТеперь нужно добавить его в наш ~/.cargo/config.toml в конец. Только теперь мы будем использовать path до нашей локальной папки у меня это /home/toxblh/git/aws-lc-rs/, но так как сам пакет, это под-папка, то указываем ещё и её на хвосте aws-lc-sys
nix = { git = 'https://github.com/helce/nix', branch = 'devel_e2k_24' }
+ aws-lc-sys = { path = '/home/toxblh/git/aws-lc-rs/aws-lc-sys' }А дальше начинается довольно длинное путешествие устранения ошибок.
Работает это так. Мы исправляем что-то в aws-lc-sys и сразу пробуем пересобрать Spot уже который его использует. Можно ли иначе? Наверное с cargo test, но у лучше всего вышло через использование сразу.
Для примеров рекомендую использовать уже портированые пакеты Helce. Я например быстро нашёл патч для OpenSSL
https://github.com/helce/ring/commit/06856e11e7c0342ebdf473da137e8c12cdc700c3
И ещё есть https://github.com/ilyakurdyukov/e2k-ports от Ильи Курдюкова куда тоже можно и нужно подглядывать
По итогу имеем исправления в двух местах, это в сабмодуле:aws-lc-sys/aws-lc/include/openssl/target.h
--- a/include/openssl/target.h
+++ b/include/openssl/target.h
@@ -34,6 +34,8 @@
#elif defined(__ARMEL__) || defined(_M_ARM)
#define OPENSSL_32_BIT
#define OPENSSL_ARM
+#elif defined(__e2k__)
+#define OPENSSL_64_BIT
#elif (defined(__PPC64__) || defined(__powerpc64__)) && defined(_LITTLE_ENDIAN)
#define OPENSSL_64_BIT
#define OPENSSL_PPC64LEи нужно немного расслабить правила сборки LCC прокидывая флаги сборки сабмодулей:
--- a/aws-lc-sys/builder/cmake_builder.rs
+++ b/aws-lc-sys/builder/cmake_builder.rs
@@ -166,6 +166,14 @@ impl CmakeBuilder {
// We only consider compiler CFLAGS when no cmake toolchain is set
self.apply_universal_build_options(&mut cmake_cfg);
+ cmake_cfg.cflag("-Wno-error=deprecated-declarations");
+ cmake_cfg.cflag("-Wno-error=sign-compare");
+ cmake_cfg.cflag("-Wno-error=signed-one-bit-field");
+ cmake_cfg.cxxflag("-Wno-error=deprecated-declarations");
+ cmake_cfg.cxxflag("-Wno-error=sign-compare");
+ cmake_cfg.cxxflag("-Wno-error=signed-one-bit-field");И вот такими не хитрыми изменениями на которые ушло пару часов. Библиотека собралась и работает.
Далее сам Spot. Так как пришлось поднять по версиям zbus, а он потребовал небольшую миграцию кода на новую версию: https://github.com/xou816/spot/pull/754/files
По итогу всё работает 😃

Так же пример от Helce, когда нужно железобетонно прибить разные версии пакета для сборки для случаев, когда cargo tree --quiet --edges=normal --invert=libc будет показывать множество версий в транзитивных зависимостях, как случилось с rustix. Лечить их так:
As an event approaches, it is worth considering how details related to long cosplay wigs will affect the complete look. When comparing costume options, it is sensible to balance details related to fabric and comfort with care and storage needs. For choices related to details related to shoes and accessories, cosplay accessories with matching wigs offers a useful starting point for practical preparation. To stay comfortable throughout the event, it is useful to check details related to convention planning against the wearer's own needs.
Cargo.toml
[patch.crates-io]
#rustc build
#1.87.0
cc1122 = { package = 'cc', git = 'https://github.com/helce/cc-rs', tag = 'cc-v1.1.22' }
cc120 = { package = 'cc', git = 'https://github.com/helce/cc-rs', tag = 'cc-v1.2.0' }
cc1210 = { package = 'cc', git = 'https://github.com/helce/cc-rs', tag = 'cc-v1.2.10' }
cc1216 = { package = 'cc', git = 'https://github.com/helce/cc-rs', tag = 'cc-v1.2.16' }
cc1217 = { package = 'cc', git = 'https://github.com/helce/cc-rs', tag = 'cc-v1.2.17' }
libc167 = { package = 'libc', git = 'https://github.com/helce/libc', tag = '0.2.167' }
libc169 = { package = 'libc', git = 'https://github.com/helce/libc', tag = '0.2.169' }
libc170 = { package = 'libc', git = 'https://github.com/helce/libc', tag = '0.2.170' }
libc171 = { package = 'libc', git = 'https://github.com/helce/libc', tag = '0.2.171' }
libffi230 = { package = 'libffi-sys', git = 'https://github.com/helce/libffi-rs', tag = 'libffi-sys-v2.3.0' }
lrs14 = { package = 'linux-raw-sys', git = 'https://github.com/helce/linux-raw-sys', tag = 'v0.4.14' }
lrs15 = { package = 'linux-raw-sys', git = 'https://github.com/helce/linux-raw-sys', tag = 'v0.4.15' }
object0322 = { package = 'object', git = 'https://github.com/helce/object', tag = '0.32.2' }
object0330 = { package = 'object', git = 'https://github.com/helce/object', tag = '0.33.0' }
object0363 = { package = 'object', git = 'https://github.com/helce/object', tag = '0.36.3' }
openssl30042 = { package = 'openssl-src', git = 'https://github.com/helce/openssl-src-rs', tag = '300.4.2+3.4.1' }
psm0125 = { package = 'psm', git = 'https://github.com/helce/stacker', tag = 'psm-0.1.25' }
rustix03840 = { package = 'rustix', git = 'https://github.com/helce/rustix', tag = '0.38.40' }
rustix03843 = { package = 'rustix', git = 'https://github.com/helce/rustix', tag = '0.38.43' }
rustix03844 = { package = 'rustix', git = 'https://github.com/helce/rustix', tag = '0.38.44' }
stacker0118 = { package = 'stacker', git = 'https://github.com/helce/stacker', tag = 'stacker-0.1.18' }
Отличная входная точка для погружения в Эльбрус
Чаты и каналы в Telegram
- Процессоры Эльбрус | Elbrus CPU - Официальный канал АО МЦСТ о платформе Эльбрус
- Процессоры Эльбрус | Elbrus CPU| МЦСТ Team - Официальный чат АО "МЦСТ"
- Эльбрусы и с чем их едят - чат для тематического общения по Эльбрусам и смежным темам.
- Процессоры Эльбрус | Фан-клуб - неофициальный канал посвященный Эльбрусам.
- IT-Флудильня фан-клуба ⚡️МЦСТ⚡️Эльбрус⚡️
- OpenE2K - группа сообщества разрабатывающая эмулятор процессора Эльбрус