Сборка LSD (Rust) под Эльбрус

Сборка 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


GitHub - xou816/spot: Native Spotify client for the GNOME desktop
Native Spotify client for the GNOME desktop. Contribute to xou816/spot development by creating an account on GitHub.

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

По итогу всё работает 😃

Страшная рамка это от xfce. Gnome пока не собран на e2k

Так же пример от 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' }

Отличная входная точка для погружения в Эльбрус

GitHub - e2k-community/awesome-e2k: awesome-e2k
awesome-e2k. Contribute to e2k-community/awesome-e2k development by creating an account on GitHub.

Чаты и каналы в Telegram