RPM/Rust: различия между версиями

Материал из ALT Linux Wiki
< RPM
Нет описания правки
Нет описания правки
Строка 9: Строка 9:
   $ git commit -m "cargo vendor"
   $ git commit -m "cargo vendor"


* cargo vendor - поместит все зависимости в диру vendor/, желательно, чтоб она была пустая.
* <code>cargo vendor</code> - поместит все зависимости в диру vendor/, желательно, чтоб она была пустая.
* find - удалит бинарные библиотеки из виндовых зависимостей (winapi*).
* <code>find</code> - удалит бинарные библиотеки из виндовых зависимостей (winapi*). Ниже есть более сложный пример.
* git add -f - чтобы избежать возможных проблем с .gitignore.
* <code>git add -f</code> - чтобы избежать возможных проблем с <code>.gitignore</code>.


В спеке:
В спеке:
Строка 18: Строка 18:
   BuildRequires: rust-cargo
   BuildRequires: rust-cargo


* /proc необходим для работы cargo.
* <code>/proc</code> необходим для работы cargo.


В секции %prep после %setup:
В секции <code>%prep</code> после <code>%setup</code>:


   mkdir -p .cargo
   mkdir -p .cargo
Строка 46: Строка 46:
* эта конструкция подключит вендореные исходники, настроит опции сборки и инсталляции.
* эта конструкция подключит вендореные исходники, настроит опции сборки и инсталляции.


В %build:
В <code>%build</code>:


   cargo build %_smp_mflags --offline --release
   cargo build %_smp_mflags --offline --release


В %install (если пакет не библиотека, а бинарник):
В <code>%install</code> (если пакет не библиотека, а бинарник):


   cargo install %_smp_mflags --offline --no-track --path .
   cargo install %_smp_mflags --offline --no-track --path .


В %check, если нужен:
В <code>%check</code>, если нужен:


   cargo test %_smp_mflags --release --no-fail-fast
   cargo test %_smp_mflags --release --no-fail-fast

Версия от 03:53, 4 июня 2023

Как быстро сделать Rust пакет с вендорингом

Вендоринг — сохранение внешних зависимостей вместе с исходным пакетом (в отличии от помещения их в отдельные пакеты и использования BuildRequires). Как завендорить растовые зависимости (в дире с пакетом):

 $ rm Cargo.lock
 $ cargo vendor
 $ find vendor -name '*.a' -delete
 $ git add -A -f vendor Cargo.lock
 $ git commit -m "cargo vendor"
  • cargo vendor - поместит все зависимости в диру vendor/, желательно, чтоб она была пустая.
  • find - удалит бинарные библиотеки из виндовых зависимостей (winapi*). Ниже есть более сложный пример.
  • git add -f - чтобы избежать возможных проблем с .gitignore.

В спеке:

 BuildRequires: /proc
 BuildRequires: rust-cargo
  • /proc необходим для работы cargo.

В секции %prep после %setup:

 mkdir -p .cargo
 cat >> .cargo/config <<EOF
 [source.crates-io]
 replace-with = "vendored-sources"
 
 [source.vendored-sources]
 directory = "vendor"
 
 [term]
 verbose = true
 quiet = false
 
 [install]
 root = "%buildroot%_prefix"
 
 [build]
 rustflags = ["-Copt-level=3", "-Cdebuginfo=1"]

 [profile.release]
 strip = false
 EOF
  • эта конструкция подключит вендореные исходники, настроит опции сборки и инсталляции.

В %build:

 cargo build %_smp_mflags --offline --release

В %install (если пакет не библиотека, а бинарник):

 cargo install %_smp_mflags --offline --no-track --path .

В %check, если нужен:

 cargo test %_smp_mflags --release --no-fail-fast

Полезные советы

  • Более глубокая очистка от бинарных артефактов:
find vendor/ \( -name '*.a' -o -name '*.lib' -o -name '*.dll' -o -name '*.obj' \) -delete
sed -Ei 's!,"[^"]+\.(a|lib|dll|obj)":"[^"]+"!!g' $(find vendor -name .cargo-checksum.json)

Такая чистка часто ломает rustix, что решается включением use-libc feature (например добавлением при сборке export RUSTFLAGS="--cfg=rustix_use_libc") или включением cc feature — пример как это выглядит в Cargo.toml:

[dependencies]
rustix = { features = ["cc"] }
  • Решение проблем с windows/unix кодировкой текстовых файлов:
grep -sq -w 'text' .gitattributes && echo '* -text' > vendor/.gitattributes