File nvidia-gfxG03.spec of Package nvidia-gfxG03

#
# spec file for package nvidia-gfxG03
#
# Copyright (c) 2017 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# 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 http://bugs.opensuse.org/
#

# kABI symbols are no longer generated with openSUSE >= 13.1, since they
# became useless with zypper's 'multiversion' feature enabled for the kernel
# as default (multiple kernels can be installed at the same time; with
# different kABI symbols of course!). So it has been decided to match on the
# uname output of the kernel only. We cannot use that one for NVIDIA, since we
# only build against GA kernel. So let's get rid of this requirement.
#
%global __requires_exclude kernel-uname-r*

Name:           nvidia-gfxG03
Version:        340.108
Release:        0
License:        SUSE-NonFree
Summary:        NVIDIA graphics driver kernel module for GeForce 8xxx and newer GPUs
URL:            https://www.nvidia.com/object/unix.html
Group:          System/Kernel
Source0:        http://download.nvidia.com/XFree86/Linux-x86/%{version}/NVIDIA-Linux-x86-%{version}.run
Source1:        http://download.nvidia.com/XFree86/Linux-x86_64/%{version}/NVIDIA-Linux-x86_64-%{version}.run
Source3:        preamble
Source4:        pci_ids-%{version}
Source5:        pci_ids-%{version}.new
Source6:        generate-service-file.sh
Source7:        README
Source8:        kmp-filelist
Source9:        kmp-filelist-old
Source10:       kmp-post.sh
Source11:       kmp-post-old.sh
Source12:       my-find-supplements
Source13:       kmp-preun.sh
Source14:       kmp-preun-old.sh
Source15:       kmp-pre.sh
Source16:       alternate-install-present
Source17:       pci_ids-%{version}.legacy
Source18:       kmp-postun-old.sh
Source19:       kmp-postun.sh
NoSource:       0
NoSource:       1
NoSource:       6
NoSource:       7
Patch0:         kernel-4.11.patch
BuildRequires:  kernel-source
BuildRequires:  kernel-syms
%if 0%{?sle_version} >= 124000 && !0%{?is_opensuse} 
BuildRequires:  kernel-syms-azure
%endif
BuildRequires:  module-init-tools
BuildRequires:  update-alternatives
%if 0%{?suse_version} >= 1330
BuildRequires:  libelf-devel
%endif
BuildRoot:      %{_tmppath}/%{name}-%{version}-build
ExclusiveArch:  %ix86 x86_64
# patch the kmp template
%if 0%{?suse_version} > 1100
%define kmp_template -t
%define kmp_filelist kmp-filelist
%define kmp_post kmp-post.sh
%define kmp_preun kmp-preun.sh
%define kmp_pre kmp-pre.sh
%define kmp_postun kmp-postun.sh
%else
%define kmp_template -s
%define kmp_filelist kmp-filelist-old
%define kmp_post kmp-post-old.sh
%define kmp_preun kmp-preun-old.sh
%define kmp_pre kmp-pre.sh
%define kmp_postun kmp-postun-old.sh
%endif
%if 0%{!?kmp_template_name:1}
%if 0%{?suse_version} > 1010
%define kmp_template_name /usr/lib/rpm/kernel-module-subpackage
%else
%define kmp_template_name /usr/lib/rpm/rpm-suse-kernel-module-subpackage
%endif
%endif
%(sed -e '/^%%post\>/ r %_sourcedir/%kmp_post' -e '/^%%preun\>/ r %_sourcedir/%kmp_preun' -e '/^%%pre\>/ r %_sourcedir/%kmp_pre' -e '/^%%postun\>/ r %_sourcedir/%kmp_postun' -e '/^Provides: multiversion(kernel)/d' %kmp_template_name >%_builddir/nvidia-kmp-template)
%(cp %_builddir/nvidia-kmp-template %_builddir/nvidia-kmp-template.old)
# moved from %kmp_post snippet to this place (boo#1145316)
%(sed -i '/^%%posttrans/i \
exit $RES' %_builddir/nvidia-kmp-template)
# if %pre scriptlet sample missing in template
%(grep -q "^%pre -n" %_builddir/nvidia-kmp-template || (echo "%pre -n %%{-n*}-kmp-%1" >> %_builddir/nvidia-kmp-template; cat %_sourcedir/%kmp_pre >> %_builddir/nvidia-kmp-template))
# Leap 42.3/sle12-sp3 needs this to recompile module after having
# uninstalled drm-kmp package (%triggerpostun)
%if 0%{?suse_version} < 1320 && 0%{?sle_version} >= 120300
%(echo "%triggerpostun -n %%{-n*}-kmp-%1 -- drm-kmp-default" >> %_builddir/nvidia-kmp-template)
%(cat %_sourcedir/%kmp_preun               >> %_builddir/nvidia-kmp-template)
%(cat %_sourcedir/%kmp_post                >> %_builddir/nvidia-kmp-template)
%(echo 'nvr=%%{-n*}-kmp-%1-%_this_kmp_version-%%{-r*}' >> %_builddir/nvidia-kmp-template)
%(echo 'wm2=/usr/lib/module-init-tools/weak-modules2' >> %_builddir/nvidia-kmp-template)
%(echo 'if [ -x $wm2 ]; then' >> %_builddir/nvidia-kmp-template)
%(echo '    %%{-b:KMP_NEEDS_MKINITRD=1} INITRD_IN_POSTTRANS=1 /bin/bash -${-/e/} $wm2 --add-kmp $nvr' >> %_builddir/nvidia-kmp-template)
%(echo 'fi' >> %_builddir/nvidia-kmp-template)
# moved from %kmp_post snippet to this place (boo#1145316)
%(echo 'exit $RES' >> %_builddir/nvidia-kmp-template)
# Let all initrds get generated by regenerate-initrd-posttrans
# if drm-kmp-default gets uninstalled
%(echo "%%{?regenerate_initrd_posttrans}"  >> %_builddir/nvidia-kmp-template)
%endif
%define x_flavors kdump um debug xen xenpae
%if 0%{!?nvbuild:1}
%define kver %(for dir in /usr/src/linux-obj/*/*/; do make %{?jobs:-j%jobs} -s -C "$dir" kernelversion; break; done |perl -ne '/(\\d+)\\.(\\d+)\\.(\\d+)?/&&printf "%%d%%02d%%03d\\n",$1,$2,$3')
%if %kver >= 206027
%if %kver < 206031
%define x_flavors kdump um debug
%endif
%endif
%endif
%kernel_module_package %kmp_template %_builddir/nvidia-kmp-template -p %_sourcedir/preamble -f %_sourcedir/%kmp_filelist -x %x_flavors

# supplements no longer depend on the driver
%if 0%{?suse_version} > 1220
%if 0%{?suse_version} > 1320 || (0%{?suse_version} == 1315 && 0%{?is_opensuse})
%define pci_id_file %_sourcedir/pci_ids-%version.legacy
%else
%define pci_id_file %_sourcedir/pci_ids-%version
%endif
%else
%define pci_id_file %_sourcedir/pci_ids-%version.new
%endif
# rpm 4.14.1 changed again (boo#1087460)
%define __kmp_supplements %_sourcedir/my-find-supplements %pci_id_file
# rpm 4.9+ using the internal dependency generators
%define __ksyms_supplements %_sourcedir/my-find-supplements %pci_id_file %name
# older rpm
%define __find_supplements %_sourcedir/my-find-supplements %pci_id_file %name

%description
This package provides the closed-source NVIDIA graphics driver kernel
module for GeForce 8xxx and newer GPUs.

%package KMP
License:        SUSE-NonFree
Summary:        NVIDIA graphics driver kernel module for GeForce 8xxx and newer GPUs
Group:          System/Kernel

%description KMP
This package provides the closed-source NVIDIA graphics driver kernel
module for GeForce 8xxx and newer GPUs.

%prep
echo "kver = %kver"
%setup -T -c %{name}-%{version}
%ifarch %ix86
 sh %{SOURCE0} -x
%endif
%ifarch x86_64
 sh %{SOURCE1} -x
%endif
pushd NVIDIA-Linux-x86*-%{version}*/
# apply patches here ...
%patch0 -p1
popd
#rm -rf NVIDIA-Linux-x86*-%{version}-*/usr/src/nv/precompiled
mkdir -p source/%{version}
rm -rf NVIDIA-Linux-x86*-%{version}*/kernel/uvm
cp NVIDIA-Linux-x86*-%{version}*/kernel/* source/%{version} || :
pushd source/%{version}
 # mark support as external
 echo "nvidia.ko external" > Module.supported
 ### Bug 123456
 #sed -i /0x1234/d %_sourcedir/pci_ids-%{version}
 #sed -i /0x1234/d %_sourcedir/pci_ids-%{version}.new
 ### Bugs 768020, 751730, HP Afterburn (NUE 1062)
 cat >> %_sourcedir/pci_ids-%{version} << EOF
0x0FFB 0x0FFB
0x0FFC 0x0FFC
0x11B6 0x11B6
EOF
 cat >> %_sourcedir/pci_ids-%{version}.new << EOF
0x0FFB 0x0FFB
0x0FFC 0x0FFC
0x11B6 0x11B6
EOF
 # Missing PCI IDs in sle11(bnc#920799), G04 (also covering these) cannot be used for sle11!
%if 0%{?suse_version} < 1120
 cat >> %_sourcedir/pci_ids-%{version}.new << EOF
0x1340 GeForce 830A
0x1341 GeForce 840A
0x1380 GeForce GTX 750 Ti
0x1381 GeForce GTX 750
0x1382 GeForce GTX 745
0x1390 GeForce 845M
0x1391 GeForce GTX 850A
0x1392 GeForce GTX 750 Ti
0x1393 GeForce 840M
0x13BA Quadro K2200
0x13BB Quadro K620
EOF
%endif
 chmod 755 %_sourcedir/my-find-supplements*
popd
mkdir obj
sed -i -e 's,-o "$ARCH" = "x86_64",-o "$ARCH" = "x86_64" -o "$ARCH" = "x86",' source/*/conftest.sh

%build
export EXTRA_CFLAGS='-DVERSION=\"%{version}\"'
for flavor in %flavors_to_build; do
    src=/lib/modules/$(make %{?jobs:-j%jobs} -siC %{kernel_source $flavor} kernelrelease)/source
    %if 0%{?suse_version} <= 1020
    export SYSSRC=$src
    %endif
    rm -rf obj/$flavor
    cp -r source obj/$flavor
    make %{?jobs:-j%jobs} -C /usr/src/linux-obj/%_target_cpu/$flavor modules M=$PWD/obj/$flavor/%{version} SYSSRC="$src" SYSOUT=/usr/src/linux-obj/%_target_cpu/$flavor
    pushd $PWD/obj/$flavor/%{version}
    make %{?jobs:-j%jobs} -f Makefile nv-linux.o SYSSRC="$src" SYSOUT=/usr/src/linux-obj/%_target_cpu/$flavor
    popd
done

%install
### do not sign the ghost .ko file, it is generated on target system anyway
export BRP_PESIGN_FILES=""
export INSTALL_MOD_PATH=%{buildroot}
export INSTALL_MOD_DIR=updates
for flavor in %flavors_to_build; do
    export SYSSRC=/lib/modules/$(make %{?jobs:-j%jobs} -siC %{kernel_source $flavor} kernelrelease)/source
    make %{?jobs:-j%jobs} -C /usr/src/linux-obj/%_target_cpu/$flavor modules_install M=$PWD/obj/$flavor/%{version}
    #install -m 644 $PWD/obj/$flavor/%{version}/{nv-linux.o,nv-kernel.o} \
    #  %{buildroot}/lib/modules/*-$flavor/updates
    mkdir -p %{buildroot}/usr/src/kernel-modules/nvidia-%{version}-${flavor}
    cp -r source/%{version}/* %{buildroot}/usr/src/kernel-modules/nvidia-%{version}-${flavor}
done
mkdir -p %{buildroot}%{_sysconfdir}/modprobe.d
mkdir -p %{buildroot}/usr/lib/nvidia/
for flavor in %flavors_to_build; do
  echo "blacklist nouveau" > %{buildroot}%{_sysconfdir}/modprobe.d/nvidia-$flavor.conf
  # make it with flavor name or rpmlint complains about not making it conflict
  cp %{SOURCE16} %{buildroot}/usr/lib/nvidia/alternate-install-present-${flavor}
  touch %{buildroot}/usr/lib/nvidia/alternate-install-present
done
%changelog