File suse-prime.spec of Package suse-prime

#
# spec file for package suse-prime
#
# Copyright (c) 2025 SUSE LLC and contributors
#
# 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/
#


%if 0%{?suse_version} < 1550 && 0%{?sle_version} <= 150300
# systemd-rpm-macros is wrong in 15.3 and below
%define _modprobedir /lib/modprobe.d
%endif
%global modprobe_d_files 09-nvidia-modprobe-bbswitch-G04.conf 09-nvidia-modprobe-pm-G05.conf

Name:           suse-prime
Version:        0.8.18
Release:        0
Summary:        GPU (nvidia/intel) selection for NVIDIA optimus laptops with bbswitch support
License:        0BSD
Group:          System/X11/Utilities
URL:            https://github.com/openSUSE/SUSEPrime
Source0:        https://github.com/openSUSE/SUSEPrime/archive/%{version}.tar.gz#/SUSEPrime-%{version}.tar.gz
Recommends:     nvidia_driver
Supplements:    (modalias(pci:v00008086d*sv*sd*bc03sc*i*) and (nvidia_driver < 550.54.14))
Conflicts:      suse-prime-alt
Obsoletes:      suse-prime-bbswitch < %{version}
Provides:       suse-prime-bbswitch = %{version}
BuildRequires:  pkgconfig(systemd)
BuildArch:      noarch
Requires:       coreutils
Requires:       pciutils
Requires:       sudo
# prime-select uses nvidia-xconfig --query-gpu-info to figure out the
# PCI ID; we splitted out nvidia-xconfig to an external package
# beginning with version 570.86.15
Requires:       (nvidia-xconfig if nvidia-video-G06 >= 570.86.15)
%{?systemd_ordering}

%description
A collection of shell scripts that makes it possible to use the
NVIDIA GPU on a Optimus Laptop. The switching is similar to
the feature provided by the nvidia-prime package in Ubuntu.
Uses bbswitch to switch on/of power of NVIDIA GPU.

%prep
%setup -n SUSEPrime-%{version}
cat > LICENSE << EOF
Permission to use, copy, modify, and/or distribute this software for
any purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
EOF

%build
:

%install
mkdir -p %{buildroot}%{_datadir}/prime
install -m 0644 xorg-intel.conf  %{buildroot}%{_datadir}/prime/
install -m 0644 xorg-intel-intel.conf  %{buildroot}%{_datadir}/prime/
install -m 0644 xorg-nvidia.conf %{buildroot}%{_datadir}/prime/
install -m 0644 xorg-nvidia-prime-render-offload.conf %{buildroot}%{_datadir}/prime/
install -m 0644 xorg-amd.conf %{buildroot}%{_datadir}/prime/
mkdir -p %{buildroot}%{_modprobedir}
install -m 0644 09-nvidia-modprobe-bbswitch-G04.conf %{buildroot}%{_modprobedir}/
install -m 0644 09-nvidia-modprobe-pm-G05.conf %{buildroot}%{_modprobedir}/
%if 0%{?suse_version} >= 1550
mkdir -p %{buildroot}/usr/lib/dracut/dracut.conf.d/
install -m 0644 90-nvidia-dracut-G05.conf %{buildroot}/usr/lib/dracut/dracut.conf.d/
%else
mkdir -p %{buildroot}/etc/dracut.conf.d
install -m 0644 90-nvidia-dracut-G05.conf %{buildroot}/etc/dracut.conf.d
%endif
mkdir -p %{buildroot}%{_unitdir}
install -m 0644 prime-select.service %{buildroot}%{_unitdir}/
install -D -m 0755 prime-select.sh %{buildroot}%{_sbindir}/prime-select
mkdir -p %{buildroot}/usr/lib/udev/rules.d
install -m 0644 90-nvidia-udev-pm-G05.rules %{buildroot}/usr/lib/udev/rules.d
mkdir -p %{buildroot}/usr/sbin
ln -snf service %{buildroot}/usr/sbin/rcprime-select
mkdir -p %{buildroot}%{_bindir}
install -m 0755 prime-run %{buildroot}%{_bindir}

%pre
%service_add_pre prime-select.service
# Avoid restoring outdated stuff in posttrans
for _f in %{?modprobe_d_files}; do
    [ ! -f "/etc/modprobe.d/${_f}.rpmsave" ] || \
        mv -f "/etc/modprobe.d/${_f}.rpmsave" "/etc/modprobe.d/${_f}.rpmsave.old" || :
done

%post
%{?regenerate_initrd_post}
%service_add_post prime-select.service
systemctl enable prime-select.service

%preun
%service_del_preun prime-select.service
if [ "$1" -eq 0 ]; then
   # cleanup before uninstalling the package completely
   export PATH=$PATH:/usr/sbin
   %{_sbindir}/prime-select unset || true
fi

%postun
if [ "$1" -eq 0 ]; then
   true
   %{?regenerate_initrd_post}
   %service_del_postun prime-select.service
fi

%posttrans
# Migration of modprobe.conf files to _modprobedir
for _f in %{?modprobe_d_files}; do
    [ ! -f "/etc/modprobe.d/${_f}.rpmsave" ] || \
        mv -fv "/etc/modprobe.d/${_f}.rpmsave" "/etc/modprobe.d/${_f}" || :
done
%{?regenerate_initrd_posttrans}

%triggerin -- nvidia-gfxG05-kmp-default
# get rid of nvidia kernel modules in initrd
rm -f /etc/dracut.conf.d/50-nvidia-default.conf
%{?regenerate_initrd_post}

%files
%defattr(-,root,root)
%doc README.md
%license LICENSE
%if 0%{?suse_version} >= 1550
%dir /usr/lib/dracut/
%dir /usr/lib/dracut/dracut.conf.d/
%else
/etc/dracut.conf.d
%endif
%dir %{_datadir}/prime
%{_datadir}/prime/xorg-amd.conf
%{_datadir}/prime/xorg-intel.conf
%{_datadir}/prime/xorg-intel-intel.conf
%{_datadir}/prime/xorg-nvidia.conf
%{_datadir}/prime/xorg-nvidia-prime-render-offload.conf
%ghost %dir %{_sysconfdir}/prime
%ghost %config(noreplace) %{_sysconfdir}/prime/current_type
%{_bindir}/prime-run
%{_sbindir}/prime-select
%{_sbindir}/rcprime-select
%dir %{_modprobedir}
%{_modprobedir}/09-nvidia-modprobe-bbswitch-G04.conf
%{_modprobedir}/09-nvidia-modprobe-pm-G05.conf
%if 0%{?suse_version} >= 1550
/usr/lib/dracut/dracut.conf.d/90-nvidia-dracut-G05.conf
%else
/etc/dracut.conf.d/90-nvidia-dracut-G05.conf
%endif
/usr/lib/udev/rules.d/90-nvidia-udev-pm-G05.rules
%{_unitdir}/prime-select.service

%changelog
openSUSE Build Service is sponsored by