# Built from a vendored crate tree (Source1) because elan is a leaf # application (a fork of rustup) with ~275 transitive crates, none of which # are packaged as rust-* in Fedora. This follows Fedora's "Packaging Rust # applications with bundled dependencies" guidelines. # Rust source files legitimately begin with inner attributes (#![...]), which # brp-mangle-shebangs misreads as shebangs. The only .rs files we ship are the # vendored debug sources, so exclude them from shebang mangling. %global __brp_mangle_shebangs_exclude_from \.rs$ Name: elan Version: 4.2.3 Release: 3%{?dist} Summary: Manage multiple Lean installations with ease # elan itself is "MIT OR Apache-2.0". The binary statically links ~275 # bundled crates whose combined license must be enumerated before a Fedora # submission (run `cargo_license` / add bundled(crate(...)) Provides). For # this COPR build we record elan's own license. # TODO(Fedora): expand License to the full combined set + add bundled Provides. # elan's own code is "MIT OR Apache-2.0". The binary statically links 270 # vendored crates, so the effective licence is the combination. Computed from # the vendor tree rather than by hand: every crate has a licence field, none # missing. SPDX disjunctions are a CHOICE, not an obligation -- reducing each # OR-group to its most permissive term and keeping every AND term gives the # seven below. Notably r-efi offers "MIT OR Apache-2.0 OR LGPL-2.1-or-later"; # taking MIT declines the copyleft, so LGPL-2.1-or-later is NOT an obligation # here and must not appear in this field. Also declined via OR: 0BSD, # Apache-2.0 WITH LLVM-exception, BSD-2-Clause, CC0-1.0, ISC, Unlicense, Zlib. # Unicode-3.0 and Unicode-DFS-2016 are real and required (unicode-ident ANDs # the latter); Fedora treats Unicode-3.0 as a distinct allowed licence. License: MIT AND MIT-0 AND Apache-2.0 AND BSD-3-Clause AND BSL-1.0 AND Unicode-3.0 AND Unicode-DFS-2016 URL: https://github.com/leanprover/elan Source0: %{url}/archive/refs/tags/v%{version}/%{name}-%{version}.tar.gz %global copr_lookaside https://copr-dist-git.fedorainfracloud.org/repo/pkgs/mhough/neurofedora/%{name} # Same as leangz: the cargo-vendor bundle is generated locally, not shipped by # upstream, so it must be referenced from the COPR lookaside by URL rather than # by bare filename. Regenerate + re-upload on a version bump. Source1: %{copr_lookaside}/%{name}-%{version}-vendor.tar.xz/md5/c20cf0d7af678d3c83c3eed23dce8cfb/%{name}-%{version}-vendor.tar.xz ExclusiveArch: %{rust_arches} BuildRequires: cargo-rpm-macros >= 24 # elan links system OpenSSL and libcurl rather than bundling them (Fedora # policy; bundled OpenSSL also needs perl in the buildroot). The two crates # that hardcode openssl's "vendored" feature are patched in %prep. # WAS BLOCKED on f45 and rawhide by OpenSSL 4: the old bundle vendored # openssl-sys 0.9.106, whose build script rejects anything past OpenSSL 3, and # f45/rawhide ship openssl-devel 4.0.2 (builds 11039055, 11039056, 11018776, # 11039286, 11039836 -- five failures, one cause, every chroot but f44). # Resolved 2026-09-27 by regenerating the vendor bundle: openssl 0.10.70 -> # 0.10.81 and openssl-sys 0.9.106 -> 0.9.117, both clearing the real floors # (OpenSSL 4 support landed in openssl-sys 0.9.114 / openssl 0.10.78, not the # 0.9.117 this spec previously cited -- 0.9.117 is merely where Fedora sits). # openssl-src drops out entirely once the "vendored" feature is stripped below. BuildRequires: openssl-devel BuildRequires: pkgconfig(openssl) BuildRequires: libcurl-devel BuildRequires: pkgconfig(libcurl) # Generate a man page from --help (upstream ships none). BuildRequires: help2man # Bundled crates, generated from the vendor tree with the name/version split # asserted -- a crate whose directory name fails to parse aborts generation # rather than silently vanishing from this list. Licence and CVE tracking both # depend on it. Regenerate whenever Source1 changes. Provides: bundled(crate(addr2line)) = 0.24.2 Provides: bundled(crate(adler2)) = 2.0.0 Provides: bundled(crate(aes)) = 0.8.4 Provides: bundled(crate(aho-corasick)) = 1.1.3 Provides: bundled(crate(aligned)) = 0.4.2 Provides: bundled(crate(ansi_term)) = 0.12.1 Provides: bundled(crate(arbitrary)) = 1.4.1 Provides: bundled(crate(as-slice)) = 0.2.1 Provides: bundled(crate(atty)) = 0.2.14 Provides: bundled(crate(autocfg)) = 1.4.0 Provides: bundled(crate(backtrace)) = 0.3.74 Provides: bundled(crate(base64)) = 0.21.7 Provides: bundled(crate(bitflags)) = 1.3.2 Provides: bundled(crate(bitflags)) = 2.6.0 Provides: bundled(crate(block-buffer)) = 0.10.4 Provides: bundled(crate(bumpalo)) = 3.16.0 Provides: bundled(crate(byteorder)) = 1.5.0 Provides: bundled(crate(bytes)) = 1.8.0 Provides: bundled(crate(bzip2)) = 0.5.2 Provides: bundled(crate(bzip2-sys)) = 0.1.13+1.0.8 Provides: bundled(crate(cc)) = 1.2.0 Provides: bundled(crate(cfg-if)) = 1.0.0 Provides: bundled(crate(cfg_aliases)) = 0.2.1 Provides: bundled(crate(cipher)) = 0.4.4 Provides: bundled(crate(clap)) = 2.34.0 Provides: bundled(crate(constant_time_eq)) = 0.3.1 Provides: bundled(crate(core-foundation)) = 0.9.4 Provides: bundled(crate(core-foundation-sys)) = 0.8.7 Provides: bundled(crate(cpufeatures)) = 0.2.15 Provides: bundled(crate(crc)) = 3.2.1 Provides: bundled(crate(crc-catalog)) = 2.4.0 Provides: bundled(crate(crc32fast)) = 1.4.2 Provides: bundled(crate(crossbeam-utils)) = 0.8.21 Provides: bundled(crate(crypto-common)) = 0.1.6 Provides: bundled(crate(curl)) = 0.4.47 Provides: bundled(crate(curl-sys)) = 0.4.78+curl_8.11.0 Provides: bundled(crate(cvt)) = 0.1.2 Provides: bundled(crate(deflate64)) = 0.1.9 Provides: bundled(crate(deranged)) = 0.4.0 Provides: bundled(crate(derive_arbitrary)) = 1.4.1 Provides: bundled(crate(digest)) = 0.10.7 Provides: bundled(crate(dirs)) = 3.0.2 Provides: bundled(crate(dirs-next)) = 2.0.0 Provides: bundled(crate(dirs-sys)) = 0.3.7 Provides: bundled(crate(dirs-sys-next)) = 0.1.2 Provides: bundled(crate(displaydoc)) = 0.2.5 Provides: bundled(crate(either)) = 1.13.0 Provides: bundled(crate(encoding_rs)) = 0.8.35 Provides: bundled(crate(env_proxy)) = 0.4.1 Provides: bundled(crate(equivalent)) = 1.0.1 Provides: bundled(crate(errno)) = 0.3.9 Provides: bundled(crate(error-chain)) = 0.12.4 Provides: bundled(crate(fastrand)) = 2.2.0 Provides: bundled(crate(filetime)) = 0.2.25 Provides: bundled(crate(flate2)) = 1.0.34 Provides: bundled(crate(fnv)) = 1.0.7 Provides: bundled(crate(foreign-types)) = 0.3.2 Provides: bundled(crate(foreign-types-shared)) = 0.1.1 Provides: bundled(crate(form_urlencoded)) = 1.2.1 Provides: bundled(crate(fs_at)) = 0.2.1 Provides: bundled(crate(fslock)) = 0.2.1 Provides: bundled(crate(futures)) = 0.3.31 Provides: bundled(crate(futures-channel)) = 0.3.31 Provides: bundled(crate(futures-core)) = 0.3.31 Provides: bundled(crate(futures-executor)) = 0.3.31 Provides: bundled(crate(futures-io)) = 0.3.31 Provides: bundled(crate(futures-macro)) = 0.3.31 Provides: bundled(crate(futures-sink)) = 0.3.31 Provides: bundled(crate(futures-task)) = 0.3.31 Provides: bundled(crate(futures-util)) = 0.3.31 Provides: bundled(crate(gcc)) = 0.3.55 Provides: bundled(crate(generic-array)) = 0.14.7 Provides: bundled(crate(getrandom)) = 0.2.15 Provides: bundled(crate(getrandom)) = 0.3.2 Provides: bundled(crate(gimli)) = 0.31.1 Provides: bundled(crate(h2)) = 0.3.26 Provides: bundled(crate(hashbrown)) = 0.15.1 Provides: bundled(crate(hermit-abi)) = 0.1.19 Provides: bundled(crate(hermit-abi)) = 0.3.9 Provides: bundled(crate(hmac)) = 0.12.1 Provides: bundled(crate(http)) = 0.2.12 Provides: bundled(crate(http-body)) = 0.4.6 Provides: bundled(crate(httparse)) = 1.9.5 Provides: bundled(crate(httpdate)) = 1.0.3 Provides: bundled(crate(hyper)) = 0.14.31 Provides: bundled(crate(hyper-tls)) = 0.5.0 Provides: bundled(crate(icu_collections)) = 1.5.0 Provides: bundled(crate(icu_locid)) = 1.5.0 Provides: bundled(crate(icu_locid_transform)) = 1.5.0 Provides: bundled(crate(icu_locid_transform_data)) = 1.5.0 Provides: bundled(crate(icu_normalizer)) = 1.5.0 Provides: bundled(crate(icu_normalizer_data)) = 1.5.0 Provides: bundled(crate(icu_properties)) = 1.5.1 Provides: bundled(crate(icu_properties_data)) = 1.5.0 Provides: bundled(crate(icu_provider)) = 1.5.0 Provides: bundled(crate(icu_provider_macros)) = 1.5.0 Provides: bundled(crate(idna)) = 1.0.3 Provides: bundled(crate(idna_adapter)) = 1.2.0 Provides: bundled(crate(indexmap)) = 2.6.0 Provides: bundled(crate(inout)) = 0.1.4 Provides: bundled(crate(ipnet)) = 2.10.1 Provides: bundled(crate(itertools)) = 0.10.5 Provides: bundled(crate(itoa)) = 1.0.11 Provides: bundled(crate(jobserver)) = 0.1.32 Provides: bundled(crate(js-sys)) = 0.3.77 Provides: bundled(crate(json)) = 0.12.4 Provides: bundled(crate(lazy_static)) = 1.5.0 Provides: bundled(crate(libc)) = 0.2.162 Provides: bundled(crate(libredox)) = 0.1.3 Provides: bundled(crate(libz-sys)) = 1.1.20 Provides: bundled(crate(linux-raw-sys)) = 0.4.14 Provides: bundled(crate(litemap)) = 0.7.3 Provides: bundled(crate(lockfree-object-pool)) = 0.1.6 Provides: bundled(crate(log)) = 0.4.22 Provides: bundled(crate(lzma-rs)) = 0.3.0 Provides: bundled(crate(lzma-sys)) = 0.1.20 Provides: bundled(crate(memchr)) = 2.7.4 Provides: bundled(crate(mime)) = 0.3.17 Provides: bundled(crate(miniz_oxide)) = 0.8.0 Provides: bundled(crate(mio)) = 1.0.2 Provides: bundled(crate(native-tls)) = 0.2.12 Provides: bundled(crate(nix)) = 0.29.0 Provides: bundled(crate(normpath)) = 1.3.0 Provides: bundled(crate(num-conv)) = 0.1.0 Provides: bundled(crate(object)) = 0.36.5 Provides: bundled(crate(once_cell)) = 1.20.2 Provides: bundled(crate(openssl)) = 0.10.81 Provides: bundled(crate(openssl-macros)) = 0.1.1 Provides: bundled(crate(openssl-probe)) = 0.1.5 Provides: bundled(crate(openssl-sys)) = 0.9.117 Provides: bundled(crate(pbkdf2)) = 0.12.2 Provides: bundled(crate(percent-encoding)) = 2.3.1 Provides: bundled(crate(pest)) = 2.7.14 Provides: bundled(crate(pin-project-lite)) = 0.2.15 Provides: bundled(crate(pin-utils)) = 0.1.0 Provides: bundled(crate(pkg-config)) = 0.3.31 Provides: bundled(crate(powerfmt)) = 0.2.0 Provides: bundled(crate(ppv-lite86)) = 0.2.20 Provides: bundled(crate(proc-macro2)) = 1.0.89 Provides: bundled(crate(pulldown-cmark)) = 0.13.0 Provides: bundled(crate(quote)) = 1.0.37 Provides: bundled(crate(r-efi)) = 5.2.0 Provides: bundled(crate(rand)) = 0.8.5 Provides: bundled(crate(rand_chacha)) = 0.3.1 Provides: bundled(crate(rand_core)) = 0.6.4 Provides: bundled(crate(redox_syscall)) = 0.5.7 Provides: bundled(crate(redox_users)) = 0.4.6 Provides: bundled(crate(regex)) = 1.11.1 Provides: bundled(crate(regex-automata)) = 0.4.9 Provides: bundled(crate(regex-syntax)) = 0.8.5 Provides: bundled(crate(remove_dir_all)) = 0.8.4 Provides: bundled(crate(reqwest)) = 0.11.27 Provides: bundled(crate(rustc-demangle)) = 0.1.24 Provides: bundled(crate(rustix)) = 0.38.40 Provides: bundled(crate(rustls-pemfile)) = 1.0.4 Provides: bundled(crate(rustversion)) = 1.0.18 Provides: bundled(crate(ryu)) = 1.0.18 Provides: bundled(crate(same-file)) = 1.0.6 Provides: bundled(crate(schannel)) = 0.1.26 Provides: bundled(crate(scopeguard)) = 1.2.0 Provides: bundled(crate(security-framework)) = 2.11.1 Provides: bundled(crate(security-framework-sys)) = 2.12.1 Provides: bundled(crate(semver)) = 0.11.0 Provides: bundled(crate(semver)) = 1.0.23 Provides: bundled(crate(semver-parser)) = 0.10.2 Provides: bundled(crate(serde)) = 1.0.215 Provides: bundled(crate(serde_derive)) = 1.0.215 Provides: bundled(crate(serde_json)) = 1.0.132 Provides: bundled(crate(serde_urlencoded)) = 0.7.1 Provides: bundled(crate(sha1)) = 0.10.6 Provides: bundled(crate(shlex)) = 1.3.0 Provides: bundled(crate(simd-adler32)) = 0.3.7 Provides: bundled(crate(slab)) = 0.4.9 Provides: bundled(crate(smallvec)) = 1.13.2 Provides: bundled(crate(socket2)) = 0.5.7 Provides: bundled(crate(stable_deref_trait)) = 1.2.0 Provides: bundled(crate(strsim)) = 0.8.0 Provides: bundled(crate(subtle)) = 2.4.1 Provides: bundled(crate(syn)) = 2.0.87 Provides: bundled(crate(sync_wrapper)) = 0.1.2 Provides: bundled(crate(synstructure)) = 0.13.1 Provides: bundled(crate(system-configuration)) = 0.5.1 Provides: bundled(crate(system-configuration-sys)) = 0.5.0 Provides: bundled(crate(tar)) = 0.4.43 Provides: bundled(crate(tempfile)) = 3.14.0 Provides: bundled(crate(term)) = 0.7.0 Provides: bundled(crate(textwrap)) = 0.11.0 Provides: bundled(crate(thiserror)) = 1.0.69 Provides: bundled(crate(thiserror-impl)) = 1.0.69 Provides: bundled(crate(time)) = 0.3.41 Provides: bundled(crate(time-core)) = 0.1.4 Provides: bundled(crate(tinystr)) = 0.7.6 Provides: bundled(crate(tokio)) = 1.41.1 Provides: bundled(crate(tokio-native-tls)) = 0.3.1 Provides: bundled(crate(tokio-util)) = 0.7.12 Provides: bundled(crate(toml)) = 0.5.11 Provides: bundled(crate(tower-service)) = 0.3.3 Provides: bundled(crate(tracing)) = 0.1.40 Provides: bundled(crate(tracing-core)) = 0.1.32 Provides: bundled(crate(try-lock)) = 0.2.5 Provides: bundled(crate(typenum)) = 1.17.0 Provides: bundled(crate(ucd-trie)) = 0.1.7 Provides: bundled(crate(unicase)) = 2.8.1 Provides: bundled(crate(unicode-ident)) = 1.0.13 Provides: bundled(crate(unicode-width)) = 0.1.14 Provides: bundled(crate(url)) = 2.5.3 Provides: bundled(crate(utf16_iter)) = 1.0.5 Provides: bundled(crate(utf8_iter)) = 1.0.4 Provides: bundled(crate(vcpkg)) = 0.2.15 Provides: bundled(crate(vec_map)) = 0.8.2 Provides: bundled(crate(version_check)) = 0.9.5 Provides: bundled(crate(wait-timeout)) = 0.2.0 Provides: bundled(crate(want)) = 0.3.1 Provides: bundled(crate(wasi)) = 0.11.0+wasi_snapshot_preview1 Provides: bundled(crate(wasi)) = 0.14.2+wasi_0.2.4 Provides: bundled(crate(wasm-bindgen)) = 0.2.100 Provides: bundled(crate(wasm-bindgen-backend)) = 0.2.100 Provides: bundled(crate(wasm-bindgen-futures)) = 0.4.45 Provides: bundled(crate(wasm-bindgen-macro)) = 0.2.100 Provides: bundled(crate(wasm-bindgen-macro-support)) = 0.2.100 Provides: bundled(crate(wasm-bindgen-shared)) = 0.2.100 Provides: bundled(crate(web-sys)) = 0.3.72 Provides: bundled(crate(winapi)) = 0.3.9 Provides: bundled(crate(winapi-i686-pc-windows-gnu)) = 0.4.0 Provides: bundled(crate(winapi-util)) = 0.1.9 Provides: bundled(crate(winapi-x86_64-pc-windows-gnu)) = 0.4.0 Provides: bundled(crate(windows-sys)) = 0.48.0 Provides: bundled(crate(windows-sys)) = 0.52.0 Provides: bundled(crate(windows-sys)) = 0.59.0 Provides: bundled(crate(windows-targets)) = 0.48.5 Provides: bundled(crate(windows-targets)) = 0.52.6 Provides: bundled(crate(windows_aarch64_gnullvm)) = 0.48.5 Provides: bundled(crate(windows_aarch64_gnullvm)) = 0.52.6 Provides: bundled(crate(windows_aarch64_msvc)) = 0.48.5 Provides: bundled(crate(windows_aarch64_msvc)) = 0.52.6 Provides: bundled(crate(windows_i686_gnu)) = 0.48.5 Provides: bundled(crate(windows_i686_gnu)) = 0.52.6 Provides: bundled(crate(windows_i686_gnullvm)) = 0.52.6 Provides: bundled(crate(windows_i686_msvc)) = 0.48.5 Provides: bundled(crate(windows_i686_msvc)) = 0.52.6 Provides: bundled(crate(windows_x86_64_gnu)) = 0.48.5 Provides: bundled(crate(windows_x86_64_gnu)) = 0.52.6 Provides: bundled(crate(windows_x86_64_gnullvm)) = 0.48.5 Provides: bundled(crate(windows_x86_64_gnullvm)) = 0.52.6 Provides: bundled(crate(windows_x86_64_msvc)) = 0.48.5 Provides: bundled(crate(windows_x86_64_msvc)) = 0.52.6 Provides: bundled(crate(winreg)) = 0.50.0 Provides: bundled(crate(winreg)) = 0.8.0 Provides: bundled(crate(wit-bindgen-rt)) = 0.39.0 Provides: bundled(crate(write16)) = 1.0.0 Provides: bundled(crate(writeable)) = 0.5.5 Provides: bundled(crate(xattr)) = 1.3.1 Provides: bundled(crate(xz2)) = 0.1.7 Provides: bundled(crate(yoke)) = 0.7.4 Provides: bundled(crate(yoke-derive)) = 0.7.4 Provides: bundled(crate(zerocopy)) = 0.7.35 Provides: bundled(crate(zerocopy-derive)) = 0.7.35 Provides: bundled(crate(zerofrom)) = 0.1.4 Provides: bundled(crate(zerofrom-derive)) = 0.1.4 Provides: bundled(crate(zeroize)) = 1.8.1 Provides: bundled(crate(zeroize_derive)) = 1.4.2 Provides: bundled(crate(zerovec)) = 0.10.4 Provides: bundled(crate(zerovec-derive)) = 0.10.3 Provides: bundled(crate(zip)) = 2.6.1 Provides: bundled(crate(zopfli)) = 0.8.1 Provides: bundled(crate(zstd)) = 0.12.4 Provides: bundled(crate(zstd)) = 0.13.3 Provides: bundled(crate(zstd-safe)) = 6.0.6 Provides: bundled(crate(zstd-safe)) = 7.2.4 Provides: bundled(crate(zstd-sys)) = 2.0.15+zstd.1.5.7 %global _description %{expand: elan is a small tool for managing your installations of the Lean theorem prover. It places lean and lake binaries in your PATH that automatically select and, if necessary, download the Lean toolchain described in a project's lean-toolchain file. Toolchains can also be installed, selected, run and removed manually. elan is a fork of rustup adapted for Lean.} %description %_description %prep %autosetup -n %{name}-%{version} -p1 # Drop the hardcoded "vendored" feature on the openssl crate so we link the # system OpenSSL instead of compiling a bundled copy from source. sed -i 's/features = \["vendored"\], //' src/download/Cargo.toml sed -i 's/, features = \["vendored"\]//' src/elan-utils/Cargo.toml # Unpack the vendored crate tree alongside the sources and point cargo at it. tar -xf %{SOURCE1} # Drop upstream's Cargo.lock. It pins openssl 0.10.70, but the vendor bundle is # regenerated at newer versions (0.10.81 / openssl-sys 0.9.117) to clear the # OpenSSL 4 floor, so the two disagree and cargo dies in ~12 s with # error: failed to select a version for the requirement `openssl = "^0.10"` # (locked to 0.10.70) # %%cargo_prep removes Cargo.lock ONLY in its non-vendor branch -- the # `%{__rm} -f Cargo.lock` at macros.cargo:131 sits inside %{!?-v:...} -- so the # -v form deliberately keeps whatever the tarball shipped. Deleting it here is # the macro's own idiom applied to the vendor path, and it is safe because # %%cargo_build passes neither --locked nor --frozen, and the vendored directory # source holds exactly one version of each crate, so resolution is determinate. # # (The two macro names above are written %%%% because rpm expands DEFINED # macros even inside comments, and cargo-rpm-macros defines both in the # buildroot -- %%cargo_build(naf:) ate the following --locked and the build # died in 10 s at "Unknown option - in cargo_build(naf:)". %%prep elsewhere in # this spec is left bare on purpose: it is a section keyword, not a defined # macro, so rpm leaves it alone and escaping it would corrupt the text. # rpmspec on a host without cargo-rpm-macros cannot catch this -- the check # has to run where the macros are.) # # NOT transferable to leangz: that spec runs `cargo build --offline --locked` # by hand, where the lockfile is load-bearing by design and deleting it breaks # the build. Two Rust idioms in this tree with opposite correct treatments. rm -f Cargo.lock %cargo_prep -v vendor %build %cargo_build %install %cargo_install # Upstream builds a single binary named "elan-init" (rustup style). Ship it # under the canonical "elan" name and provide "elan-init" as a symlink so the # documented one-time `elan-init` setup still works. mv %{buildroot}%{_bindir}/elan-init %{buildroot}%{_bindir}/%{name} ln -s %{name} %{buildroot}%{_bindir}/elan-init # Shell completions, generated by the freshly built binary. install -d %{buildroot}%{_datadir}/bash-completion/completions install -d %{buildroot}%{_datadir}/zsh/site-functions install -d %{buildroot}%{_datadir}/fish/vendor_completions.d %{buildroot}%{_bindir}/%{name} completions bash > %{buildroot}%{_datadir}/bash-completion/completions/%{name} || : %{buildroot}%{_bindir}/%{name} completions zsh > %{buildroot}%{_datadir}/zsh/site-functions/_%{name} || : %{buildroot}%{_bindir}/%{name} completions fish > %{buildroot}%{_datadir}/fish/vendor_completions.d/%{name}.fish || : # Man page, generated from the binary's --help (upstream ships none). help2man --no-info --section 1 \ --name 'manage multiple Lean toolchain installations' \ %{buildroot}%{_bindir}/%{name} > %{name}.1 install -Dpm0644 %{name}.1 %{buildroot}%{_mandir}/man1/%{name}.1 ln -s %{name}.1 %{buildroot}%{_mandir}/man1/elan-init.1 %files %license LICENSE LICENSE-APACHE LICENSE-MIT %doc README.md CHANGELOG.md %{_bindir}/%{name} %{_bindir}/elan-init %{_datadir}/bash-completion/completions/%{name} %{_datadir}/zsh/site-functions/_%{name} %{_datadir}/fish/vendor_completions.d/%{name}.fish %{_mandir}/man1/%{name}.1* %{_mandir}/man1/elan-init.1* %changelog * Sun Sep 27 2026 Morgan Hough - 4.2.3-3 - Regenerated vendor bundle clears the OpenSSL 4 floor: openssl 0.10.70 -> 0.10.81, openssl-sys 0.9.106 -> 0.9.117, openssl-src dropped entirely once the "vendored" feature is stripped. Bundle built by fedora-framework in a fedora-44-x86_64 mock root (cargo 1.98.1, rustc 1.98.1), md5 c20cf0d7af678d3c83c3eed23dce8cfb, 29337220 bytes, 19207 entries, 270 crates each with .cargo-checksum.json. Independently re-measured here after fetching from the lookaside; all nine fields agreed. - Delete upstream's Cargo.lock in %%prep. It pins openssl 0.10.70 and %%cargo_prep removes the lockfile only in its non-vendor branch, so the -v form kept a lockfile the bundle could no longer satisfy. Not transferable to leangz, which builds --locked by hand. - Enumerate all 270 bundled crates as Provides: bundled(crate(NAME)) = VERSION and expand License from the vendor tree, closing a TODO that predates this spec's first build. SPDX disjunctions reduced to their most permissive term, so LGPL-2.1-or-later (offered by r-efi alongside MIT) is correctly absent. Crate versions carrying SemVer build metadata with hyphens are translated to underscores; rpm rejects '-' in a version (wasi 0.11.0+wasi-snapshot-preview1). * Sat Sep 12 2026 Morgan Hough - 4.2.3-1 - Reconcile git spec to shipped 4.2.3 (build 10755681, f44) to clear version-drift * Mon Jun 22 2026 Morgan Hough - 4.2.1-1 - Initial package (Lean version manager), built from vendored crates