%global bootstrap_rust 1.82.0 %global bootstrap_cargo 1.82.0 %global bootstrap_channel 1.82.0 %global bootstrap_date 2024-10-17 %global bootstrap_arches x86_64 aarch64 riscv64 loongarch64 %bcond_with llvm_static %ifarch x86_64 aarch64 riscv64 loongarch64 %bcond_with bundled_llvm %else %bcond_without bundled_llvm %endif %bcond_without bundled_libgit2 %bcond_with disabled_libssh2 %bcond_without lldb # disable rust-lld (enabled by default on x86 since 1.80.0 via pull/124129) for # building with system llvm (17.0.6) # https://github.com/rust-lang/rust/issues/131291 %ifarch %{ix86} x86_64 %bcond_with rust_lld %endif %ifnarch riscv64 loongarch64 %bcond_without musl_target %endif Name: rust Version: 1.82.0 Release: 17 Summary: The Rust Programming Language License: Apache-2.0 OR MIT URL: https://www.rust-lang.org ExclusiveArch: aarch64 Source0: https://static.rust-lang.org/dist/rustc-%{version}-src.tar.xz Source1: https://static.rust-lang.org/dist/rustc-%{version}-src.tar.xz.asc Source2: https://static.rust-lang.org/rust-key.gpg.ascii # SOURCE3-5: use local mirror for speed up Source3: cargo-config Source4: cargo-config.sh Source5: cargo-config.csh Patch0000: rustc-1.82.0-disable-libssh2.patch # By default, rust tries to use "rust-lld" as a linker for some targets. Patch0001: 0001-Use-lld-provided-by-system.patch # Set a substitute-path in rust-gdb for standard library sources. Patch0002: rustc-1.70.0-rust-gdb-substitute-path.patch Patch0003: 0001-add-support-for-ppc64le.patch # https://github.com/rust-lang/rust/pull/130034 (from 1.83) Patch0004: 0001-Fix-enabling-wasm-component-ld-to-match-other-tools.patch Patch0005: 0001-fix-build-error-for-loongarch64.patch Patch0006: 0001-add-support-for-sw64.patch Patch0007: 0001-compiler-rt-Support-HARDCODE_NO_LSE-to-disable-lse-a.patch %{lua: function rust_triple(arch) local abi = "gnu" if arch == "armv7hl" then arch = "armv7" abi = "gnueabihf" elseif arch == "ppc64" then arch = "powerpc64" elseif arch == "ppc64le" then arch = "powerpc64le" elseif arch == "riscv64" then arch = "riscv64gc" elseif arch == "loongarch64" then arch = "loongarch64" end return arch.."-unknown-linux-"..abi end} %{lua: function rust_musl_triple(arch) local abi = "musl" if arch == "riscv64" then arch = "riscv64gc" end return arch.."-unknown-linux-"..abi end} %{lua: function rust_musl_root(arch) if arch == "riscv64" then arch = "riscv64gc" end return "--musl-root-"..arch end} %global rust_triple %{lua: print(rust_triple(rpm.expand("%{_target_cpu}")))} %global rust_musl_triple %{lua: print(rust_musl_triple(rpm.expand("%{_target_cpu}")))} %global rust_musl_root %{lua: print(rust_musl_root(rpm.expand("%{_target_cpu}")))} %if %defined bootstrap_arches %{lua: do local bootstrap_arches = {} for arch in string.gmatch(rpm.expand("%{bootstrap_arches}"), "%S+") do table.insert(bootstrap_arches, arch) end local base = rpm.expand("https://static.rust-lang.org/dist/%{bootstrap_date}" .."/rust-%{bootstrap_channel}") local target_arch = rpm.expand("%{_target_cpu}") for i, arch in ipairs(bootstrap_arches) do print(string.format("Source%d: %s-%s.tar.xz\n", i+5, base, rust_triple(arch))) if arch == target_arch then rpm.define("bootstrap_source "..i+5) end end end} %endif %ifarch %{bootstrap_arches} %global bootstrap_root rust-%{bootstrap_channel}-%{rust_triple} %global local_rust_root %{_builddir}/%{bootstrap_root}/usr Provides: bundled(%{name}-bootstrap) = %{bootstrap_rust} %else BuildRequires: cargo >= %{bootstrap_cargo} BuildRequires: (%{name} >= %{bootstrap_rust} with %{name} <= %{version}) %global local_rust_root %{_prefix} %endif %if %{with musl_target} BuildRequires: make gcc gcc-c++ ncurses-devel curl curl-devel musl-libc-static musl-gcc pkgconfig(libcurl) pkgconfig(liblzma) %else BuildRequires: make gcc gcc-c++ ncurses-devel curl curl-devel pkgconfig(libcurl) pkgconfig(liblzma) %endif BuildRequires: pkgconfig(openssl) pkgconfig(zlib) pkgconfig(libssh2) >= 1.6.0 gnupg2 wget %global python python3 BuildRequires: %{python} %if %with bundled_llvm BuildRequires: cmake3 >= 3.13.4 Provides: bundled(llvm) = 19.1.1 %else BuildRequires: cmake >= 2.8.11 %if %defined llvm %global llvm_root %{_libdir}/%{llvm} %else # default llvm is decent enough on riscv64 %ifarch x86_64 aarch64 riscv64 loongarch64 %global llvm llvm-toolset-18-llvm %global llvm_root /opt/%{_vendor}/llvm-toolset-18/root%{_prefix} %global clang_maj_ver 18 %else %global llvm llvm %global llvm_root %{_prefix} %global clang_maj_ver 17 %endif %endif # Minimum external LLVM for rust 1.82 BuildRequires: %{llvm} >= 17.0.0 BuildRequires: %{llvm}-devel >= 17.0.0 %if %with llvm_static BuildRequires: %{llvm}-static libffi-devel %endif %endif BuildRequires: procps-ng BuildRequires: ninja-build %ifarch x86_64 aarch64 riscv64 loongarch64 BuildRequires: llvm-toolset-18-compiler-rt BuildRequires: llvm-toolset-18-clang %else BuildRequires: compiler-rt BuildRequires: clang %endif Provides: rustc = %{version}-%{release} Provides: rustc%{?_isa} = %{version}-%{release} Requires: %{name}-std-static%{?_isa} = %{version}-%{release} Requires: /usr/bin/cc %global _privatelibs lib(.*-[[:xdigit:]]{16}*|rustc.*)[.]so.* %global __provides_exclude ^(%{_privatelibs})$ %global __requires_exclude ^(%{_privatelibs})$ %global __provides_exclude_from ^(%{_docdir}|%{rustlibdir}/src)/.*$ %global __requires_exclude_from ^(%{_docdir}|%{rustlibdir}/src)/.*$ %global _find_debuginfo_opts --keep-section .rustc %global rustflags -Clink-arg=-Wl,-z,relro,-z,now %if %{without bundled_llvm} %if "%{llvm_root}" == "%{_prefix}" || 0%{?scl:1} %global llvm_has_filecheck 1 %endif %endif %global musl_root %{_prefix}/musl # The 'analysis' component is removed since Rust 1.69.0 # ref: https://github.com/rust-lang/rust/pull/101841 Obsoletes: %{name}-analysis < 1.69.0~ %description Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety. This package includes the Rust compiler and documentation generator. %prep # gpg check gpg --import %{SOURCE2} gpg --verify %{SOURCE1} %{SOURCE0} %ifarch %{bootstrap_arches} %setup -q -n %{bootstrap_root} -T -b %{bootstrap_source} ./install.sh --components=cargo,rustc,rust-std-%{rust_triple} \ --prefix=%{local_rust_root} --disable-ldconfig test -f '%{local_rust_root}/bin/cargo' test -f '%{local_rust_root}/bin/rustc' %endif %setup -q -n rustc-%{version}-src %if %with disabled_libssh2 %patch -P 0000 -p1 %endif %if "%{python}" != "python3" sed -i.try-python -e '/^try python3 /i try "%{python}" "$@"' ./configure %endif %patch -P 0001 -p1 %patch -P 0002 -p1 %patch -P 0003 -p1 %patch -P 0004 -p1 %patch -P 0005 -p1 %patch -P 0006 -p1 %patch -P 0007 -p1 rm -rf vendor/curl-sys*/curl/ rm -rf vendor/jemalloc-sys/jemalloc/ rm -rf vendor/libffi-sys*/libffi/ rm -rf vendor/libssh2-sys*/libssh2/ rm -rf vendor/libz-sys*/src/zlib{,-ng}/ rm -rf vendor/lzma-sys*/xz-*/ rm -rf vendor/openssl-src*/openssl/ %if %without bundled_libgit2 rm -rf vendor/libgit2-sys*/libgit2/ %endif %if %with disabled_libssh2 rm -rf vendor/libssh2-sys*/ %endif # This only affects the transient rust-installer, but let it use our dynamic xz-libs sed -i.lzma -e '/LZMA_API_STATIC/d' src/bootstrap/src/core/build_steps/tool.rs %if %{without bundled_llvm} && %{with llvm_static} sed -i.ffi -e '$a #[link(name = "ffi")] extern {}' \ src/librustc_llvm/lib.rs %endif find vendor -name .cargo-checksum.json \ -exec sed -i.uncheck -e 's/"files":{[^}]*}/"files":{ }/' '{}' '+' find -name '*.rs' -type f -perm /111 -exec chmod -v -x '{}' '+' %global rust_env RUSTFLAGS="%{rustflags}" %if 0%{?cmake_path:1} %global rust_env %{rust_env} PATH="%{cmake_path}:$PATH" %endif %if %without bundled_libgit2 %global rust_env %{rust_env} LIBGIT2_SYS_USE_PKG_CONFIG=1 %endif %if %without disabled_libssh2 %global rust_env %{rust_env} LIBSSH2_SYS_USE_PKG_CONFIG=1 %endif %build export %{rust_env} %global common_libdir %{_prefix}/lib %global rustlibdir %{common_libdir}/rustlib %ifarch %{arm} %{ix86} s390x %define enable_debuginfo --debuginfo-level=0 --debuginfo-level-std=2 %else %define enable_debuginfo --debuginfo-level=1 %endif %ifnarch %{power64} %define codegen_units_std --set rust.codegen-units-std=1 %endif ncpus=$(/usr/bin/getconf _NPROCESSORS_ONLN) %if %{with bundled_llvm} max_cpus=$(( ($(free -g | awk '/^Mem:/{print $2}') + 1) / 4 )) %else max_cpus=$(( ($(free -g | awk '/^Mem:/{print $2}') + 1) / 2 )) %endif if [ "$max_cpus" -ge 1 -a "$max_cpus" -lt "$ncpus" ]; then ncpus="$max_cpus" fi # Find the compiler-rt library for the Rust profiler_builtins crate. # But there are two versions in openEuler. Why? # We don't have macros.clang so we need clang version here # This is for avoiding rpm syntax error %ifarch ppc64le %global _arch powerpc64le %endif %if 0%{?clang_maj_ver} >= 17 # This is the new one, used on openEuler 24.03 LTS or later %define profiler %(echo %{llvm_root}/%{_lib}/clang/%{clang_maj_ver}/lib/%{_arch}-%{_vendor}-linux-gnu/libclang_rt.profile.a) %else # This is used before openEuler 23.09 %global clang_full_ver %%(clang --version | awk '/clang version/{print $3}') %define profiler %(echo %{_prefix}/%{_lib}/clang/%{clang_full_ver}/lib/libclang_rt.profile-%{_arch}.a) %endif test -r "%{profiler}" %configure --disable-option-checking \ --docdir=%{_pkgdocdir} \ --libdir=%{common_libdir} \ %{?with_musl_target:%{rust_musl_root}=%{musl_root}} \ --build=%{rust_triple} --host=%{rust_triple} --target=%{rust_triple}%{?with_musl_target:,%{rust_musl_triple}} \ --set target.%{rust_triple}.profiler="%{profiler}" \ %{!?with_rust_lld: --set rust.lld=false} \ --python=%{python} \ --local-rust-root=%{local_rust_root} \ %{!?with_bundled_llvm: --llvm-root=%{llvm_root} \ %{!?llvm_has_filecheck: --disable-codegen-tests} \ %{!?with_llvm_static: --enable-llvm-link-shared } } \ --disable-rpath \ %{enable_debuginfo} \ --enable-extended \ --tools=cargo,clippy,rust-analyzer,rustfmt,src \ --enable-vendor \ --enable-verbose-tests \ %{?codegen_units_std} \ --release-channel=stable %ifarch loongarch64 %{python} ./x.py build -j "$((($ncpus + 3) / 4))" --stage 2 %else CFLAGS_aarch64_unknown_linux_gnu="-DHARDCODED_NO_LSE" %{python} ./x.py build -j "$ncpus" --stage 2 %endif CFLAGS_aarch64_unknown_linux_gnu="-DHARDCODED_NO_LSE" %{python} ./x.py doc --stage 2 %install export %{rust_env} CFLAGS_aarch64_unknown_linux_gnu="-DHARDCODED_NO_LSE" DESTDIR=%{buildroot} %{python} ./x.py install # Some of the components duplicate-install binaries, leaving backups we don't want rm -f %{buildroot}%{_bindir}/*.old %if "%{_libdir}" != "%{common_libdir}" mkdir -p %{buildroot}%{_libdir} find %{buildroot}%{common_libdir} -maxdepth 1 -type f -name '*.so' \ -exec mv -v -t %{buildroot}%{_libdir} '{}' '+' %endif find %{buildroot}%{_libdir} -maxdepth 1 -type f -name '*.so' \ -exec chmod -v +x '{}' '+' (cd "%{buildroot}%{rustlibdir}/%{rust_triple}/lib" && find ../../../../%{_lib} -maxdepth 1 -name '*.so' | while read lib; do if [ -f "${lib##*/}" ]; then # make sure they're actually identical! cmp "$lib" "${lib##*/}" ln -v -f -s -t . "$lib" fi done) find %{buildroot}%{rustlibdir} -maxdepth 1 -type f -exec rm -v '{}' '+' find %{buildroot}%{rustlibdir} -type f -name '*.orig' -exec rm -v '{}' '+' find %{buildroot}%{rustlibdir}/src -type f -name '*.py' -exec rm -v '{}' '+' rm -f %{buildroot}%{_pkgdocdir}/README.md rm -f %{buildroot}%{_pkgdocdir}/COPYRIGHT rm -f %{buildroot}%{_pkgdocdir}/LICENSE rm -f %{buildroot}%{_pkgdocdir}/LICENSE-APACHE rm -f %{buildroot}%{_pkgdocdir}/LICENSE-MIT rm -f %{buildroot}%{_pkgdocdir}/LICENSE-THIRD-PARTY rm -f %{buildroot}%{_pkgdocdir}/*.old find %{buildroot}%{_pkgdocdir}/html -empty -delete find %{buildroot}%{_pkgdocdir}/html -type f -exec chmod -x '{}' '+' mkdir -p %{buildroot}%{_datadir}/cargo/registry mkdir -p %{buildroot}%{_docdir}/cargo ln -sT ../rust/html/cargo/ %{buildroot}%{_docdir}/cargo/html # install default config for cargo mirror install -m 0644 -D -p %{SOURCE3} %{buildroot}%{_sysconfdir}/skel/.cargo/config.toml install -m 0644 -D -p %{SOURCE4} %{buildroot}%{_sysconfdir}/profile.d/cargo-config.sh install -m 0644 -D -p %{SOURCE5} %{buildroot}%{_sysconfdir}/profile.d/cargo-config.csh %if %without lldb rm -f %{buildroot}%{_bindir}/rust-lldb rm -f %{buildroot}%{rustlibdir}/etc/lldb_* %endif rm -f %{buildroot}%{rustlibdir}/%{rust_triple}/bin/rust-ll* %check export %{rust_env} CFLAGS_aarch64_unknown_linux_gnu="-DHARDCODED_NO_LSE" %{python} ./x.py test --no-fail-fast --stage 2 || : %ifarch aarch64 # https://github.com/rust-lang/rust/issues/123733 %define cargo_test_skip --test-args "--skip panic_abort_doc_tests" %endif CFLAGS_aarch64_unknown_linux_gnu="-DHARDCODED_NO_LSE" %{python} ./x.py test --no-fail-fast --stage 2 cargo %{?cargo_test_skip} || : CFLAGS_aarch64_unknown_linux_gnu="-DHARDCODED_NO_LSE" %{python} ./x.py test --no-fail-fast --stage 2 clippy || : CFLAGS_aarch64_unknown_linux_gnu="-DHARDCODED_NO_LSE" %{python} ./x.py test --no-fail-fast --stage 2 rust-analyzer || : CFLAGS_aarch64_unknown_linux_gnu="-DHARDCODED_NO_LSE" %{python} ./x.py test --no-fail-fast --stage 2 rustfmt || : %ldconfig_scriptlets %files nolse %license COPYRIGHT LICENSE-APACHE LICENSE-MIT %license %{_pkgdocdir}/html/*.txt %doc README.md %{_bindir}/rustc %{_bindir}/rustdoc %{_libdir}/*.so %dir %{rustlibdir} %dir %{rustlibdir}/%{rust_triple} %dir %{rustlibdir}/%{rust_triple}/lib %{_libexecdir}/rust-analyzer-proc-macro-srv %{rustlibdir}/%{rust_triple}/lib/*.so %if %{with musl_target} %dir %{rustlibdir}/%{rust_musl_triple} %dir %{rustlibdir}/%{rust_musl_triple}/lib %endif %changelog * Sat Jan 17 2026 NEARU - 1.82.0-17 - Support HARDCODED_NO_LSE to disable lse atomic