1 # Copyright 1999-2009 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Header: /var/cvsroot/gentoo-x86/x11-drivers/nvidia-drivers/nvidia-drivers-180.60.ebuild,v 1.6 2009/08/03 00:47:30 cardoe Exp $
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 )"
19 KEYWORDS="-* amd64 x86 ~x86-fbsd"
20 IUSE="acpi custom-cflags gtk multilib kernel_linux"
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"
30 kernel_linux? ( virtual/linux-sources )
31 app-admin/eselect-opengl"
33 kernel_linux? ( virtual/modutils )
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}
47 usr/lib/libvdpau_nvidia.so.${PV}"
49 QA_TEXTRELS_x86_fbsd="boot/modules/nvidia.ko
50 usr/lib/opengl/nvidia/lib/libGL.so.1
51 usr/lib/opengl/nvidia/lib/libGLcore.so.1
52 usr/lib/opengl/nvidia/lib/libnvidia-cfg.so.1
53 usr/lib/opengl/nvidia/no-tls/libnvidia-tls.so.1
54 usr/lib/opengl/nvidia/extensions/libglx.so
55 usr/lib/xorg/modules/drivers/nvidia_drv.so"
57 QA_TEXTRELS_amd64="usr/lib32/opengl/nvidia/tls/libnvidia-tls.so.${PV}
58 usr/lib32/opengl/nvidia/no-tls/libnvidia-tls.so.${PV}
59 usr/lib32/opengl/nvidia/lib/libGLcore.so.${PV}
60 usr/lib32/opengl/nvidia/lib/libGL.so.${PV}
61 usr/lib32/opengl/nvidia/lib/libnvidia-cfg.so.${PV}
62 usr/lib32/libcuda.so.${PV}
63 usr/lib32/libvdpau_nvidia.so.${PV}"
65 QA_EXECSTACK_x86="usr/lib/opengl/nvidia/lib/libGL.so.${PV}
66 usr/lib/opengl/nvidia/lib/libGLcore.so.${PV}
67 usr/lib/opengl/nvidia/extensions/libglx.so"
69 QA_EXECSTACK_amd64="usr/lib32/opengl/nvidia/lib/libGLcore.so.${PV}
70 usr/lib32/opengl/nvidia/lib/libGL.so.${PV}
71 usr/lib64/xorg/modules/drivers/nvidia_drv.so
72 usr/lib64/libXvMCNVIDIA.so.${PV}
73 usr/lib64/opengl/nvidia/tls/libnvidia-tls.so.${PV}
74 usr/lib64/opengl/nvidia/no-tls/libnvidia-tls.so.${PV}
75 usr/lib64/opengl/nvidia/lib/libGLcore.so.${PV}
76 usr/lib64/opengl/nvidia/lib/libGL.so.${PV}
77 usr/lib64/opengl/nvidia/lib/libnvidia-cfg.so.${PV}
78 usr/lib64/opengl/nvidia/extensions/libglx.so
79 usr/bin/nvidia-xconfig
80 usr/lib64/libXvMCNVIDIA.a:NVXVMC.o"
82 QA_WX_LOAD_x86="usr/lib/opengl/nvidia/lib/libGLcore.so.${PV}
83 usr/lib/opengl/nvidia/lib/libGL.so.${PV}
84 usr/lib/opengl/nvidia/extensions/libglx.so
85 usr/lib/libXvMCNVIDIA.a"
87 QA_WX_LOAD_amd64="usr/lib32/opengl/nvidia/lib/libGLcore.so.${PV}
88 usr/lib32/opengl/nvidia/lib/libGL.so.${PV}
89 usr/lib64/opengl/nvidia/lib/libGLcore.so.${PV}
90 usr/lib64/opengl/nvidia/lib/libGL.so.${PV}
91 usr/lib64/opengl/nvidia/extensions/libglx.so"
93 # we really should have QA_DT_HASH_x86 and QA_DT_HASH_amd64 but Portage
94 # does not support it. bug #271416
96 QA_DT_HASH="usr/lib32/libvdpau_trace.so.${PV}
97 usr/lib32/libvdpau.so.${PV}
98 usr/lib32/libcuda.so.${PV}
99 usr/lib32/opengl/nvidia/no-tls/libnvidia-tls.so.${PV}
100 usr/lib32/opengl/nvidia/lib/libGLcore.so.${PV}
101 usr/lib32/opengl/nvidia/lib/libGL.so.${PV}
102 usr/lib32/opengl/nvidia/tls/libnvidia-tls.so.${PV}
103 usr/lib32/libvdpau_nvidia.so.${PV}
104 usr/bin/nvidia-xconfig
105 usr/lib64/libvdpau_trace.so.${PV}
106 usr/lib64/libvdpau.so.${PV}
107 usr/lib64/libcuda.so.${PV}
108 usr/lib64/opengl/nvidia/no-tls/libnvidia-tls.so.${PV}
109 usr/lib64/opengl/nvidia/lib/libnvidia-cfg.so.${PV}
110 usr/lib64/opengl/nvidia/lib/libGLcore.so.${PV}
111 usr/lib64/opengl/nvidia/lib/libGL.so.${PV}
112 usr/lib64/opengl/nvidia/tls/libnvidia-tls.so.${PV}
113 usr/lib64/opengl/nvidia/extensions/libwfb.so
114 usr/lib64/opengl/nvidia/extensions/libglx.so
115 usr/lib64/xorg/modules/drivers/nvidia_drv.so
116 usr/lib64/libXvMCNVIDIA.so.${PV}
117 usr/lib64/libvdpau_nvidia.so.${PV}
119 usr/lib/libvdpau_trace.so.${PV}
120 usr/lib/libvdpau.so.${PV}
121 usr/lib/libcuda.so.${PV}
122 usr/lib/opengl/nvidia/no-tls/libnvidia-tls.so.${PV}
123 usr/lib/opengl/nvidia/lib/libnvidia-cfg.so.${PV}
124 usr/lib/opengl/nvidia/lib/libGLcore.so.${PV}
125 usr/lib/opengl/nvidia/lib/libGL.so.${PV}
126 usr/lib/opengl/nvidia/tls/libnvidia-tls.so.${PV}
127 usr/lib/opengl/nvidia/extensions/libwfb.so
128 usr/lib/opengl/nvidia/extensions/libglx.so
129 usr/lib/xorg/modules/drivers/nvidia_drv.so
130 usr/lib/libXvMCNVIDIA.so.${PV}
131 usr/lib/libvdpau_nvidia.so.${PV}"
135 NV_PACKAGE="${X86_NV_PACKAGE}"
138 NV_PACKAGE="${AMD64_NV_PACKAGE}"
139 elif use x86-fbsd; then
141 NV_PACKAGE="${X86_FBSD_NV_PACKAGE}"
144 S="${WORKDIR}/${NV_PACKAGE}${PKG_V}"
147 ebegin "Checking for MTRR support"
148 linux_chkconfig_present MTRR
151 if [[ $? -ne 0 ]] ; then
152 eerror "Please enable MTRR support in your kernel config, found at:"
154 eerror " Processor type and features"
155 eerror " [*] MTRR (Memory Type Range Register) support"
157 eerror "and recompile your kernel ..."
158 die "MTRR support not detected!"
163 # try to turn off distcc and ccache for people that have a problem with it
164 export DISTCC_DISABLE=1
165 export CCACHE_DISABLE=1
167 if use amd64 && has_multilib_profile && [ "${DEFAULT_ABI}" != "amd64" ]; then
168 eerror "This ebuild doesn't currently support changing your default abi."
169 die "Unexpected \${DEFAULT_ABI} = ${DEFAULT_ABI}"
172 if use kernel_linux; then
174 MODULE_NAMES="nvidia(video:${S}/usr/src/nv)"
175 BUILD_PARAMS="IGNORE_CC_MISMATCH=yes V=1 SYSSRC=${KV_DIR} \
176 SYSOUT=${KV_OUT_DIR} HOST_CC=$(tc-getBUILD_CC)"
180 # On BSD userland it wants real make command
181 use userland_BSD && MAKE="$(get_bmake)"
183 export _POSIX2_VERSION="199209"
185 # Since Nvidia ships 3 different series of drivers, we need to give the user
186 # some kind of guidance as to what version they should install. This tries
187 # to point the user in the right direction but can't be perfect. check
188 # nvidia-driver.eclass
189 nvidia-driver-check-warning
191 # set variables to where files are in the package structure
192 if use kernel_FreeBSD; then
196 elif use kernel_linux; then
197 NV_DOC="${S}/usr/share/doc"
198 NV_EXEC="${S}/usr/bin"
199 NV_SRC="${S}/usr/src/nv"
201 die "Could not determine proper NVIDIA package"
206 if use kernel_linux && kernel_is lt 2 6 7; then
208 ewarn "Your kernel version is ${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}"
209 ewarn "This is not officially supported for ${P}. It is likely you"
210 ewarn "will not be able to compile or use the kernel module."
211 ewarn "It is recommended that you upgrade your kernel to a version >= 2.6.7"
213 ewarn "DO NOT file bug reports for kernel versions less than 2.6.7 as they will be ignored."
216 if ! use x86-fbsd; then
224 # Patches go below here, add brief description
226 use x86-fbsd && cd doc
228 # Use the correct defines to make gtkglext build work
229 epatch "${FILESDIR}"/NVIDIA_glx-defines.patch
230 # Use some more sensible gl headers and make way for new glext.h
231 epatch "${FILESDIR}"/NVIDIA_glx-glheader.patch
233 # only apply for > 2.6.30
234 if use kernel_linux && kernel_is gt 2 6 30; then
235 # fix for >2.6.30.* kernels
236 epatch "${FILESDIR}"/linux-kernel-agp_memory.patch
239 # only apply for > 2.6.30
240 if use kernel_linux && kernel_is gt 2 6 29; then
241 # fix for >2.6.30.* kernels
242 epatch "${FILESDIR}"/linux-kernel-i2c-client-register.patch
245 if use kernel_linux; then
246 # Quiet down warnings the user does not need to see
248 -e 's:-Wpointer-arith::g' \
249 -e 's:-Wsign-compare::g' \
250 "${NV_SRC}"/Makefile.kbuild
252 # If you set this then it's your own fault when stuff breaks :)
253 use custom-cflags && sed -i "s:-O:${CFLAGS}:" "${NV_SRC}"/Makefile.*
255 # If greater than 2.6.5 use M= instead of SUBDIR=
256 convert_to_m "${NV_SRC}"/Makefile.kbuild
261 # This is already the default on Linux, as there's no toplevel Makefile, but
262 # on FreeBSD there's one and triggers the kernel module build, as we install
263 # it by itself, pass this.
266 if use x86-fbsd; then
267 MAKE="$(get_bmake)" CFLAGS="-Wno-sign-compare" emake CC="$(tc-getCC)" \
268 LD="$(tc-getLD)" LDFLAGS="$(raw-ldflags)" || die
269 elif use kernel_linux; then
270 linux-mod_src_compile
275 local MLTEST=$(type dyn_unpack)
279 if use kernel_linux; then
280 linux-mod_src_install
282 VIDEOGROUP="$(egetent group video | cut -d ':' -f 3)"
283 if [ -z "$VIDEOGROUP" ]; then
284 eerror "Failed to determine the video group gid."
285 die "Failed to determine the video group gid."
289 [ -f "${FILESDIR}/nvidia" ] || die "nvidia missing in FILESDIR"
290 sed -e 's:PACKAGE:'${PF}':g' \
291 -e 's:VIDEOGID:'${VIDEOGROUP}':' "${FILESDIR}"/nvidia-169.07 > \
293 insinto /etc/modprobe.d
294 newins "${WORKDIR}"/nvidia nvidia.conf || die
295 elif use x86-fbsd; then
296 insinto /boot/modules
297 doins "${WORKDIR}/${NV_PACKAGE}/src/nvidia.kld" || die
299 exeinto /boot/modules
300 doexe "${WORKDIR}/${NV_PACKAGE}/src/nvidia.ko" || die
303 if has_multilib_profile ; then
305 for ABI in $(get_install_abis) ; do
310 elif use amd64 ; then
311 src_install-libs lib32 $(get_multilibdir)
312 src_install-libs lib $(get_libdir)
314 rm -rf "${D}"/usr/$(get_multilibdir)/opengl/nvidia/include
315 rm -rf "${D}"/usr/$(get_multilibdir)/opengl/nvidia/extensions
320 is_final_abi || return 0
323 dodoc "${NV_DOC}"/{XF86Config.sample,Copyrights}
324 dohtml "${NV_DOC}"/html/*
325 if use x86-fbsd; then
326 dodoc "${NV_DOC}/README"
329 newdoc "${NV_DOC}/README.txt" README
330 dodoc "${NV_DOC}/NVIDIA_Changelog"
334 dobin ${NV_EXEC}/nvidia-xconfig || die
335 dobin ${NV_EXEC}/nvidia-bug-report.sh || die
338 # Install nvidia library:
339 # the first parameter is the place where to install it
340 # the second parameter is the base name of the library
341 # the third parameter is the provided soversion
346 libname=$(basename $2)
348 # libnvidia-cfg.so is no longer supplied in lib32; step over it gracefully
349 if [ -e $2.$3 ] ; then
351 dosym ${libname}.$3 $1/${libname}
352 [[ $3 != "1" ]] && dosym ${libname}.$3 $1/${libname}.1
358 local inslibdir=$(get_libdir)
360 if [[ ${#} -eq 2 ]] ; then
363 elif has_multilib_profile && [[ ${ABI} == "x86" ]] ; then
367 local usrpkglibdir=usr/${pkglibdir}
368 local libdir=usr/X11R6/${pkglibdir}
369 local drvdir=${libdir}/modules/drivers
370 local extdir=${libdir}/modules/extensions
371 local incdir=usr/include/GL
373 local NV_ROOT="/usr/${inslibdir}/opengl/nvidia"
374 local NO_TLS_ROOT="${NV_ROOT}/no-tls"
375 local TLS_ROOT="${NV_ROOT}/tls"
376 local X11_LIB_DIR="/usr/${inslibdir}/xorg"
378 if use x86-fbsd; then
379 # on FreeBSD everything is on obj/
386 # don't ask me why the headers are there.. glxext.h is missing
389 # on FreeBSD it has just .1 suffix
394 donvidia ${NV_ROOT}/lib ${usrpkglibdir}/libGL.so ${sover}
395 donvidia ${NV_ROOT}/lib ${usrpkglibdir}/libGLcore.so ${sover}
397 donvidia ${NV_ROOT}/lib ${usrpkglibdir}/libnvidia-cfg.so ${sover}
400 donvidia ${NO_TLS_ROOT} ${usrpkglibdir}/libnvidia-tls.so ${sover}
402 if ! use x86-fbsd; then
403 donvidia ${TLS_ROOT} ${usrpkglibdir}/tls/libnvidia-tls.so ${sover}
407 dosym ../tls/libnvidia-tls.so ${NV_ROOT}/lib
408 dosym ../tls/libnvidia-tls.so.1 ${NV_ROOT}/lib
409 dosym ../tls/libnvidia-tls.so.${sover} ${NV_ROOT}/lib
411 dosym ../no-tls/libnvidia-tls.so ${NV_ROOT}/lib
412 dosym ../no-tls/libnvidia-tls.so.1 ${NV_ROOT}/lib
413 dosym ../no-tls/libnvidia-tls.so.${sover} ${NV_ROOT}/lib
416 if ! use x86-fbsd; then
417 # Install the .la file for libtool, to prevent e.g. bug #176423
418 [ -f "${FILESDIR}/libGL.la-r2" ] || die "libGL.la-r2 missing in FILESDIR"
419 local ver1=$(get_version_component_range 1)
420 local ver2=$(get_version_component_range 2)
421 local ver3=$(get_version_component_range 3)
422 sed -e "s:\${PV}:${PV}:" \
423 -e "s:\${ver1}:${ver1}:" \
424 -e "s:\${ver2}:${ver2}:" \
425 -e "s:\${ver3}:${ver3}:" \
426 -e "s:\${libdir}:${inslibdir}:" \
427 "${FILESDIR}"/libGL.la-r2 > "${D}"/${NV_ROOT}/lib/libGL.la
430 exeinto ${X11_LIB_DIR}/modules/drivers
432 [[ -f ${drvdir}/nvidia_drv.so ]] && \
433 doexe ${drvdir}/nvidia_drv.so
435 insinto /usr/${inslibdir}
436 [[ -f ${libdir}/libXvMCNVIDIA.a ]] && \
437 doins ${libdir}/libXvMCNVIDIA.a
438 exeinto /usr/${inslibdir}
440 [[ -f ${libdir}/libXvMCNVIDIA.so.${PV} ]] && \
441 doexe ${libdir}/libXvMCNVIDIA.so.${PV} && \
442 dosym libXvMCNVIDIA.so.${PV} \
443 /usr/${inslibdir}/libXvMCNVIDIA.so
445 exeinto ${NV_ROOT}/extensions
446 [[ -f ${libdir}/modules/libnvidia-wfb.so.${sover} ]] && \
447 newexe ${libdir}/modules/libnvidia-wfb.so.${sover} libwfb.so
448 [[ -f ${extdir}/libglx.so.${sover} ]] && \
449 newexe ${extdir}/libglx.so.${sover} libglx.so
452 insinto ${NV_ROOT}/include
456 if [[ -f usr/include/cuda/cuda.h ]]; then
457 dodir /usr/include/cuda
458 insinto /usr/include/cuda
459 doins usr/include/cuda/*.h
461 if [[ -f usr/${pkglibdir}/libcuda.so.${PV} ]]; then
462 dolib.so usr/${pkglibdir}/libcuda.so.${PV}
463 dosym libcuda.so.${PV} /usr/${inslibdir}/libcuda.so.1
464 dosym libcuda.so.1 /usr/${inslibdir}/libcuda.so
469 if [[ -f usr/include/vdpau/vdpau.h ]]; then
470 dodir /usr/include/vdpau
471 insinto /usr/include/vdpau
472 doins usr/include/vdpau/*.h
474 for vdpaulib in vdpau_nvidia vdpau vdpau_trace; do
475 dolib.so usr/${pkglibdir}/lib${vdpaulib}.so.${PV}
476 dosym lib${vdpaulib}.so.${PV} /usr/${inslibdir}/lib${vdpaulib}.so.1
477 dosym lib${vdpaulib}.so.1 /usr/${inslibdir}/lib${vdpaulib}.so
484 # Clean the dynamic libGL stuff's home to ensure
485 # we dont have stale libs floating around
486 if [ -d "${ROOT}"/usr/lib/opengl/nvidia ] ; then
487 rm -rf "${ROOT}"/usr/lib/opengl/nvidia/*
489 # Make sure we nuke the old nvidia-glx's env.d file
490 if [ -e "${ROOT}"/etc/env.d/09nvidia ] ; then
491 rm -f "${ROOT}"/etc/env.d/09nvidia
496 if use kernel_linux; then
497 linux-mod_pkg_postinst
500 # Switch to the nvidia implementation
501 eselect opengl set --use-old nvidia
504 elog "You must be in the video group to use the NVIDIA device"
505 elog "For more info, read the docs at"
506 elog "http://www.gentoo.org/doc/en/nvidia-guide.xml#doc_chap3_sect6"
509 elog "This ebuild installs a kernel module and X driver. Both must"
510 elog "match explicitly in their version. This means, if you restart"
511 elog "X, you most modprobe -r nvidia before starting it back up"
514 elog "To use the NVIDIA GLX, run \"eselect opengl set nvidia\""
516 elog "nVidia has requested that any bug reports submitted have the"
517 elog "output of /usr/bin/nvidia-bug-report.sh included."
519 elog "To work with compiz, you must enable the AddARGBGLXVisuals option."
521 elog "If you are having resolution problems, try disabling DynamicTwinView."
526 # For uclibc or anything non glibc, return false
527 has_version sys-libs/glibc || return 1
529 # Old versions of glibc were lt/no-tls only
530 has_version '<sys-libs/glibc-2.3.2' && return 1
539 # If we've got nptl, we've got tls
540 built_with_use --missing true sys-libs/glibc nptl && return 0
542 # 2.3.5 turned off tls for linuxthreads glibc on i486 and i586
543 if use x86 && has_version '>=sys-libs/glibc-2.3.5' ; then
545 i486|i586) return 1 ;;
549 # These versions built linuxthreads version to support tls, too
550 has_version '>=sys-libs/glibc-2.3.4.20040619-r2' && return 0
556 if use kernel_linux; then
559 eselect opengl set --use-old xorg-x11