RPM/Rust: различия между версиями
< RPM
Vt (обсуждение | вклад) Нет описания правки |
Vt (обсуждение | вклад) Нет описания правки |
||
Строка 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