Сборка 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. Лечить их так:
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 - группа сообщества разрабатывающая эмулятор процессора Эльбрус