# Since cargo 1.31, install only uses $CARGO_HOME/config, ignoring $PWD. # https://github.com/rust-lang/cargo/issues/6397 # But we can set CARGO_HOME locally, which is a good idea anyway to make sure # it never writes to ~/.cargo during rpmbuild. # We also need RUSTC_BOOTSTRAP since we use -Z avoid-dev-deps # until it gets stabilized: https://github.com/rust-lang/cargo/issues/5133 %__cargo %{_bindir}/env CARGO_HOME=.cargo RUSTC_BOOTSTRAP=1 %{_bindir}/cargo %__cargo_common_opts %{?_smp_mflags} -Z avoid-dev-deps %__cargo_inspector %{_bindir}/cargo-inspector %cargo_registry %{_datadir}/cargo/registry %__cargo_is_lib() %__cargo_inspector --target-kinds Cargo.toml | grep -q -F -x "$(printf 'lib\\\nrlib\\\nproc-macro')" %__cargo_is_bin() %__cargo_inspector --target-kinds Cargo.toml | grep -q -F -x bin %cargo_prep (\ set -eu \ %{__mkdir} -p .cargo \ cat > .cargo/config << EOF \ [build]\ rustc = "%{__rustc}"\ rustdoc = "%{__rustdoc}"\ rustflags = %{__global_rustflags_toml}\ \ [install]\ root = "%{buildroot}%{_prefix}"\ \ [term]\ verbose = true\ \ [source]\ \ [source.local-registry]\ directory = "%{cargo_registry}"\ \ [source.crates-io]\ registry = "https://crates.io"\ replace-with = "local-registry"\ EOF\ %{__rm} -f Cargo.lock \ ) %__cargo_parse_opts(naf:) %{shrink:\ %{-f:%{-a:%{error:Can't specify both -f(%{-f*}) and -a}}} \ %{-n:--no-default-features} \ %{-a:--all-features} \ %{-f:--features %{-f*}} \ %{nil} } %cargo_generate_buildrequires(af:) \ %if ! 0%{?__cargo_skip_build} \ %{__cargo_inspector} -BR %{__cargo_parse_opts %{-a} %{-f:-f%{-f*}}} Cargo.toml \ %if %{with check} \ %{__cargo_inspector} -TR Cargo.toml \ %endif \ %endif %cargo_build(naf:) \ %if ! 0%{?__cargo_skip_build} \ %{shrink:\ %{__cargo} build \ %{__cargo_common_opts} \ --release \ %{__cargo_parse_opts %{-n} %{-a} %{-f:-f%{-f*}}} \ %* \ } \ %endif %cargo_test(naf:) \ %if ! 0%{?__cargo_skip_build} \ %{shrink:\ %{__cargo} test \ %{__cargo_common_opts} \ --release \ --no-fail-fast \ %{__cargo_parse_opts %{-n} %{-a} %{-f:-f%{-f*}}} \ %* \ } \ %endif %cargo_install(t:naf:) (\ set -eu \ if %__cargo_is_lib; then \ CRATE_NAME=$(%__cargo_inspector --name Cargo.toml) \ CRATE_VERSION=$(%__cargo_inspector --version Cargo.toml) \ REG_DIR=%{buildroot}%{cargo_registry}/$CRATE_NAME-$CRATE_VERSION \ %{__mkdir} -p $REG_DIR \ # Drop all dependency/features information \ # so that cargo doesn't fail resolving dependencies: \ # https://github.com/rust-lang/cargo/pull/6729 \ %{__awk} -i inplace -v INPLACE_SUFFIX=.deps '/^\\\[((.+\\\.)?((dev|build)-)?dependencies|features)/{f=1;next} /^\\\[/{f=0}; !f' Cargo.toml \ %{__cargo} package -l | grep -w -E -v 'Cargo.(lock|toml.orig)' | xargs -d '\\\n' %{__cp} --parents -a -t $REG_DIR \ %{__mv} Cargo.toml{.deps,} \ %{__cp} -a Cargo.toml $REG_DIR/Cargo.toml \ %{__rm} -f $REG_DIR/Cargo.toml.deps \ echo '{"files":{},"package":""}' > $REG_DIR/.cargo-checksum.json \ fi \ %if ! %__cargo_skip_build \ if %__cargo_is_bin; then \ %{shrink:\ %{__cargo} install \ %{__cargo_common_opts} \ --no-track \ --path . \ %{__cargo_parse_opts %{-n} %{-a} %{-f:-f%{-f*}}} \ %* \ } \ fi \ %endif \ ) %__cargo_feature_from_name(n:) %{lua: local name = rpm.expand("%{-n*}") local feature = string.match(name, "^[^+]+%+(.+)-devel$") if feature == nil then print() else print(feature) end }