# # spec file # # Copyright (c) 2023 SUSE LLC # Copyright (c) 2019 Luke Jones, luke@ljones.dev # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed # upon. The license for this file, and modifications and additions to the # file, is the same license as for the pristine package itself (unless the # license for the pristine package is not an Open Source License, in which # case the license is the MIT License). An "Open Source License" is a # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. # Please submit bugfixes or comments via https://bugs.opensuse.org/ # %global version_suffix 1.71 %global version_current 1.71.0 %global version_previous 1.70.0 # This has to be kept lock step to the rust version. %global llvm_version 16 %if 0%{?sle_version} <= 150500 && 0%{?suse_version} < 1599 # We may need a minimum gcc version for some linker flags # This is especially true on leap/sle # # ⚠️ 11 is required for a number of linker flags to be supported in sle. # %global gcc_version 11 %endif #KEEP NOSOURCE DEBUGINFO %define obsolete_rust_versioned() \ Obsoletes: %{1}1.69%{?2:-%{2}} \ Obsoletes: %{1}1.68%{?2:-%{2}} \ Obsoletes: %{1}1.67%{?2:-%{2}} \ Obsoletes: %{1}1.66%{?2:-%{2}} \ Obsoletes: %{1}1.65%{?2:-%{2}} \ Obsoletes: %{1}1.64%{?2:-%{2}} \ Obsoletes: %{1}1.63%{?2:-%{2}} \ Obsoletes: %{1}1.62%{?2:-%{2}} # ⚠️ Must leave 1.62 here due to kernel requirements. # Build the rust target triple. # Some rust arches don't match what SUSE labels them. %global rust_arch %{_arch} %global abi gnu %ifarch armv7hl %global rust_arch armv7 %global abi gnueabihf %endif %ifarch armv6hl %global rust_arch arm %global abi gnueabihf %endif %ifarch ppc %global rust_arch powerpc %endif %ifarch ppc64 %global rust_arch powerpc64 %endif %ifarch ppc64le %global rust_arch powerpc64le %endif %ifarch riscv64 %global rust_arch riscv64gc %endif # Must restrict the x86 build to i686 since i586 is currently # unsupported %ifarch %{ix86} %global rust_arch i686 %endif %global rust_triple %{rust_arch}-unknown-linux-%{abi} # All sources and bootstraps are fetched form here %global dl_url https://static.rust-lang.org/dist # Rust doesn't function well when put in /usr/lib64 %global common_libdir %{_prefix}/lib %global rustlibdir %{common_libdir}/rustlib # Detect if sccache has been requested by the build %if "%{getenv:RUSTC_WRAPPER}" == "sccache" %bcond_without sccache %else %bcond_with sccache %endif # === rust arch support tiers === # https://doc.rust-lang.org/nightly/rustc/platform-support.html # tl;dr only aarch64, x86_64 and i686 are guaranteed to work. # # armv6/7, s390x, ppc[64[le]], riscv are all "guaranteed to build" only # but may not always work. # === broken distro llvm === # In some situations the llvm provided on the platform may not work. # we add these conditions here. # # ⚠️ SLE/LEAP 15.3 LLVM is too old! # ⚠️ 1.59 breaks codegen with distro llvm!!! %if 0%{?is_opensuse} == 1 && 0%{?suse_version} >= 1550 # && "{version_suffix}" != "1.61" # Can proceed with pinned llvm. %bcond_with bundled_llvm %else # Use bundled llvm instead. # For details see boo#1192067 %bcond_without bundled_llvm %endif # === Use clang/lld during build if possible === # i586 - unable to link libatomic # aarch64 - fails due to an invalid linker flag # %bcond_with llvmtools # Depending on our environment, we may need to configure our linker in a different manner. # If we elect for llvm, always use clang. %if %{with llvmtools} %define rust_linker clang %else %if 0%{?gcc_version} != 0 %define rust_linker gcc-%{gcc_version} %else %define rust_linker cc %endif %endif # === Enable wasm/wasi on t1 targets === %if 0%{?is_opensuse} == 1 && 0%{?suse_version} >= 1550 %ifarch x86_64 aarch64 %bcond_without wasm32 %bcond_without wasi %else %bcond_with wasm32 %bcond_with wasi %endif %else %bcond_with wasm32 %bcond_with wasi %endif # Test is done in a different multibuild package (rustXXX-test). This # package will replace the local-rust-root and use the systems's one # from the rustXXX package itself. This will exercise the compiler, # even tho, the tests will require more compilation. If we do not # agree on this model we can drop the _multibuild option and do the # pct check as a part of the main spec. %global flavor @BUILD_FLAVOR@%{nil} %if "%{flavor}" == "test" %define psuffix -test %bcond_without test %else %define psuffix %{nil} %bcond_with test %endif # """ # Do not use parallel codegen in order to # a) not exhaust memory on build-machines and # b) generate the fastest possible binary # at the cost of longer build times for this package # """ # # These claims are incorrect # a) codegen=1, actually consumes MORE memory due to the fact that the full # code unit is then LTO'd in a single pass. This can cause LLVM to internally OOM # especially if the machine has less than 1G of ram, and this is documented: # * https://github.com/rust-lang/rust/issues/85598 # it has also been observed in OBS during builds of 1.52 and 1.53 # # b) the performance gains from codegen=1 are minimal at best, and not worth # us messing about with these values - especially when the rust language team # probably know more about how to set and tune these based on data and research # # Debuginfo can exhaust memory on these architecture workers %ifarch %{arm} %{ix86} %define debug_info --debuginfo-level=0 --debuginfo-level-rustc=0 --debuginfo-level-std=0 --debuginfo-level-tools=0 --debuginfo-level-tests=0 %else %define debug_info %{nil} %endif %global rustflags -Clink-arg=-Wl,-z,relro,-z,now # Exclude implicitly-scanned Provides, especially the libLLVM.so ones: %global __provides_exclude_from ^%{rustlibdir}/.*$ Name: rust%{version_suffix}%{psuffix} Version: %{version_current} Release: 0 Summary: A systems programming language License: Apache-2.0 OR MIT Group: Development/Languages/Rust URL: https://www.rust-lang.org Source0: %{dl_url}/rustc-%{version}-src.tar.xz Source1: rust.keyring %if %{without test} Source99: %{name}-rpmlintrc %endif Source100: %{dl_url}/rust-%{version_current}-x86_64-unknown-linux-gnu.tar.xz NoSource: 100 Source101: %{dl_url}/rust-%{version_current}-i686-unknown-linux-gnu.tar.xz NoSource: 101 Source102: %{dl_url}/rust-%{version_current}-aarch64-unknown-linux-gnu.tar.xz NoSource: 102 Source103: %{dl_url}/rust-%{version_current}-armv7-unknown-linux-gnueabihf.tar.xz NoSource: 103 Source104: %{dl_url}/rust-%{version_current}-arm-unknown-linux-gnueabihf.tar.xz NoSource: 104 Source105: %{dl_url}/rust-%{version_current}-powerpc64-unknown-linux-gnu.tar.xz NoSource: 105 Source106: %{dl_url}/rust-%{version_current}-powerpc64le-unknown-linux-gnu.tar.xz NoSource: 106 Source107: %{dl_url}/rust-%{version_current}-s390x-unknown-linux-gnu.tar.xz NoSource: 107 Source108: %{dl_url}/rust-%{version_current}-powerpc-unknown-linux-gnu.tar.xz NoSource: 108 Source109: %{dl_url}/rust-%{version_current}-riscv64gc-unknown-linux-gnu.tar.xz NoSource: 109 Source200: %{dl_url}/rust-%{version_current}-x86_64-unknown-linux-gnu.tar.xz.asc NoSource: 200 Source201: %{dl_url}/rust-%{version_current}-i686-unknown-linux-gnu.tar.xz.asc NoSource: 201 Source202: %{dl_url}/rust-%{version_current}-aarch64-unknown-linux-gnu.tar.xz.asc NoSource: 202 Source203: %{dl_url}/rust-%{version_current}-armv7-unknown-linux-gnueabihf.tar.xz.asc NoSource: 203 Source204: %{dl_url}/rust-%{version_current}-arm-unknown-linux-gnueabihf.tar.xz.asc NoSource: 204 Source205: %{dl_url}/rust-%{version_current}-powerpc64-unknown-linux-gnu.tar.xz.asc NoSource: 205 Source206: %{dl_url}/rust-%{version_current}-powerpc64le-unknown-linux-gnu.tar.xz.asc NoSource: 206 Source207: %{dl_url}/rust-%{version_current}-s390x-unknown-linux-gnu.tar.xz.asc NoSource: 207 Source208: %{dl_url}/rust-%{version_current}-powerpc-unknown-linux-gnu.tar.xz.asc NoSource: 208 Source209: %{dl_url}/rust-%{version_current}-riscv64gc-unknown-linux-gnu.tar.xz.asc NoSource: 209 # Make factory-auto stop complaining... Source1000: README.suse-maint # PATCH-FIX-OPENSUSE: edit src/librustc_llvm/build.rs to ignore GCC incompatible flag Patch0: ignore-Wstring-conversion.patch # IMPORTANT - To generate patches for submodules in git so they apply relatively you can use # git format-patch --text --dst-prefix=b/src/tools/cargo/ HEAD~2 BuildRequires: chrpath BuildRequires: curl # BUG - fdupes on leap/sle causes issues with debug info %if 0%{?is_opensuse} == 1 && 0%{?suse_version} >= 1550 BuildRequires: fdupes %endif BuildRequires: pkgconfig BuildRequires: procps BuildRequires: python3-base BuildRequires: util-linux BuildRequires: pkgconfig(libcurl) BuildRequires: pkgconfig(openssl) BuildRequires: pkgconfig(zlib) # Set requires appropriately %if %with sccache BuildRequires: sccache %else BuildRequires: ccache %endif # For linking to platform Requires: glibc-devel # Rustc doesn't really do much without Cargo, but you know, if you wanna yolo that ... Recommends: cargo # For static linking Suggests: glibc-devel-static %if %{with wasi} BuildRequires: wasi-libc %endif %if %{with llvmtools} BuildRequires: clang BuildRequires: libstdc++-devel BuildRequires: lld Requires: clang Requires: lld %else %if 0%{?gcc_version} != 0 BuildRequires: gcc%{gcc_version}-c++ Requires: gcc%{gcc_version} %else BuildRequires: gcc-c++ Requires: gcc %endif # Clang gives better errors than gcc during a compilation, and it keeps everything # within llvm ecosystem. Suggests: clang # lld is significantly faster than gold for linking, so users may wish to preference it. Suggests: lld %endif # CMake and Ninja required to drive the bundled llvm build. # Cmake is also needed in tests. %if 0%{?sle_version} >= 120000 && 0%{?sle_version} <= 150200 # In these distros cmake is 2.x, or 3.X < 3.13, so we need cmake3 for building llvm. BuildRequires: cmake3 > 3.13.4 %else BuildRequires: cmake > 3.13.4 %endif # To build rust-lld BuildRequires: ninja %if %{without bundled_llvm} # Use distro provided LLVM on Tumbleweed, but pin it to the matching LLVM! # For details see boo#1192067 BuildRequires: llvm%{llvm_version}-devel Requires: lld%{llvm_version} %endif %if %{with test} BuildRequires: cargo%{version_suffix} = %{version} BuildRequires: rust%{version_suffix} = %{version} # Static linking tests need this. BuildRequires: glibc-devel-static BuildRequires: git %if %{without bundled_llvm} # For FileCheck BuildRequires: llvm%{llvm_version}-devel %endif %if %{with wasm32} BuildRequires: nodejs-default %endif # End with test %endif %obsolete_rust_versioned rust Conflicts: rust+rustc < %{version} Conflicts: rustc-bootstrap Provides: rust+rustc = %{version} Conflicts: rust-std < %{version} Obsoletes: rust-std < %{version} Provides: rust-std = %{version} Conflicts: rust-std-static < %{version} Obsoletes: rust-std-static < %{version} Provides: rust-std-static = %{version} Conflicts: rust-gdb < %{version} Obsoletes: rust-gdb < %{version} Provides: rust-gdb = %{version} %if %{without test} # Restrict the architectures as building rust relies on being # initially bootstrapped before we can build the n+1 release ExclusiveArch: x86_64 %{arm} aarch64 ppc ppc64 ppc64le s390x %{ix86} riscv64 %ifarch %{ix86} ExclusiveArch: i686 %endif %else # Restrict for Tier 1 targets (but we should report bugs in Tier 2) # https://doc.rust-lang.org/nightly/rustc/platform-support.html#tier-1-with-host-tools ExclusiveArch: x86_64 i686 aarch64 %endif %description Rust is a systems programming language focused on three goals: safety, speed, and concurrency. It maintains these goals without having a garbage collector, making it a useful language for a number of use cases other languages are not good at: embedding in other languages, programs with specific space and time requirements, and writing low-level code, like device drivers and operating systems. It improves on current languages targeting this space by having a number of compile-time safety checks that produce no runtime overhead, while eliminating all data races. Rust also aims to achieve "zero-cost abstractions", even though some of these abstractions feel like those of a high-level language. Even then, Rust still allows precise control like a low-level language would. %package -n cargo%{version_suffix} Summary: The Rust package manager License: Apache-2.0 OR MIT Group: Development/Languages/Rust Requires: rust-std = %{version} Obsoletes: cargo-vendor < %{version} Provides: cargo-vendor = %{version} Provides: rust+cargo = %{version} %obsolete_rust_versioned cargo %description -n cargo%{version_suffix} Cargo downloads dependencies of Rust projects and compiles it. %prep # Previously the stage0 compiler was skipped in test builds, but there are now # tests in rust's source tree that require it. %ifarch x86_64 %setup -q -T -b 100 -n rust-%{version_current}-%{rust_triple} %endif %ifarch %{ix86} %setup -q -T -b 101 -n rust-%{version_current}-%{rust_triple} %endif %ifarch aarch64 %setup -q -T -b 102 -n rust-%{version_current}-%{rust_triple} %endif %ifarch armv7hl %setup -q -T -b 103 -n rust-%{version_current}-%{rust_triple} %endif %ifarch armv6hl %setup -q -T -b 104 -n rust-%{version_current}-%{rust_triple} %endif %ifarch ppc64 %setup -q -T -b 105 -n rust-%{version_current}-%{rust_triple} %endif %ifarch ppc64le %setup -q -T -b 106 -n rust-%{version_current}-%{rust_triple} %endif %ifarch s390x %setup -q -T -b 107 -n rust-%{version_current}-%{rust_triple} %endif %ifarch ppc %setup -q -T -b 108 -n rust-%{version_current}-%{rust_triple} %endif %ifarch riscv64 %setup -q -T -b 109 -n rust-%{version_current}-%{rust_triple} %endif ./install.sh --components=cargo,rustc,rust-std-%{rust_triple} --prefix=.%{_prefix} --disable-ldconfig %global rust_root %{_builddir}/rust-%{version_current}-%{rust_triple}%{_prefix} %autosetup -p1 -n rustc-%{version}-src # We never enable emscripten. rm -rf src/llvm-emscripten/ # We never enable other LLVM tools. rm -rf src/tools/clang rm -rf src/tools/lldb # Fix rpmlint error "This script uses 'env' as an interpreter" sed -i '1s|#!%{_bindir}/env python|#!%{_bindir}/python3|' library/core/src/unicode/printable.py chmod +x library/core/src/unicode/printable.py # Debugging for if anything goes south. lscpu free -h df -h %build # Create exports file # Keep all the "export VARIABLE" together here, so they can be # reread in the %%install section below. # If the environments between build and install and different, # everything will be rebuilt during installation! %if %{with llvmtools} cat > .env.sh < .env.sh < .env.sh <> .env.sh <> main.rs <