Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Step:15-SP6
rust1.61
rust1.61.spec
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File rust1.61.spec of Package rust1.61
# # spec file # # Copyright (c) 2022 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.61 %global version_current 1.61.0 %global version_previous 1.60.0 # This has to be kept lock step to the rust version. %global llvm_version 14 %if 0%{?sle_version} <= 150300 && 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 %define obsolete_rust_versioned() \ Obsoletes: %{1}1.60%{?2:-%{2}} \ Obsoletes: %{1}1.59%{?2:-%{2}} \ Obsoletes: %{1}1.58%{?2:-%{2}} \ Obsoletes: %{1}1.57%{?2:-%{2}} \ Obsoletes: %{1}1.56%{?2:-%{2}} # 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. # === Rust on armv6hl is broken ✨ again ✨ === ExcludeArch: armv6hl # === 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 on t1 targets === %if 0%{?is_opensuse} == 1 && 0%{?suse_version} >= 1550 %ifarch x86_64 aarch64 %bcond_without wasm32 %else %bcond_with wasm32 %endif %else %bcond_with wasm32 %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 Source101: %{dl_url}/rust-%{version_current}-i686-unknown-linux-gnu.tar.xz Source102: %{dl_url}/rust-%{version_current}-aarch64-unknown-linux-gnu.tar.xz Source103: %{dl_url}/rust-%{version_current}-armv7-unknown-linux-gnueabihf.tar.xz Source104: %{dl_url}/rust-%{version_current}-arm-unknown-linux-gnueabihf.tar.xz Source105: %{dl_url}/rust-%{version_current}-powerpc64-unknown-linux-gnu.tar.xz Source106: %{dl_url}/rust-%{version_current}-powerpc64le-unknown-linux-gnu.tar.xz Source107: %{dl_url}/rust-%{version_current}-s390x-unknown-linux-gnu.tar.xz Source108: %{dl_url}/rust-%{version_current}-powerpc-unknown-linux-gnu.tar.xz Source109: %{dl_url}/rust-%{version_current}-riscv64gc-unknown-linux-gnu.tar.xz Source200: %{dl_url}/rust-%{version_current}-x86_64-unknown-linux-gnu.tar.xz.asc Source201: %{dl_url}/rust-%{version_current}-i686-unknown-linux-gnu.tar.xz.asc Source202: %{dl_url}/rust-%{version_current}-aarch64-unknown-linux-gnu.tar.xz.asc Source203: %{dl_url}/rust-%{version_current}-armv7-unknown-linux-gnueabihf.tar.xz.asc Source204: %{dl_url}/rust-%{version_current}-arm-unknown-linux-gnueabihf.tar.xz.asc Source205: %{dl_url}/rust-%{version_current}-powerpc64-unknown-linux-gnu.tar.xz.asc Source206: %{dl_url}/rust-%{version_current}-powerpc64le-unknown-linux-gnu.tar.xz.asc Source207: %{dl_url}/rust-%{version_current}-s390x-unknown-linux-gnu.tar.xz.asc Source208: %{dl_url}/rust-%{version_current}-powerpc-unknown-linux-gnu.tar.xz.asc Source209: %{dl_url}/rust-%{version_current}-riscv64gc-unknown-linux-gnu.tar.xz.asc # 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 %if %{without bundled_llvm} # PATCH-FIX-OPENSUSE: let wasm target use the system lld by default, rust-lld might not be available. Patch1: wasm-use-system-lld.patch %endif Patch2: 0001-fix-tests.patch BuildRequires: chrpath BuildRequires: curl BuildRequires: fdupes 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 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 %if %{with bundled_llvm} BuildRequires: ninja %else # 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 %if %{without bundled_llvm} # For FileCheck BuildRequires: llvm%{llvm_version}-devel %endif %if %{with wasm32} BuildRequires: nodejs-default %endif %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 %if %{without test} %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} %endif %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 # CI tooling won't be used rm -rf src/ci %if %{without bundled_llvm} rm -rf src/llvm/ %endif # 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 # There are some crates forked in github. Use the vendored version to # stop trying `cargo` to access internet. # # https://github.com/rust-lang/rust/issues/90764 mkdir .cargo cat > .cargo/config <<EOF [source.crates-io] replace-with = 'vendored-sources' registry = 'https://example.com' [source.vendored-sources] directory = '$(pwd)/vendor' [source."https://github.com/bjorn3/rust-ar.git"] git = "https://github.com/bjorn3/rust-ar.git" branch = "do_not_remove_cg_clif_ranlib" replace-with = "vendored-sources" [source."https://github.com/bytecodealliance/wasmtime.git"] git = "https://github.com/bytecodealliance/wasmtime.git" replace-with = "vendored-sources" EOF # 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 <<EOF export CC="/usr/bin/clang" export CXX="/usr/bin/clang++" EOF %else %if 0%{?gcc_version} != 0 cat > .env.sh <<EOF export CC="/usr/bin/gcc-%{gcc_version}" export CXX="/usr/bin/g++-%{gcc_version}" EOF %else cat > .env.sh <<EOF export CC="gcc" export CXX="g++" EOF %endif %endif # -Clink-arg=-B{_prefix}/lib/rustlib/{rust_triple}/bin/gcc-ld/" # -Clink-arg=-B{rust_root}/lib/rustlib/{rust_triple}/bin/gcc-ld/" %if %{with sccache} export CC="/usr/bin/sccache ${CC}" export CXX="/usr/bin/sccache ${CXX}" %endif cat >> .env.sh <<EOF export PATH="%{_prefix}/lib/rustlib/%{rust_triple}/bin/:${PATH}" export RUSTFLAGS="%{rustflags} -Clinker=%{rust_linker}" export LD_LIBRARY_PATH="%{rust_root}/lib" export SCCACHE_IDLE_TIMEOUT="3000" export DESTDIR=%{buildroot} export CARGO_FEATURE_VENDORED=1 unset FFLAGS unset MALLOC_CHECK_ unset MALLOC_PERTURB_ # END EXPORTS EOF . ./.env.sh # Sometimes to debug sccache we need to know the state of the env. env # Check our rustroot works as we expect %if %{without test} cat >> main.rs <<EOF fn main() {} EOF RUSTC_LOG=rustc_codegen_ssa::back::link=info %{rust_root}/bin/rustc -C link-args=-Wl,-v ${RUSTFLAGS} main.rs %endif # The configure macro will modify some autoconf-related files, which upsets # cargo when it tries to verify checksums in those files. So we don't use # the macro, as it provides no tangible benefit to our build process. # FUTURE: See if we can build sanitizers without the full llvm bundling. # {?with_tier1: --enable-sanitizers} \ ./configure \ --build=%{rust_triple} --host=%{rust_triple} \ %{!?with_wasm32: --target=%{rust_triple}} \ %{?with_wasm32: --target=%{rust_triple},wasm32-unknown-unknown} \ --prefix=%{_prefix} \ --bindir=%{_bindir} \ --sysconfdir=%{_sysconfdir} \ --datadir=%{_datadir} \ --localstatedir=%{_localstatedir} \ --mandir=%{_mandir} \ --infodir=%{_infodir} \ --libdir=%{common_libdir} \ --docdir=%{_docdir}/rust \ --enable-local-rust \ %{!?with_test: --local-rust-root=%{rust_root} --disable-rpath} \ %{!?with_bundled_llvm: --llvm-root=%{_prefix} --enable-llvm-link-shared} \ %{?with_bundled_llvm: --disable-llvm-link-shared --set llvm.link-jobs=0 --set rust.lld=true} \ %{?with_llvmtools: --set rust.use-lld=true --set llvm.use-linker=lld} \ --default-linker=%{rust_linker} \ --enable-optimize \ %{?with_sccache: --enable-sccache} \ %{!?with_sccache: --enable-ccache} \ --disable-docs \ --disable-compiler-docs \ --enable-verbose-tests \ %{debug_info} \ --enable-vendor \ --enable-extended \ --tools="cargo" \ --release-channel="stable" %if %{without test} python3 ./x.py build # Debug for post build free -h df -h %endif %install # Reread exports file %if %{without test} . ./.env.sh python3 ./x.py install %if %{with bundled_llvm} # bsc#1199126 - rust-lld contains an rpath, which is invalid. chrpath -d %{buildroot}%{rustlibdir}/%{rust_triple}/bin/rust-lld # To facilitate tests when we aren't using system LLVM, we need filecheck available. install -m 0755 %{_builddir}/rustc-%{version}-src/build/%{rust_triple}/llvm/bin/FileCheck %{buildroot}%{rustlibdir}/%{rust_triple}/bin/FileCheck %endif # Remove the license files from _docdir: make install put duplicates there rm %{buildroot}%{_docdir}/rust/{README.md,COPYRIGHT,LICENSE*} rm %{buildroot}%{_docdir}/rust/*.old # Remove installer artifacts (manifests, uninstall scripts, etc.) find %{buildroot}%{rustlibdir} -maxdepth 1 -type f -exec rm -v '{}' '+' # Remove hidden files from source find %{buildroot}%{rustlibdir} -type f -name '.appveyor.yml' -exec rm -v '{}' '+' find %{buildroot}%{rustlibdir} -type f -name '.travis.yml' -exec rm -v '{}' '+' find %{buildroot}%{rustlibdir} -type f -name '.cirrus.yml' -exec rm -v '{}' '+' find %{buildroot}%{rustlibdir} -type f -name '.clang-format' -exec rm -v '{}' '+' find %{buildroot}%{rustlibdir} -type d -name '.github' -exec rm -r -v '{}' '+' # The shared libraries should be executable to allow fdupes find duplicates. find %{buildroot}%{common_libdir} -maxdepth 1 -type f -name '*.so' -exec chmod -v +x '{}' '+' # The shared libraries should be executable for debuginfo extraction. find %{buildroot}%{rustlibdir} -maxdepth 1 -type f -name '*.so' -exec chmod -v +x '{}' '+' # Create the path for crate-devel packages mkdir -p %{buildroot}%{_datadir}/cargo/registry # Remove completions rm -rf %{buildroot}%{_sysconfdir}/bash_completion.d rm -rf %{buildroot}%{_datadir}/zsh # There should be nothing here at all rm -rf %{buildroot}%{_sysconfdir} # cargo does not respect our _libexec setting on Leap: if [ ! -f %{buildroot}%{_libexecdir}/cargo-credential-1password ] && [ -f %{buildroot}%{_exec_prefix}/libexec/cargo-credential-1password ]; then mv %{buildroot}%{_exec_prefix}/libexec/cargo-credential-1password \ %{buildroot}%{_libexecdir}/cargo-credential-1password fi # Silence any duplicate library warnings. %fdupes %{buildroot}/%{common_libdir} # Remove llvm installation rm -rf %{buildroot}/home # End without test %endif %if %{with test} %check . ./.env.sh # Need to exclude issue-71519 as when we enable lld for wasm, this test incorrectly assumes # we can use it with -Z gcc-ld=lld (which is sadly trapped in nightly). We can't exclude # a single test so sadly we have to exclude that whole suite. %ifarch aarch64 python3 ./x.py test --target=%{rust_triple} --exclude src/test/run-make %else python3 ./x.py test --target=%{rust_triple} %endif # End with test %endif %if %{without test} %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %files %license COPYRIGHT LICENSE-APACHE LICENSE-MIT %doc CONTRIBUTING.md README.md RELEASES.md %{_bindir}/rustc %{_bindir}/rustdoc %{_bindir}/rust-gdb %{_bindir}/rust-gdbgui %{_bindir}/rust-lldb %{_mandir}/man1/rustc.1%{?ext_man} %{_mandir}/man1/rustdoc.1%{?ext_man} %{_prefix}/lib/lib*.so %dir %{rustlibdir} %dir %{rustlibdir}%{_sysconfdir} %{rustlibdir}%{_sysconfdir}/gdb_load_rust_pretty_printers.py %{rustlibdir}%{_sysconfdir}/gdb_lookup.py %{rustlibdir}%{_sysconfdir}/gdb_providers.py %{rustlibdir}%{_sysconfdir}/lldb_commands %{rustlibdir}%{_sysconfdir}/lldb_lookup.py %{rustlibdir}%{_sysconfdir}/lldb_providers.py %{rustlibdir}%{_sysconfdir}/rust_types.py %dir %{rustlibdir}/%{rust_triple} %if %{with bundled_llvm} %{rustlibdir}/%{rust_triple}/bin %endif %dir %{rustlibdir}/%{rust_triple}/lib %{rustlibdir}/%{rust_triple}/lib/*.so %{rustlibdir}/%{rust_triple}/lib/*.rlib %if %{with wasm32} %dir %{rustlibdir}/wasm32-unknown-unknown %dir %{rustlibdir}/wasm32-unknown-unknown/lib %{rustlibdir}/wasm32-unknown-unknown/lib/*.rlib %endif %{_libexecdir}/cargo-credential-1password %files -n cargo%{version_suffix} %license src/tools/cargo/LICENSE-{APACHE,MIT,THIRD-PARTY} %license src/tools/rustfmt/LICENSE-{APACHE,MIT} %license src/tools/clippy/LICENSE-{APACHE,MIT} %{_bindir}/cargo %{_mandir}/man1/cargo*.1%{?ext_man} %dir %{_datadir}/cargo %dir %{_datadir}/cargo/registry # End not with test %endif %changelog
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor