File nvidia-driver.spec of Package nvidia-driver

# see https://git.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/nvidia-utils for crutch-reference

%if 0%{?suse_version} < 1550
  %define _distconfdir /etc
%endif

%bcond_with clang

Name: nvidia-driver
Summary: Nvidia proprietary graphic driver
Version: 495.44
Release: 0
License: SUSE-NonFree
Group:   System/Libraries
URL:     http://www.nvidia.com/
Source0: http://http.download.nvidia.com/XFree86/Linux-x86_64/%{version}/NVIDIA-Linux-x86_64-%{version}.run
#Source0: NVIDIA-Linux-x86_64-%{version}.run
Source1: nvidia.conf
Source2: %{name}-kmp-preamble
Source3: 50-nvidia.conf 
BuildRequires:  %{kernel_module_package_buildreqs}
BuildRequires:  libelf-devel
#BuildRequires:  pkgconfig(OpenCL)
#BuildRequires:  pkgconfig(vulkan)
ExclusiveArch: x86_64

Requires: Mesa >= 17.2.4
Requires: Mesa-32bit >= 17.2.4
Requires: Mesa-libva >= 17.2.4
Requires: Mesa-dri-nouveau >= 17.2.4
Requires: Mesa-dri-nouveau-32bit >= 17.2.4
Requires: libvdpau_nouveau >= 17.2.4
Requires: libvdpau_nouveau-32bit >= 17.2.4
Requires: libdrm_nouveau2 >= 2.4.81
Requires: libdrm_nouveau2-32bit >= 2.4.81
Requires: libvulkan1
# Conflicts: xf86-video-nouveau
# Conflicts: libvdpau_nouveau
%kernel_module_package -n nvidia -p %{name}-kmp-preamble -x um pv xen

%description
Nvidia proprietary graphics driver, version %{version}.
Specifically, this driver is for Nvidia GeForce graphic cards from GeForce 400 Series to GeForce 10 Series.
It also supports Quadro cards from Quadro 410 to Quadro P6000.

This package includes Nvidia OpenGL, EGL libraries. It resolves the confliction with Mesa by specifying priority in ld.conf.d config file.

%package KMP
Summary: Nvidia proprietary graphic driver kernel module
Group:   System/Kernel

Requires: Mesa >= 17.2.4
Requires: Mesa-32bit >= 17.2.4
Requires: Mesa-libva >= 17.2.4
Requires: Mesa-dri-nouveau >= 17.2.4
Requires: Mesa-dri-nouveau-32bit >= 17.2.4
Requires: libvdpau_nouveau >= 17.2.4
Requires: libvdpau_nouveau-32bit >= 17.2.4
Requires: libdrm_nouveau2 >= 2.4.81
Requires: libdrm_nouveau2-32bit >= 2.4.81
%description KMP
Nvidia proprietary graphics driver, version %{version}.
This package contains the kernel module for the Nvidia graphics driver.

%package 32bit
License: SUSE-NonFree
Group:   System/Libraries
Summary: Nvidia proprietary graphic driver 32 bit libraries

Requires: Mesa >= 17.2.4
Requires: Mesa-32bit >= 17.2.4
Requires: Mesa-libva >= 17.2.4
Requires: Mesa-dri-nouveau >= 17.2.4
Requires: Mesa-dri-nouveau-32bit >= 17.2.4
Requires: libvdpau_nouveau >= 17.2.4
Requires: libvdpau_nouveau-32bit >= 17.2.4
Requires: libdrm_nouveau2 >= 2.4.81
Requires: libdrm_nouveau2-32bit >= 2.4.81
Requires: libvulkan1-32bit
%description 32bit
This package will download and install the proprietary NVIDIA
Accelerated Linux Graphics Driver that brings accelerated 2D functionality
and high-performance OpenGL support to Linux x86 with the
use of NVIDIA graphics processing units (GPUs).


%package libOpenCL
License: SUSE-NonFree
Group:   System/Libraries
Summary: Nvidia proprietary graphic OpenCL driver

Requires: Mesa >= 17.2.4
Requires: Mesa-32bit >= 17.2.4
Requires: Mesa-libva >= 17.2.4
Requires: Mesa-dri-nouveau >= 17.2.4
Requires: Mesa-dri-nouveau-32bit >= 17.2.4
Requires: libvdpau_nouveau >= 17.2.4
Requires: libvdpau_nouveau-32bit >= 17.2.4
Requires: libdrm_nouveau2 >= 2.4.81
Requires: libdrm_nouveau2-32bit >= 2.4.81
Requires: libOpenCL1
%description libOpenCL
This package will download and install the proprietary NVIDIA
Accelerated Linux Graphics Driver that brings accelerated 2D functionality
and high-performance OpenCL support to Linux x86 with the
use of NVIDIA graphics processing units (GPUs).

%package libOpenCL-32bit
License: SUSE-NonFree
Group:   System/Libraries
Summary: Nvidia proprietary graphic OpenCL driver

Requires: Mesa >= 17.2.4
Requires: Mesa-32bit >= 17.2.4
Requires: Mesa-libva >= 17.2.4
Requires: Mesa-dri-nouveau >= 17.2.4
Requires: Mesa-dri-nouveau-32bit >= 17.2.4
Requires: libvdpau_nouveau >= 17.2.4
Requires: libvdpau_nouveau-32bit >= 17.2.4
Requires: libdrm_nouveau2 >= 2.4.81
Requires: libdrm_nouveau2-32bit >= 2.4.81
Requires: libOpenCL1-32bit
%description libOpenCL-32bit
This package will download and install the proprietary NVIDIA
Accelerated Linux Graphics Driver that brings accelerated 2D functionality
and high-performance OpenCL 32bit library to Linux x86 with the
use of NVIDIA graphics processing units (GPUs).

%package -n xf86-video-nvidia-glx
Summary: Nvidia proprietary video driver for the Xorg X server
Requires(post): update-alternatives
Requires(postun): update-alternatives

Requires: Mesa >= 17.2.4
Requires: Mesa-32bit >= 17.2.4
Requires: Mesa-libva >= 17.2.4
Requires: Mesa-dri-nouveau >= 17.2.4
Requires: Mesa-dri-nouveau-32bit >= 17.2.4
Requires: libvdpau_nouveau >= 17.2.4
Requires: libvdpau_nouveau-32bit >= 17.2.4
Requires: libdrm_nouveau2 >= 2.4.81
Requires: libdrm_nouveau2-32bit >= 2.4.81
# Conflicts: xf86-video-nouveau

%description -n xf86-video-nvidia-glx
This sub-package includes Nvidia X.org drivers and X.org extensions like GLX modules.
It need to override the libglx.so file provided by original X server. This conflict is resolved by libglx.so entry in alternatives.

%prep

%define nvidia_name NVIDIA-Linux-x86_64-%{version}

cp %{_sourcedir}/%{nvidia_name}.run .
cp %{_sourcedir}/nvidia.conf .
chmod +x %{nvidia_name}.run
./%{nvidia_name}.run --extract-only
cd %{_builddir}/%{nvidia_name}/kernel
# shut OBS up and avoid build-breaking rpmlint crap
sed -i -e '/EXTRA_CFLAGS/s:-Wno-error:-Wno-error -w:g' Kbuild

%build
export MAKE_ARGS="$MAKE_ARGS %{?jobs:-j%{jobs}}"
# obviously, this is incompatible with GCC_PLUGINS
%if %{with clang}
export CC=clang CPP='clang -E' CXX=clang++ LD=ld.lld AR=llvm-ar AS=llvm-as NM=llvm-nm OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump OBJSIZE=llvm-size STRIP=llvm-strip RANLIB=llvm-ranlib
export MAKE_ARGS="$MAKE_ARGS LLVM=1 LLVM_IAS=1 CC=clang LD=ld.lld AR=llvm-ar AS=llvm-as NM=llvm-nm OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump OBJSIZE=llvm-size STRIP=llvm-strip RANLIB=llvm-ranlib"
export HOST_EXTRACFLAGS="-v -fPIC -O3 -fno-fast-math -fglobal-isel -fuse-ld=lld"
%endif
# don't be pissy about a better kernel
export IGNORE_PREEMPT_RT_PRESENCE=1
# - build kernel module
cd %{_builddir}/%{nvidia_name}/kernel
sed -i 's,INSTALL_MOD_DIR=kernel/drivers/video,INSTALL_MOD_DIR=updates,g' Makefile
# avoid failures on kernels with configs that force GPL-only symbols unto generic APIs
sed -i -e 's:MODULE_LICENSE("NVIDIA"):MODULE_LICENSE("GPL"):g' \
    -e 's:MODULE_LICENSE("MIT"):MODULE_LICENSE("GPL"):g' \
    */*.c
for flavor in %{flavors_to_build}; do
    export SYSSRC=/usr/src/linux
    export SYSOUT=%{kernel_source $flavor}
    make -k clean
    make modules ${MAKE_ARGS}
done

%install
export IGNORE_PREEMPT_RT_PRESENCE=1
# Kernel module
cd %{_builddir}/%{nvidia_name}/kernel
export INSTALL_MOD_PATH=%{buildroot}
for flavor in %{flavors_to_build}; do
    export SYSSRC=/usr/src/linux
    export SYSOUT=%{kernel_source $flavor}
    make modules_install ${MAKE_ARGS}
done
install -dm755 %{buildroot}/etc/modprobe.d
install -Dm644 %{_sourcedir}/50-nvidia.conf %{buildroot}/etc/modprobe.d/nvidia.conf

# All these installed files can be found in README.txt
cd %{_builddir}/%{nvidia_name}
# ====================== install X driver and GLX extension modult for X ===========================
install -Dm 755 nvidia_drv.so \
	%{buildroot}/usr/lib64/xorg/modules/drivers/nvidia_drv.so
# install X module for wrapped software rendering
#install -Dm 755 libnvidia-wfb.so.* \
#	%{buildroot}/usr/lib64/xorg/modules/libnvidia-wfb.so.*
#pushd %{buildroot}/usr/lib64/xorg/modules
#ln -s libnvidia-wfb.so.%{version} libnvidia-wfb.so.1
#popd
# install X glx extension - use alternative to solve conflict with X
#for libglx in %{_builddir}/%{nvidia_name}/libglx.so.*; do
#  install -Dm 755 %{_builddir}/%{nvidia_name}/${libglx} \
#  %{buildroot}/usr/lib64/xorg/modules/extensions/nvidia/nvidia-${libglx}
#done
# distro specific files must be installed in /usr/share/X11/xorg.conf.d
install -Dm 644 nvidia-drm-outputclass.conf \
	%{buildroot}/usr/share/X11/xorg.conf.d/nvidia-drm-outputclass.conf
install -Dm 644 LICENSE \
	%{buildroot}/usr/share/licenses/nvidia/LICENSE
install -Dm 644 NVIDIA_Changelog \
	%{buildroot}/usr/share/doc/nvidia/NVIDIA_Changelog
install -Dm 644 README.txt \
	%{buildroot}/usr/share/doc/nvidia/README.txt

# ============== install nvidia libraries with soft links ============
install -Dm 755 %{_builddir}/%{nvidia_name}/nvidia-settings \
	%{buildroot}/usr/bin/nvidia-settings
install -Dm 755 %{_builddir}/%{nvidia_name}/nvidia-xconfig \
	%{buildroot}/usr/bin/nvidia-xconfig
install -dm 755 %{buildroot}/usr/lib64/nvidia
install -Dm 644 %{_builddir}/%{nvidia_name}/nvidia-application-profiles-%{version}-rc \
	%{buildroot}/usr/share/nvidia/nvidia-application-profiles-%{version}-rc
install -Dm 644 %{_builddir}/%{nvidia_name}/nvidia-application-profiles-%{version}-key-documentation \
	%{buildroot}/usr/share/nvidia/nvidia-application-profiles-%{version}-key-documentation

install -Dm 755 %{_builddir}/%{nvidia_name}/nvidia-cuda-mps-control \
	%{buildroot}/usr/bin/nvidia-cuda-mps-control
install -Dm 755 %{_builddir}/%{nvidia_name}/nvidia-cuda-mps-server \
	%{buildroot}/usr/bin/nvidia-cuda-mps-server
install -Dm 755 %{_builddir}/%{nvidia_name}/nvidia-modprobe \
	%{buildroot}/usr/bin/nvidia-modprobe
install -Dm 755 %{_builddir}/%{nvidia_name}/nvidia-debugdump \
	%{buildroot}/usr/bin/nvidia-debugdump
install -Dm 755 %{_builddir}/%{nvidia_name}/nvidia-persistenced \
	%{buildroot}/usr/bin/nvidia-persistenced

mkdir -p %{buildroot}/usr/lib64/nvidia
mv -v %{_builddir}/%{nvidia_name}/*.so* %{buildroot}/usr/lib64/nvidia/

install -dm755 %{buildroot}/%{_datadir}/OpenCL/vendors
install -Dm644 %{_builddir}/%{nvidia_name}/nvidia.icd \
	%{buildroot}/%{_datadir}/OpenCL/vendors/
install -dm755 %{buildroot}/usr/share/vulkan/icd.d/
install -Dm 644 %{_builddir}/%{nvidia_name}/{nvidia_icd.json,nvidia_layers.json} \
	%{buildroot}/usr/share/vulkan/icd.d/
install -dm755 %{buildroot}/usr/share/glvnd/egl_vendor.d
install -Dm 644 %{_builddir}/%{nvidia_name}/{10_nvidia.json,10_nvidia_wayland.json} \
       %{buildroot}/usr/share/glvnd/egl_vendor.d/
install -Dm 755 %{_builddir}/%{nvidia_name}/nvidia-smi \
	%{buildroot}/usr/bin/nvidia-smi

# soft links
#cd %{buildroot}/usr/lib64/xorg/modules/extensions/nvidia
#ln -s nvidia-libglx.so.* nvidia-libglx.so.1
cd %{buildroot}/usr/lib64/vdpau
ln -s libvdpau_nvidia.so.* libvdpau_nvidia.so.1
cd %{buildroot}/usr/lib64/nvidia
ln -s libGL.so.1.* libGL.so.1
ln -s libnvcuvid.so.* libnvcuvid.so.1
ln -s libGLESv1_CM_nvidia.so.* libGLESv1_CM_nvidia.so.1
ln -s libGLESv2_nvidia.so.* libGLESv2_nvidia.so.2
ln -s libGLX_nvidia.so.* libGLX_nvidia.so.0
ln -s libEGL_nvidia.so.* libEGL_nvidia.so.0
ln -s libnvidia-encode.so.* libnvidia-encode.so.1
ln -s libnvidia-fbc.so.* libnvidia-fbc.so.1
ln -s libnvidia-ifr.so.* libnvidia-ifr.so.1
# soft links for nvidia-compute
ln -s libcuda.so.* libcuda.so.1
ln -s libcuda.so.1 libcuda.so
ln -s libOpenCL.so.1.0.* libOpenCL.so.1.0
ln -s libOpenCL.so.1.0 libOpenCL.so.1
ln -s libnvidia-ml.so.* libnvidia-ml.so.1
ln -s libnvidia-opencl.so.* libnvidia-opencl.so.1.0.0
ln -s libnvidia-opencl.so.1.0.0 libnvidia-opencl.so.1
#ln -s libnvidia-egl-wayland.so.1.0.2 libnvidia-egl-wayland.so.2
#ln -s libnvidia-egl-wayland.so.2 libnvidia-egl-wayland.so.1
# crutch for some crap ?
ln -s libnvidia-egl-wayland.so.* libnvidia-egl-wayland.so.1

install -dm755 %{buildroot}/etc/ld.so.conf.d
install -Dm644 %{_builddir}/nvidia.conf %{buildroot}/etc/ld.so.conf.d/

# ====================== 32 bit libraries ====================
install -dm755 %{buildroot}/usr/lib/nvidia
for file in %{_builddir}/%{nvidia_name}/32/*.so.*; do
    install -Dm755 $file %{buildroot}/usr/lib/nvidia/
done
# mv libEGL.so.1 to libEGL.so.1.0.0 to avoid ldconfig complain
#mv %{buildroot}/usr/lib/nvidia/libEGL.so.1 %{buildroot}/usr/lib/nvidia/libEGL.so.1.0.0
#rm %{buildroot}/usr/lib/nvidia/libGL.so.%{version}
#install -dm755 %{buildroot}/usr/lib/nvidia/tls
#install -Dm755 %{_builddir}/%{nvidia_name}/32/tls/libnvidia-tls.so.%{version} %{buildroot}/usr/lib/nvidia/tls/
install -dm755 %{buildroot}/usr/lib/vdpau
mv %{buildroot}/usr/lib/nvidia/libvdpau_nvidia.so.%{version} %{buildroot}/usr/lib/vdpau/
# Create soft link for 32 bit libraries
cd %{buildroot}/usr/lib/vdpau
ln -s libvdpau_nvidia.so.* libvdpau_nvidia.so.1
cd %{buildroot}/usr/lib/nvidia
ln -s libGL.so.1.* libGL.so.1
ln -s libnvcuvid.so.* libnvcuvid.so.1
ln -s libGLESv1_CM_nvidia.so.* libGLESv1_CM_nvidia.so.1
ln -s libGLESv2_nvidia.so.* libGLESv2_nvidia.so.2
ln -s libGLX_nvidia.so.* libGLX_nvidia.so.0
ln -s libEGL_nvidia.so.* libEGL_nvidia.so.0
ln -s libnvidia-encode.so.* libnvidia-encode.so.1
ln -s libnvidia-fbc.so.* libnvidia-fbc.so.1
ln -s libnvidia-ifr.so.* libnvidia-ifr.so.1
# soft links for 32bit nvidia
ln -s libcuda.so.* libcuda.so.1
ln -s libcuda.so.1 libcuda.so
ln -s libOpenCL.so.1.0.* libOpenCL.so.1.0
ln -s libOpenCL.so.1.0 libOpenCL.so.1
ln -s libnvidia-ml.so.* libnvidia-ml.so.1
ln -s libnvidia-opencl.so.* libnvidia-opencl.so.1.0.0
ln -s libnvidia-opencl.so.1.0.0 libnvidia-opencl.so.1
ln -s libEGL.so.1.1.0 libEGL.so.1

#post -n xf86-video-nvidia-glx
# In post section, if $1 == 1, it means in install. If $1 == 2, it means in upgrade and we do not need to change.
#if [ $1 -eq 1 ] ; then
#    update-alternatives --install "/usr/lib64/xorg/modules/extensions/libglx.so" "libglx.so" \
#			"/usr/lib64/xorg/modules/extensions/nvidia/nvidia-libglx.so.1" 70
#    update-alternatives --set "libglx.so" \
#			"/usr/lib64/xorg/modules/extensions/nvidia/nvidia-libglx.so.1"
#fi

#postun -n xf86-video-nvidia-glx
# in postun section, if $1 == 0, it means in uninstall. If $1 == 1, it means in upgrade.
#if [ $1 -eq 0 ] ; then
#    update-alternatives --auto "libglx.so"
#fi

%post 32bit -p /sbin/ldconfig
%postun 32bit -p /sbin/ldconfig
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig

%files libOpenCL
%defattr(-,root,root)
/usr/lib64/nvidia/libnvidia-opencl.so*
/usr/lib64/nvidia/libOpenCL.so*
%{_datadir}/OpenCL
%{_datadir}/OpenCL/vendors
%config %{_datadir}/OpenCL/vendors/nvidia.icd

%files libOpenCL-32bit
/usr/lib/nvidia/libnvidia-opencl.so*
/usr/lib/nvidia/libOpenCL.so*

%files -n xf86-video-nvidia-glx
%defattr(-,root,root)
/usr/lib64/xorg
/usr/share/X11
/usr/bin/nvidia-xconfig

%files
%defattr(-,root,root)
%ghost %dir /etc/vulkan
%ghost %dir /etc/vulkan/icd.d
%dir /usr/share/vulkan
%dir /usr/share/vulkan/icd.d
/usr/share/vulkan/icd.d/*.json
%config /etc/modprobe.d/nvidia.conf 
%dir /usr/share/glvnd
%dir /usr/share/glvnd/egl_vendor.d
%config /usr/share/glvnd/egl_vendor.d/*.json
%docdir /usr/share/doc/nvidia
%license /usr/share/licenses/nvidia/LICENSE
/usr/share/doc/nvidia
/usr/share/licenses/nvidia
/usr/bin/nvidia-cuda-mps-control
/usr/bin/nvidia-cuda-mps-server
/usr/bin/nvidia-debugdump
/usr/bin/nvidia-modprobe
/usr/bin/nvidia-persistenced
/usr/bin/nvidia-settings
/usr/bin/nvidia-smi
/usr/lib64/nvidia
/usr/lib64/vdpau
/usr/share/nvidia
%exclude /usr/lib64/nvidia/libnvidia-opencl.so.%{version}
%exclude /usr/lib64/nvidia/libOpenCL.so.1.0.0
%exclude /usr/lib64/nvidia/libOpenCL.so.1 
%exclude /usr/lib64/nvidia/libnvidia-opencl.so.1
%config /etc/ld.so.conf.d/nvidia.conf

%files 32bit
%defattr(-,root,root)
/usr/lib/nvidia
/usr/lib/vdpau
%exclude /usr/lib/nvidia/libnvidia-opencl.so.%{version}
%exclude /usr/lib/nvidia/libOpenCL.so.1.0.0 
%exclude /usr/lib/nvidia/libOpenCL.so.1 
%exclude /usr/lib/nvidia/libnvidia-opencl.so.1
%changelog
openSUSE Build Service is sponsored by