Сборка 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. Лечить их так:

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' }

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

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

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