x11-drivers/nvidia-drivers-185.18.14-r1: Add 2.6.31 Kernel patch
[otih-overlay.git] / x11-drivers / nvidia-drivers / nvidia-drivers-185.18.14-r1.ebuild
blob2d6feca3eb43b476f43e341fa3dbbefd5a49d254
1 # Copyright 1999-2009 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: $
5 inherit eutils multilib versionator linux-mod flag-o-matic nvidia-driver
7 X86_NV_PACKAGE="NVIDIA-Linux-x86-${PV}"
8 AMD64_NV_PACKAGE="NVIDIA-Linux-x86_64-${PV}"
9 X86_FBSD_NV_PACKAGE="NVIDIA-FreeBSD-x86-${PV}"
11 DESCRIPTION="NVIDIA X11 driver and GLX libraries"
12 HOMEPAGE="http://www.nvidia.com/"
13 SRC_URI="x86? ( ftp://download.nvidia.com/XFree86/Linux-x86/${PV}/${X86_NV_PACKAGE}-pkg0.run )
14 amd64? ( ftp://download.nvidia.com/XFree86/Linux-x86_64/${PV}/${AMD64_NV_PACKAGE}-pkg2.run )
15 x86-fbsd? ( ftp://download.nvidia.com/freebsd/${PV}/${X86_FBSD_NV_PACKAGE}.tar.gz )"
17 LICENSE="NVIDIA"
18 SLOT="0"
19 KEYWORDS=""
20 IUSE="acpi custom-cflags gtk multilib kernel_linux"
21 RESTRICT="strip"
22 EMULTILIB_PKG="true"
24 COMMON="<x11-base/xorg-server-1.6.99
25 multilib? ( app-emulation/emul-linux-x86-xlibs )
26 kernel_FreeBSD? ( !media-video/nvidia-freebsd )
27 !app-emulation/emul-linux-x86-nvidia
28 !x11-drivers/nvidia-legacy-drivers"
29 DEPEND="${COMMON}
30 kernel_linux? ( virtual/linux-sources )
31 app-admin/eselect-opengl"
32 RDEPEND="${COMMON}
33 kernel_linux? ( virtual/modutils )
34 media-libs/mesa
35 acpi? ( sys-power/acpid )"
36 PDEPEND="gtk? ( media-video/nvidia-settings )"
38 QA_TEXTRELS_x86="usr/lib/libXvMCNVIDIA.so.${PV}
39 usr/lib/opengl/nvidia/no-tls/libnvidia-tls.so.${PV}
40 usr/lib/opengl/nvidia/tls/libnvidia-tls.so.${PV}
41 usr/lib/opengl/nvidia/lib/libGL.so.${PV}
42 usr/lib/opengl/nvidia/lib/libnvidia-cfg.so.${PV}
43 usr/lib/opengl/nvidia/lib/libGLcore.so.${PV}
44 usr/lib/opengl/nvidia/extensions/libglx.so
45 usr/lib/xorg/modules/drivers/nvidia_drv.so
46 usr/lib/libcuda.so.${PV}"
48 QA_TEXTRELS_x86_fbsd="boot/modules/nvidia.ko
49 usr/lib/opengl/nvidia/lib/libGL.so.1
50 usr/lib/opengl/nvidia/lib/libGLcore.so.1
51 usr/lib/opengl/nvidia/lib/libnvidia-cfg.so.1
52 usr/lib/opengl/nvidia/no-tls/libnvidia-tls.so.1
53 usr/lib/opengl/nvidia/extensions/libglx.so
54 usr/lib/xorg/modules/drivers/nvidia_drv.so"
56 QA_TEXTRELS_amd64="usr/lib32/opengl/nvidia/tls/libnvidia-tls.so.${PV}
57 usr/lib32/opengl/nvidia/no-tls/libnvidia-tls.so.${PV}
58 usr/lib32/opengl/nvidia/lib/libGLcore.so.${PV}
59 usr/lib32/opengl/nvidia/lib/libGL.so.${PV}
60 usr/lib32/opengl/nvidia/lib/libnvidia-cfg.so.${PV}
61 usr/lib32/libcuda.so.${PV}"
63 QA_EXECSTACK_x86="usr/lib/opengl/nvidia/lib/libGL.so.${PV}
64 usr/lib/opengl/nvidia/lib/libGLcore.so.${PV}
65 usr/lib/opengl/nvidia/extensions/libglx.so"
67 QA_EXECSTACK_amd64="usr/lib32/opengl/nvidia/lib/libGLcore.so.${PV}
68 usr/lib32/opengl/nvidia/lib/libGL.so.${PV}
69 usr/lib64/xorg/modules/drivers/nvidia_drv.so
70 usr/lib64/libXvMCNVIDIA.so.${PV}
71 usr/lib64/opengl/nvidia/tls/libnvidia-tls.so.${PV}
72 usr/lib64/opengl/nvidia/no-tls/libnvidia-tls.so.${PV}
73 usr/lib64/opengl/nvidia/lib/libGLcore.so.${PV}
74 usr/lib64/opengl/nvidia/lib/libGL.so.${PV}
75 usr/lib64/opengl/nvidia/lib/libnvidia-cfg.so.${PV}
76 usr/lib64/opengl/nvidia/extensions/libglx.so
77 usr/bin/nvidia-xconfig"
79 QA_WX_LOAD_x86="usr/lib/opengl/nvidia/lib/libGLcore.so.${PV}
80 usr/lib/opengl/nvidia/lib/libGL.so.${PV}
81 usr/lib/opengl/nvidia/extensions/libglx.so"
83 QA_WX_LOAD_amd64="usr/lib32/opengl/nvidia/lib/libGLcore.so.${PV}
84 usr/lib32/opengl/nvidia/lib/libGL.so.${PV}
85 usr/lib64/opengl/nvidia/lib/libGLcore.so.${PV}
86 usr/lib64/opengl/nvidia/lib/libGL.so.${PV}
87 usr/lib64/opengl/nvidia/extensions/libglx.so"
89 if use x86; then
90 PKG_V="-pkg0"
91 NV_PACKAGE="${X86_NV_PACKAGE}"
92 elif use amd64; then
93 PKG_V="-pkg2"
94 NV_PACKAGE="${AMD64_NV_PACKAGE}"
95 elif use x86-fbsd; then
96 PKG_V=""
97 NV_PACKAGE="${X86_FBSD_NV_PACKAGE}"
100 S="${WORKDIR}/${NV_PACKAGE}${PKG_V}"
102 mtrr_check() {
103 ebegin "Checking for MTRR support"
104 linux_chkconfig_present MTRR
105 eend $?
107 if [[ $? -ne 0 ]] ; then
108 eerror "Please enable MTRR support in your kernel config, found at:"
109 eerror
110 eerror " Processor type and features"
111 eerror " [*] MTRR (Memory Type Range Register) support"
112 eerror
113 eerror "and recompile your kernel ..."
114 die "MTRR support not detected!"
118 paravirt_check() {
119 ebegin "Checking for Paravirtualized guest support"
120 linux_chkconfig_present PARAVIRT
122 if [[ $? -eq 0 ]]; then
123 eerror "Please disable PARAVIRT in your kernel config, found at:"
124 eerror
125 eerror " Processor type and features"
126 eerror " [*] Paravirtualized guest support"
127 eerror
128 eerror "or XEN support"
129 eerror
130 eerror "and recompile your kernel .."
131 die "PARAVIRT support detected!"
135 pkg_setup() {
136 # try to turn off distcc and ccache for people that have a problem with it
137 export DISTCC_DISABLE=1
138 export CCACHE_DISABLE=1
140 if use amd64 && has_multilib_profile && [ "${DEFAULT_ABI}" != "amd64" ]; then
141 eerror "This ebuild doesn't currently support changing your default abi."
142 die "Unexpected \${DEFAULT_ABI} = ${DEFAULT_ABI}"
145 if use kernel_linux; then
146 linux-mod_pkg_setup
147 MODULE_NAMES="nvidia(video:${S}/usr/src/nv)"
148 BUILD_PARAMS="IGNORE_CC_MISMATCH=yes V=1 SYSSRC=${KV_DIR} \
149 SYSOUT=${KV_OUT_DIR} HOST_CC=$(tc-getBUILD_CC)"
150 mtrr_check
151 paravirt_check
154 # On BSD userland it wants real make command
155 use userland_BSD && MAKE="$(get_bmake)"
157 export _POSIX2_VERSION="199209"
159 # Since Nvidia ships 3 different series of drivers, we need to give the user
160 # some kind of guidance as to what version they should install. This tries
161 # to point the user in the right direction but can't be perfect. check
162 # nvidia-driver.eclass
163 nvidia-driver-check-warning
165 # set variables to where files are in the package structure
166 if use kernel_FreeBSD; then
167 NV_DOC="${S}/doc"
168 NV_EXEC="${S}/obj"
169 NV_SRC="${S}/src"
170 elif use kernel_linux; then
171 NV_DOC="${S}/usr/share/doc"
172 NV_EXEC="${S}/usr/bin"
173 NV_SRC="${S}/usr/src/nv"
174 else
175 die "Could not determine proper NVIDIA package"
179 src_unpack() {
180 if use kernel_linux && kernel_is lt 2 6 7; then
181 echo
182 ewarn "Your kernel version is ${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
183 ewarn "This is not officially supported for ${P}. It is likely you"
184 ewarn "will not be able to compile or use the kernel module."
185 ewarn "It is recommended that you upgrade your kernel to a version >= 2.6.7"
186 echo
187 ewarn "DO NOT file bug reports for kernel versions less than 2.6.7 as they will be ignored."
190 if ! use x86-fbsd; then
191 mkdir "${S}"
192 cd "${S}"
193 unpack_makeself
194 else
195 unpack ${A}
198 # Patches go below here, add brief description
199 cd "${S}"
200 use x86-fbsd && cd doc
202 # Use the correct defines to make gtkglext build work
203 epatch "${FILESDIR}"/NVIDIA_glx-defines.patch
204 # Use some more sensible gl headers and make way for new glext.h
205 epatch "${FILESDIR}"/NVIDIA_glx-glheader.patch
207 # Patch for 2.6.31 Kernel
208 epatch "${FILESDIR}"/nvidia-kernel-2.6.31.patch
210 # allow on board sensors to work with lm_sensors
211 if use kernel_linux; then
212 epatch "${FILESDIR}"/NVIDIA_i2c-hwmon.patch
215 if use kernel_linux; then
216 # Quiet down warnings the user does not need to see
217 sed -i \
218 -e 's:-Wpointer-arith::g' \
219 -e 's:-Wsign-compare::g' \
220 "${NV_SRC}"/Makefile.kbuild
222 # If you set this then it's your own fault when stuff breaks :)
223 use custom-cflags && sed -i "s:-O:${CFLAGS}:" "${NV_SRC}"/Makefile.*
225 # If greater than 2.6.5 use M= instead of SUBDIR=
226 convert_to_m "${NV_SRC}"/Makefile.kbuild
230 src_compile() {
231 # This is already the default on Linux, as there's no toplevel Makefile, but
232 # on FreeBSD there's one and triggers the kernel module build, as we install
233 # it by itself, pass this.
235 cd "${NV_SRC}"
236 if use x86-fbsd; then
237 MAKE="$(get_bmake)" CFLAGS="-Wno-sign-compare" emake CC="$(tc-getCC)" \
238 LD="$(tc-getLD)" LDFLAGS="$(raw-ldflags)" || die
239 elif use kernel_linux; then
240 linux-mod_src_compile
244 src_install() {
245 local MLTEST=$(type dyn_unpack)
247 cd "${S}"
249 if use kernel_linux; then
250 linux-mod_src_install
252 VIDEOGROUP="$(egetent group video | cut -d ':' -f 3)"
253 if [ -z "$VIDEOGROUP" ]; then
254 eerror "Failed to determine the video group gid."
255 die "Failed to determine the video group gid."
258 # Add the aliases
259 [ -f "${FILESDIR}/nvidia" ] || die "nvidia missing in FILESDIR"
260 sed -e 's:PACKAGE:'${PF}':g' \
261 -e 's:VIDEOGID:'${VIDEOGROUP}':' "${FILESDIR}"/nvidia-169.07 > \
262 "${WORKDIR}"/nvidia
263 insinto /etc/modprobe.d
264 doins "${WORKDIR}"/nvidia || die
265 elif use x86-fbsd; then
266 insinto /boot/modules
267 doins "${WORKDIR}/${NV_PACKAGE}/src/nvidia.kld" || die
269 exeinto /boot/modules
270 doexe "${WORKDIR}/${NV_PACKAGE}/src/nvidia.ko" || die
273 if has_multilib_profile ; then
274 local OABI=${ABI}
275 for ABI in $(get_install_abis) ; do
276 src_install-libs
277 done
278 ABI=${OABI}
279 unset OABI
280 elif use amd64 ; then
281 src_install-libs lib32 $(get_multilibdir)
282 src_install-libs lib $(get_libdir)
284 rm -rf "${D}"/usr/$(get_multilibdir)/opengl/nvidia/include
285 rm -rf "${D}"/usr/$(get_multilibdir)/opengl/nvidia/extensions
286 else
287 src_install-libs
290 is_final_abi || return 0
292 # Documentation
293 dodoc "${NV_DOC}"/{XF86Config.sample,Copyrights}
294 dohtml "${NV_DOC}"/html/*
295 if use x86-fbsd; then
296 dodoc "${NV_DOC}/README"
297 else
298 # Docs
299 newdoc "${NV_DOC}/README.txt" README
300 dodoc "${NV_DOC}/NVIDIA_Changelog"
303 # Helper Apps
304 dobin ${NV_EXEC}/nvidia-xconfig || die
305 dobin ${NV_EXEC}/nvidia-bug-report.sh || die
308 # Install nvidia library:
309 # the first parameter is the place where to install it
310 # the second parameter is the base name of the library
311 # the third parameter is the provided soversion
312 donvidia() {
313 dodir $1
314 exeinto $1
316 libname=$(basename $2)
318 # libnvidia-cfg.so is no longer supplied in lib32; step over it gracefully
319 if [ -e $2.$3 ] ; then
320 doexe $2.$3
321 dosym ${libname}.$3 $1/${libname}
322 [[ $3 != "1" ]] && dosym ${libname}.$3 $1/${libname}.1
326 src_install-libs() {
327 local pkglibdir=lib
328 local inslibdir=$(get_libdir)
330 if [[ ${#} -eq 2 ]] ; then
331 pkglibdir=${1}
332 inslibdir=${2}
333 elif has_multilib_profile && [[ ${ABI} == "x86" ]] ; then
334 pkglibdir=lib32
337 local usrpkglibdir=usr/${pkglibdir}
338 local libdir=usr/X11R6/${pkglibdir}
339 local drvdir=${libdir}/modules/drivers
340 local extdir=${libdir}/modules/extensions
341 local incdir=usr/include/GL
342 local sover=${PV}
343 local NV_ROOT="/usr/${inslibdir}/opengl/nvidia"
344 local NO_TLS_ROOT="${NV_ROOT}/no-tls"
345 local TLS_ROOT="${NV_ROOT}/tls"
346 local X11_LIB_DIR="/usr/${inslibdir}/xorg"
348 if use x86-fbsd; then
349 # on FreeBSD everything is on obj/
350 pkglibdir=obj
351 usrpkglibdir=obj
352 x11pkglibdir=obj
353 drvdir=obj
354 extdir=obj
356 # don't ask me why the headers are there.. glxext.h is missing
357 incdir=doc
359 # on FreeBSD it has just .1 suffix
360 sover=1
363 # The GLX libraries
364 donvidia ${NV_ROOT}/lib ${usrpkglibdir}/libGL.so ${sover}
365 donvidia ${NV_ROOT}/lib ${usrpkglibdir}/libGLcore.so ${sover}
367 donvidia ${NV_ROOT}/lib ${usrpkglibdir}/libnvidia-cfg.so ${sover}
369 dodir ${NO_TLS_ROOT}
370 donvidia ${NO_TLS_ROOT} ${usrpkglibdir}/libnvidia-tls.so ${sover}
372 if ! use x86-fbsd; then
373 donvidia ${TLS_ROOT} ${usrpkglibdir}/tls/libnvidia-tls.so ${sover}
376 if want_tls ; then
377 dosym ../tls/libnvidia-tls.so ${NV_ROOT}/lib
378 dosym ../tls/libnvidia-tls.so.1 ${NV_ROOT}/lib
379 dosym ../tls/libnvidia-tls.so.${sover} ${NV_ROOT}/lib
380 else
381 dosym ../no-tls/libnvidia-tls.so ${NV_ROOT}/lib
382 dosym ../no-tls/libnvidia-tls.so.1 ${NV_ROOT}/lib
383 dosym ../no-tls/libnvidia-tls.so.${sover} ${NV_ROOT}/lib
386 if ! use x86-fbsd; then
387 # Install the .la file for libtool, to prevent e.g. bug #176423
388 [ -f "${FILESDIR}/libGL.la-r2" ] || die "libGL.la-r2 missing in FILESDIR"
389 local ver1=$(get_version_component_range 1)
390 local ver2=$(get_version_component_range 2)
391 local ver3=$(get_version_component_range 3)
392 sed -e "s:\${PV}:${PV}:" \
393 -e "s:\${ver1}:${ver1}:" \
394 -e "s:\${ver2}:${ver2}:" \
395 -e "s:\${ver3}:${ver3}:" \
396 -e "s:\${libdir}:${inslibdir}:" \
397 "${FILESDIR}"/libGL.la-r2 > "${D}"/${NV_ROOT}/lib/libGL.la
400 exeinto ${X11_LIB_DIR}/modules/drivers
402 [[ -f ${drvdir}/nvidia_drv.so ]] && \
403 doexe ${drvdir}/nvidia_drv.so
405 insinto /usr/${inslibdir}
406 [[ -f ${libdir}/libXvMCNVIDIA.a ]] && \
407 doins ${libdir}/libXvMCNVIDIA.a
408 exeinto /usr/${inslibdir}
409 # fix Bug 131315
410 [[ -f ${libdir}/libXvMCNVIDIA.so.${PV} ]] && \
411 doexe ${libdir}/libXvMCNVIDIA.so.${PV} && \
412 dosym libXvMCNVIDIA.so.${PV} \
413 /usr/${inslibdir}/libXvMCNVIDIA.so
415 exeinto ${NV_ROOT}/extensions
416 [[ -f ${libdir}/modules/libnvidia-wfb.so.${sover} ]] && \
417 newexe ${libdir}/modules/libnvidia-wfb.so.${sover} libwfb.so
418 [[ -f ${extdir}/libglx.so.${sover} ]] && \
419 newexe ${extdir}/libglx.so.${sover} libglx.so
421 # Includes
422 insinto ${NV_ROOT}/include
423 doins ${incdir}/*.h
425 #cuda
426 if [[ -f usr/include/cuda/cuda.h ]]; then
427 dodir /usr/include/cuda
428 insinto /usr/include/cuda
429 doins usr/include/cuda/*.h
431 if [[ -f usr/${pkglibdir}/libcuda.so.${PV} ]]; then
432 dolib.so usr/${pkglibdir}/libcuda.so.${PV}
433 dosym libcuda.so.${PV} /usr/${inslibdir}/libcuda.so.1
434 dosym libcuda.so.1 /usr/${inslibdir}/libcuda.so
438 #vdpau
439 if [[ -f usr/include/vdpau/vdpau.h ]]; then
440 dodir /usr/include/vdpau
441 insinto /usr/include/vdpau
442 doins usr/include/vdpau/*.h
444 for vdpaulib in vdpau_nvidia vdpau vdpau_trace; do
445 dolib.so usr/${pkglibdir}/lib${vdpaulib}.so.${PV}
446 dosym lib${vdpaulib}.so.${PV} /usr/${inslibdir}/lib${vdpaulib}.so.1
447 dosym lib${vdpaulib}.so.1 /usr/${inslibdir}/lib${vdpaulib}.so
448 done
452 pkg_preinst() {
454 # Clean the dynamic libGL stuff's home to ensure
455 # we dont have stale libs floating around
456 if [ -d "${ROOT}"/usr/lib/opengl/nvidia ] ; then
457 rm -rf "${ROOT}"/usr/lib/opengl/nvidia/*
459 # Make sure we nuke the old nvidia-glx's env.d file
460 if [ -e "${ROOT}"/etc/env.d/09nvidia ] ; then
461 rm -f "${ROOT}"/etc/env.d/09nvidia
465 pkg_postinst() {
466 if use kernel_linux; then
467 linux-mod_pkg_postinst
470 # Switch to the nvidia implementation
471 eselect opengl set --use-old nvidia
473 echo
474 elog "You must be in the video group to use the NVIDIA device"
475 elog "For more info, read the docs at"
476 elog "http://www.gentoo.org/doc/en/nvidia-guide.xml#doc_chap3_sect6"
477 elog
479 elog "This ebuild installs a kernel module and X driver. Both must"
480 elog "match explicitly in their version. This means, if you restart"
481 elog "X, you most modprobe -r nvidia before starting it back up"
482 elog
484 elog "To use the NVIDIA GLX, run \"eselect opengl set nvidia\""
485 elog
486 elog "nVidia has requested that any bug reports submitted have the"
487 elog "output of /usr/bin/nvidia-bug-report.sh included."
488 elog
489 elog "To work with compiz, you must enable the AddARGBGLXVisuals option."
490 elog
491 elog "If you are having resolution problems, try disabling DynamicTwinView."
492 echo
495 want_tls() {
496 # For uclibc or anything non glibc, return false
497 has_version sys-libs/glibc || return 1
499 # Old versions of glibc were lt/no-tls only
500 has_version '<sys-libs/glibc-2.3.2' && return 1
502 if use x86 ; then
503 case ${CHOST/-*} in
504 i486|i586|i686) ;;
505 *) return 1 ;;
506 esac
509 # If we've got nptl, we've got tls
510 built_with_use --missing true sys-libs/glibc nptl && return 0
512 # 2.3.5 turned off tls for linuxthreads glibc on i486 and i586
513 if use x86 && has_version '>=sys-libs/glibc-2.3.5' ; then
514 case ${CHOST/-*} in
515 i486|i586) return 1 ;;
516 esac
519 # These versions built linuxthreads version to support tls, too
520 has_version '>=sys-libs/glibc-2.3.4.20040619-r2' && return 0
522 return 1
525 pkg_postrm() {
526 if use kernel_linux; then
527 linux-mod_pkg_postrm
529 eselect opengl set --use-old xorg-x11