File rust.spec of Package rust

Name:           rust
Version:        1.91.0
Release:        %mkrel 1
Summary:        Rust programming language compiler
License:        MIT AND Apache-2.0
Group:          Development/Languages
URL:            https://www.rust-lang.org/

Conflicts: rust < 1.91.0
Obsoletes: rust < 1.91.0

Source0:        rustc-%{version}-src.tar.xz
Source1:        rustc-1.90.0-x86_64-unknown-linux-gnu.tar.xz
Source2:        rust-std-1.90.0-x86_64-unknown-linux-gnu.tar.xz
# Cargo is now split; handled in cargo.spec, not here

BuildRequires:  llvm21-devel
BuildRequires:  clang21-devel
BuildRequires:  cmake
BuildRequires:  ninja
BuildRequires:  python3
BuildRequires:  libstdc++-devel
BuildRequires:  pkgconfig(zlib)
BuildRequires:  pkgconfig(sqlite3)
BuildRequires:  coreutils
BuildRequires:  lib64openssl-devel

%description
Rust is a systems programming language focused on safety, speed, and concurrency.
This package provides the Rust compiler (`rustc`), standard libraries, and developer tools.

%package clippy
Summary: Rust Clippy linter
Group: Development/Languages

%description clippy
Clippy is a collection of lints to catch common mistakes and improve Rust code.

%package rustfmt
Summary: Rust code formatter
Group: Development/Languages

%description rustfmt
Rustfmt formats Rust code according to style guidelines.

%package rust-analyzer
Summary: Rust language server
Group: Development/Languages

%description rust-analyzer
Rust Analyzer provides IDE-like features for Rust, including code completion and diagnostics.

%package std
Summary:        Rust standard libraries
Group:          Development/Languages

%description std
Standard libraries for Rust, required to run Rust programs.

%prep
%setup -q -n rustc-%{version}-src

# Vendored artifacts for stage0
mkdir -p src/bootstrap/cache/2025-09-18 build/cache/2025-09-18
cp %{SOURCE1} src/bootstrap/cache/2025-09-18/
cp %{SOURCE2} src/bootstrap/cache/2025-09-18/
cp %{SOURCE1} build/cache/2025-09-18/
cp %{SOURCE2} build/cache/2025-09-18/

# Stub out download_component() to avoid network
awk '
/^def download_component/ {
  print "def download_component(info):"
  print "    print(\"using vendored artifact: {}\".format(getattr(info, \"url\", \"\")))"
  print "    return"
  skip=1
  next
}
skip && /^def / { skip=0 }
!skip { print }
' src/bootstrap/bootstrap.py > src/bootstrap/bootstrap.py.new && mv src/bootstrap/bootstrap.py.new src/bootstrap/bootstrap.py

# Normalize python shebangs
find src -type f -name '*.py' -exec sed -i 's|^#! */usr/bin/env python$|#!/usr/bin/python3|' {} \;

%build
export LLVM_CONFIG=%{_bindir}/llvm-config
./configure \
    --prefix=%{_prefix} \
    --release-channel=stable \
    --enable-llvm-link-shared

COMPILER_HASH=$(sha256sum src/bootstrap/cache/2025-09-18/rustc-1.90.0-x86_64-unknown-linux-gnu.tar.xz | cut -d' ' -f1)
STD_HASH=$(sha256sum src/bootstrap/cache/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-gnu.tar.xz | cut -d' ' -f1)

cat > bootstrap.toml <<EOF
[build]
vendor = true
extended = true
configure-args = ['--prefix=/usr', '--release-channel=stable', '--enable-llvm-link-shared']

[install]
prefix = '/usr'

[rust]
channel = 'stable'

[llvm]
link-shared = true
EOF

cat > src/bootstrap/stage0.json <<EOF
{
  "compiler": {
    "x86_64-unknown-linux-gnu": {
      "url": "file://src/bootstrap/cache/2025-09-18/rustc-1.90.0-x86_64-unknown-linux-gnu.tar.xz",
      "hash": "sha256:${COMPILER_HASH}"
    }
  },
  "std": {
    "x86_64-unknown-linux-gnu": {
      "url": "file://src/bootstrap/cache/2025-09-18/rust-std-1.90.0-x86_64-unknown-linux-gnu.tar.xz",
      "hash": "sha256:${STD_HASH}"
    }
  }
}
EOF

make

%install
DESTDIR=%{buildroot} make install

# Sanitize manifests and install.log
for dir in %{buildroot}%{_prefix}/lib/rustlib; do
  if [ -d "$dir" ]; then
    find "$dir" -name 'manifest-*' -exec sed -i "s|%{buildroot}||g" {} \;
    [ -f "$dir/install.log" ] && sed -i "s|%{buildroot}||g" "$dir/install.log"
    find "$dir" -type f -name '*.py' -exec sed -i 's|^#! */usr/bin/env python$|#!/usr/bin/python3|' {} \;
  fi
done

# Relocate vendored libraries into proper libdir
mkdir -p %{buildroot}%{_libdir}
for f in libLLVM-*-rust-*.so libLLVM.so.*-rust-* librustc_driver-*.so; do
  if [ -e %{buildroot}/usr/lib/$f ]; then
    mv %{buildroot}/usr/lib/$f %{buildroot}%{_libdir}/
  fi
done

%files
%{_bindir}/rustc
%{_bindir}/rustdoc
%{_bindir}/rust-gdb
%{_bindir}/rust-gdbgui
%{_bindir}/rust-lldb
%{_prefix}/lib/rustlib/
%doc %{_datadir}/doc/rustc
%doc %{_datadir}/doc/docs/html
%{_mandir}/man1/rustc.1*
%{_mandir}/man1/rustdoc.1*
%{_libdir}/libLLVM*.so*
%{_libdir}/librustc_driver*.so

%files clippy
%{_bindir}/clippy-driver
%doc /usr/share/doc/clippy/*

%files rustfmt
%{_bindir}/rustfmt
%doc /usr/share/doc/rustfmt/*

%files rust-analyzer
%{_bindir}/rust-analyzer
%{_libexecdir}/rust-analyzer-proc-macro-srv
%doc /usr/share/doc/rust-analyzer/*

%files std
%{_prefix}/lib/rustlib/*/lib/*.rlib
%{_prefix}/lib/rustlib/*/lib/*.so

%changelog
* Sun Dec 07 2025 Henrik <henrik@example.com> - 1.91.0-1
- Split Cargo into its own package (cargo.spec)
- Sanitized manifests and install.log
- Normalized python shebangs
- Relocated vendored libraries into %{_libdir}
openSUSE Build Service is sponsored by