# https://src.fedoraproject.org/rpms/rust # ALL Rust libraries are private, because they don't keep an ABI. %define _privatelibs lib(.*-[[:xdigit:]]{16}*|rustc.*)[.]so.* %define __provides_exclude ^(%{_privatelibs})$ %define __requires_exclude ^(%{_privatelibs})$ %define __provides_exclude_from ^(%{_docdir}|%{rustlibdir}/src)/.*$ %define __requires_exclude_from ^(%{_docdir}|%{rustlibdir}/src)/.*$ %define debug_package %{nil} %define _disable_ld_no_undefined 1 # To avoid undefined symbols %define _find_debuginfo_opts -g %define llvm_ver 17 %define llvm_root /opt/llvm%{llvm_ver} # We're going to override --libdir when configuring to get rustlib into a # common path, but we'll fix the shared libraries during install. %define rustlibdir /opt/llvm%{llvm_ver}/%{_lib} # Only x86_64 and i686 are Tier 1 platforms at this time. # https://doc.rust-lang.org/nightly/rustc/platform-support.html %define rust_arches x86_64 %{ix86} aarch64 # To bootstrap from scratch, set the channel and date from src/stage0.txt # e.g. 1.10.0 wants rustc: 1.9.0-2016-05-24 # or nightly wants some beta-YYYY-MM-DD # Note that cargo matches the program version here, not its crate version. %define bootstrap_rust 1.80.0 %define bootstrap_cargo 1.80.0 %define bootstrap_date 2024-02-08 %define _libexecdir %{_prefix}/libexec %bcond_without bootstrap %if %{without bootstrap} %define bootstrap_arches %{nil} %else %define bootstrap_arches %{rust_arches} %endif # Using llvm-static may be helpful as an opt-in, e.g. to aid LLVM rebases. %bcond_without llvm_static # LLDB only works on some architectures # LLDB isn't available everywhere... %bcond_without lldb %ifarch x86_64 %define rust_triple x86_64-unknown-linux-gnu %endif %ifarch %{ix86} %define rust_triple i686-unknown-linux-gnu %endif %ifarch aarch64 %define rust_triple aarch64-unknown-linux-gnu %endif %ifarch %{bootstrap_arches} %define bootstrap_root rust-%{bootstrap_rust}-%{rust_triple} %define local_rust_root %{_builddir}/%{bootstrap_root}/usr %else %define local_rust_root %{_prefix} %endif %bcond_without clang Summary: The Rust Programming Language Name: rust Version: 1.83.0 Release: 1 License: (ASL 2.0 or MIT) and (BSD and MIT) Group: Development/Rust # ^ written as: (rust itself) and (bundled libraries) URL: https://www.rust-lang.org Source0: https://static.rust-lang.org/dist/rustc-%{version}-src.tar.xz # For bootstrap #Source1: https://static.rust-lang.org/dist/rust-%{bootstrap_rust}-x86_64-unknown-linux-gnu.tar.xz #Source2: https://static.rust-lang.org/dist/rust-%{bootstrap_rust}-i686-unknown-linux-gnu.tar.xz #Source3: https://static.rust-lang.org/dist/rust-%{bootstrap_rust}-aarch64-unknown-linux-gnu.tar.xz Source10: rust.rpmlintrc BuildRequires: ncurses-devel BuildRequires: curl BuildRequires: pkgconfig(libcurl) BuildRequires: pkgconfig(liblzma) #BuildRequires: pkgconfig(openssl) #BuildRequires: openssl-devel BuildRequires: pkgconfig(openssl3.3) BuildRequires: pkgconfig(zlib) # needs libssh2_userauth_publickey_frommemory BuildRequires: pkgconfig(libssh2) >= 1.6.0 BuildRequires: pkgconfig(python3) BuildRequires: python38-devel BuildRequires: cmake >= 2.8.11 BuildRequires: ninja BuildRequires: stdc++-gcc10-devel #if %{with clang} #BuildRequires: clang #endif BuildRequires: llvm%{llvm_ver} %if %{with llvm_static} BuildRequires: pkgconfig(libffi) %endif # make check needs "ps" for src/test/run-pass/wait-forked-but-failed-child.rs BuildRequires: procps-ng # debuginfo-gdb tests need gdb BuildRequires: gdb %if %{without bootstrap} BuildRequires: cargo >= %{bootstrap_cargo} BuildRequires: %{name} >= %{bootstrap_rust} #Conflicts: %%{name} > %%{version} %endif # Virtual provides for folks who attempt "dnf install rustc" Provides: rustc = %{version}-%{release} # Always require our exact standard library Requires: %{name}-std-static = %{version}-%{release} %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. %files %doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT %{_bindir}/rustc %{_bindir}/rustdoc %{_libdir}/*.so %{_mandir}/man1/rustc.1* %{_mandir}/man1/rustdoc.1* %dir %{rustlibdir} %dir %{rustlibdir}/%{rust_triple} %dir %{rustlibdir}/%{rust_triple}/lib %{rustlibdir}/%{rust_triple}/lib/*.so #{rustlibdir}/*/bin/rust-llvm-dwp %{_libexecdir}/cargo-credential-1password #------------------------------------------------------------------------- %package std-static Summary: Standard library for Rust Group: Development/Rust %description std-static This package includes the standard libraries for building applications written in Rust. %files std-static %doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT %dir %{rustlibdir} %dir %{rustlibdir}/%{rust_triple} %dir %{rustlibdir}/%{rust_triple}/lib %{rustlibdir}/%{rust_triple}/lib/*.rlib #------------------------------------------------------------------------- %package debugger-common Summary: Common debugger pretty printers for Rust Group: Development/Rust BuildArch: noarch %description debugger-common This package includes the common functionality for %{name}-gdb and %{name}-lldb. %files debugger-common %doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT %dir %{rustlibdir} %dir %{rustlibdir}/etc %{rustlibdir}/etc/rust_*.py* %if %{mdvver} >= 201910 %{rustlibdir}/etc/__pycache__/rust_*.py* %endif #------------------------------------------------------------------------- %package gdb Summary: GDB pretty printers for Rust Group: Development/Rust Requires: gdb Requires: %{name}-debugger-common = %{version}-%{release} BuildArch: noarch # (akien) Handle moved files between our old Mageia package and this Fedora-based one Conflicts: rust < 1.11.0-3 %description gdb This package includes the rust-gdb script, which allows easier debugging of Rust programs. %files gdb %doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT %{_bindir}/rust-gdb %{rustlibdir}/etc/gdb_* %if %{mdvver} >= 201910 %{rustlibdir}/etc/__pycache__/gdb_* %endif # %%exclude - No work! #%%exclude %%{_bindir}/rust-gdbgui %{_bindir}/rust-gdbgui #------------------------------------------------------------------------- %if %{with lldb} %package lldb Summary: LLDB pretty printers for Rust Group: Development/Rust Requires: lldb %if %{mdvver} > 201610 Requires: python3-lldb %else Requires: python-lldb %endif Requires: %{name}-debugger-common = %{version}-%{release} BuildArch: noarch %description lldb This package includes the rust-lldb script, which allows easier debugging of Rust programs. %files lldb %doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT %{_bindir}/rust-lldb %{rustlibdir}/etc/lldb_* %endif #------------------------------------------------------------------------- %package -n cargo Summary: Rust's package manager and build tool Group: Development/Rust # For tests: BuildRequires: git-core # Cargo is not much use without Rust Requires: rust Obsoletes: cargo < 1.26.0-1 # "cargo vendor" is a builtin command starting with 1.37. The Obsoletes and # Provides are mostly relevant to RHEL, but harmless to have on Fedora/etc. too Obsoletes: cargo-vendor <= 0.1.23 Provides: cargo-vendor = %{version}-%{release} %description -n cargo Cargo is a tool that allows Rust projects to declare their various dependencies and ensure that you'll always get a repeatable build. %files -n cargo %doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT %{_bindir}/cargo %{_mandir}/man1/cargo*.1* %{_sysconfdir}/bash_completion.d/cargo %{_datadir}/zsh/site-functions/_cargo %dir %{_datadir}/cargo %dir %{_datadir}/cargo/registry #------------------------------------------------------------------------- %package -n rustfmt Summary: Tool to find and fix Rust formatting issues Group: Development/Rust Requires: cargo # The component/package was rustfmt-preview until Rust 1.31. Obsoletes: rustfmt-preview < 1.0.0 Provides: rustfmt-preview = %{version}-%{release} %description -n rustfmt A tool for formatting Rust code according to style guidelines. %files -n rustfmt %doc src/tools/rustfmt/{README,CHANGELOG,Configurations}.md %{_bindir}/rustfmt %{_bindir}/cargo-fmt #------------------------------------------------------------------------- %package -n rls Summary: Rust Language Server for IDE integration Group: Development/Rust Requires: rust-analysis # /usr/bin/rls is dynamically linked against internal rustc libs Requires: %{name} = %{version}-%{release} # The component/package was rls-preview until Rust 1.31. Obsoletes: rls-preview < 1.31.6 Provides: rls-preview = %{version}-%{release} %description -n rls The Rust Language Server provides a server that runs in the background, providing IDEs, editors, and other tools with information about Rust programs. It supports functionality such as 'goto definition', symbol search, reformatting, and code completion, and enables renaming and refactorings. %files -n rls %doc src/tools/rls/{README.md,COPYRIGHT,debugging.md} %{_bindir}/rls #------------------------------------------------------------------------- %package -n clippy Summary: Lints to catch common mistakes and improve your Rust code Group: Development/Rust Requires: cargo # /usr/bin/clippy-driver is dynamically linked against internal rustc libs Requires: %{name} = %{version}-%{release} # The component/package was clippy-preview until Rust 1.31. Obsoletes: clippy-preview <= 0.0.212 Provides: clippy-preview = %{version}-%{release} %description -n clippy A collection of lints to catch common mistakes and improve your Rust code. %files -n clippy %doc src/tools/clippy/{README.md,CHANGELOG.md} %doc src/tools/clippy/LICENSE-{APACHE,MIT} %{_bindir}/cargo-clippy %{_bindir}/clippy-driver #------------------------------------------------------------------------- %package src Summary: Sources for the Rust standard library Group: Development/Rust BuildArch: noarch %description src This package includes source files for the Rust standard library. It may be useful as a reference for code completion tools in various editors. %files src %doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT %dir %{rustlibdir} %{rustlibdir}/src #------------------------------------------------------------------------- %package analysis Summary: Compiler analysis data for the Rust standard library Group: Development/Rust Requires: rust-std-static = %{version}-%{release} %description analysis This package contains analysis data files produced with rustc's -Zsave-analysis feature for the Rust standard library. The RLS (Rust Language Server) uses this data to provide information about the Rust standard library. %files analysis %doc README.md COPYRIGHT LICENSE-APACHE LICENSE-MIT %{rustlibdir}/%{rust_triple}/analysis/ #------------------------------------------------------------------------- %prep %ifarch %{bootstrap_arches} #ifarch x86_64 #tar xf %{SOURCE1} #endif #ifarch %{ix86} #tar xf %{SOURCE2} #endif #ifarch aarch64 #tar xf %{SOURCE3} #endif #cd rust-%{bootstrap_rust}-%{rust_triple} #./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' %if %{mdvver} <= 201610 curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs |\ sh -s -- -y --profile default --default-toolchain %{bootstrap_rust} source "$HOME/.cargo/env" %endif %endif %setup -qn rustc-%{version}-src #autopatch -p1 #apply_patches # python3 #sed -i.try-py3 -e '/try python2.7/i try python3 "$@"' ./configure rm -rf src/llvm/ mkdir -p src/llvm-project/libunwind/ # Remove other unused vendored libraries rm -rf vendor/jemalloc-sys/jemalloc/ rm -rf vendor/libz-sys/src/zlib/ rm -rf vendor/libz-sys/src/zlib-ng/ rm -rf vendor/lzma-sys/xz-*/ rm -rf vendor/openssl-src/openssl/ # 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/tool.rs %if %{without bootstrap} %if %{with llvm_static} # Static linking to distro LLVM needs to add -lffi # https://github.com/rust-lang/rust/issues/34486 sed -i.ffi -e '$a #[link(name = "ffi")] extern {}' \ src/librustc_llvm/lib.rs %endif %endif # The configure macro will modify some autoconf-related files, which upsets # cargo when it tries to verify checksums in those files. If we just truncate # that file list, cargo won't have anything to complain about. find vendor -name .cargo-checksum.json \ -exec sed -i.uncheck -e 's/"files":{[^}]*}/"files":{ }/' '{}' '+' # Sometimes Rust sources start with #![...] attributes, and "smart" editors think # it's a shebang and make them executable. Then brp-mangle-shebangs gets upset... find -name '*.rs' -type f -perm /111 -exec chmod -v -x '{}' '+' %build %if %{mdvver} <= 201610 source "$HOME/.cargo/env" %endif %{_libexecdir}/python3.8 -m venv . . ./bin/activate %if %{with clang} #global optflags %{nil} %global optflags %(echo %{optflags} | sed -e 's/-ffat-lto-objects//g' -e 's/-fvar-tracking-assignments//g' -e 's/-Wa,--compress-debug-sections//g') export CC=%{llvm_root}/bin/clang export CXX=%{llvm_root}/bin/clang++ export CPP=%{llvm_root}/bin/clang-cpp export AR=%{llvm_root}/bin/llvm-ar export NM=%{llvm_root}/bin/llvm-nm #export PATH=%{llvm_root}/bin:$PATH export LDFLAGS="-lstdc++-gcc10" export CFLAGS="-I/usr/include/libstdc++-gcc10 -I/usr/include/libstdc++-gcc10/%{_host}" export CXXFLAGS="-I/usr/include/libstdc++-gcc10 -I/usr/include/libstdc++-gcc10/%{_host} -std=c++17 -nostdinc++" %endif %setup_compile_flags export LDFLAGS="-lstdc++-gcc10" export CFLAGS="-I/usr/include/libstdc++-gcc10 -I/usr/include/libstdc++-gcc10/%{_host}" export CXXFLAGS="-I/usr/include/libstdc++-gcc10 -I/usr/include/libstdc++-gcc10/%{_host} -nostdinc++" # Use hardening ldflags. #if %{without bootstrap} #ifarch x86_64 %global rustflags -Clink-arg=-Wl,-z,relro,-z,now #-L %{rustlibdir}/%{rust_triple}/lib #else #global rustflags -Clink-arg=-Wl,-z,relro,-z,now #endif #else #global rustflags -Clink-arg=-Wl,-z,relro,-z,now #endif # convince libgit2-sys to use the distro libgit2 export LIBGIT2_SYS_USE_PKG_CONFIG=1 # convince libssh2-sys to use the distro libssh2 export LIBSSH2_SYS_USE_PKG_CONFIG=1 export RUSTFLAGS="%{rustflags}" ./configure \ --release-channel=stable \ --enable-vendor \ --disable-codegen-tests \ --disable-rpath \ --tools=analysis,cargo,clippy,rls,rustfmt,src \ --llvm-root=%{llvm_root} \ --libdir=%{_libdir} \ --build=%{rust_triple} \ --host=%{rust_triple} \ --target=%{rust_triple} \ --python=%{_libexecdir}/python3.8 \ --enable-extended \ --enable-clang \ %{!?with_llvm_static: --enable-llvm-link-shared } #\ # --disable-option-checking \ # --libdir=%{_libdir} \ # --build=%{rust_triple} --host=%{rust_triple} --target=%{rust_triple} \ # --python=%{_libexecdir}/python3.8 \ # --llvm-root=%{llvm_root} \ # --disable-codegen-tests \ # --disable-rpath \ # --enable-extended \ # --tools=analysis,cargo,clippy,rls,rustfmt,src \ # --enable-vendor \ # --release-channel=stable \ #%if %{mdkver} > 201610 # --set rust.codegen-units-std=1 \ #%endif # --disable-debuginfo \ # --disable-debuginfo-only-std \ # --disable-debuginfo-tools \ # --disable-debuginfo-lines #%%{!?with_llvm_static: --enable-llvm-link-shared } } \ #--local-rust-root=%{local_rust_root} \ #{_libexecdir}/python3.8 ./x.py build python ./x.py build %install # convince libgit2-sys to use the distro libgit2 export LIBGIT2_SYS_USE_PKG_CONFIG=1 # convince libssh2-sys to use the distro libssh2 export LIBSSH2_SYS_USE_PKG_CONFIG=1 export RUSTFLAGS="%{rustflags}" DESTDIR=%{buildroot} %{_libexecdir}/python3.8 ./x.py install # The shared libraries should be executable for debuginfo extraction. find %{buildroot}%{_libdir} -maxdepth 1 -type f -name '*.so' \ -exec chmod -v +x '{}' '+' # The libdir libraries are identical to those under rustlib/. It's easier on # library loading if we keep them in libdir, but we do need them in rustlib/ # to support dynamic linking for compiler plugins, so we'll symlink. (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) # Remove installer artifacts (manifests, uninstall scripts, etc.) find %{buildroot}%{rustlibdir} -maxdepth 1 -type f -exec rm -v '{}' '+' # Remove backup files from %%configure munging find %{buildroot}%{rustlibdir} -type f -name '*.orig' -exec rm -v '{}' '+' # https://fedoraproject.org/wiki/Changes/Make_ambiguous_python_shebangs_error # We don't actually need to ship any of those python scripts in rust-src anyway. find %{buildroot}%{rustlibdir}/src -type f -name '*.py' -exec rm -v '{}' '+' # Remove unwanted documentation files (we already package them) rm -f %{buildroot}%{_docdir}/%{name}/README.md rm -f %{buildroot}%{_docdir}/%{name}/COPYRIGHT rm -f %{buildroot}%{_docdir}/%{name}/LICENSE rm -f %{buildroot}%{_docdir}/%{name}/LICENSE-APACHE rm -f %{buildroot}%{_docdir}/%{name}/LICENSE-MIT rm -f %{buildroot}%{_docdir}/%{name}/LICENSE-THIRD-PARTY rm -f %{buildroot}%{_docdir}/%{name}/*.old # Delete the HTML documentation rm -rf %{buildroot}%{_docdir}/%{name}/html # Create the path for crate-devel packages mkdir -p %{buildroot}%{_datadir}/cargo/registry %if %{without lldb} rm -f %{buildroot}%{_bindir}/rust-lldb rm -f %{buildroot}%{rustlibdir}/etc/lldb_* %endif