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

Материал из ALT Linux Wiki
< RPM
Нет описания правки
м (убраны лишние пробелы в разметке кода, чтоб было удобнее копипастить)
Строка 1: Строка 1:
= Как быстро сделать Rust пакет с вендорингом =
= Как быстро сделать Rust пакет с вендорингом =


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


  $ rm Cargo.lock
$ rm Cargo.lock
  $ cargo vendor
$ cargo vendor
  $ find vendor -name '*.a' -delete
$ find vendor -name '*.a' -delete
  $ git add -A -f vendor Cargo.lock
$ git add -A -f vendor Cargo.lock
  $ git commit -m "cargo vendor"
$ git commit -m "cargo vendor"


* <code>cargo vendor</code> - поместит все зависимости в диру vendor/, желательно, чтоб она была пустая.
* <code>cargo vendor</code> - поместит все зависимости в диру vendor/, желательно, чтоб она была пустая.
Строка 15: Строка 15:
В спеке:
В спеке:


  BuildRequires: /proc
BuildRequires: /proc
  BuildRequires: rust-cargo
BuildRequires: rust-cargo


* <code>/proc</code> необходим для работы cargo.
* <code>/proc</code> необходим для работы cargo.
Строка 22: Строка 22:
В секции <code>%prep</code> после <code>%setup</code>:
В секции <code>%prep</code> после <code>%setup</code>:


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


* эта конструкция подключит вендореные исходники, настроит опции сборки и инсталляции.
* эта конструкция подключит вендореные исходники, настроит опции сборки и инсталляции.
Строка 48: Строка 48:
В <code>%build</code>:
В <code>%build</code>:


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


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


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


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


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


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

Версия от 00:57, 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