1 # Copyright 1999-2009 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
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 )"
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}"
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"
91 NV_PACKAGE
="${X86_NV_PACKAGE}"
94 NV_PACKAGE
="${AMD64_NV_PACKAGE}"
95 elif use x86-fbsd
; then
97 NV_PACKAGE
="${X86_FBSD_NV_PACKAGE}"
100 S
="${WORKDIR}/${NV_PACKAGE}${PKG_V}"
103 ebegin
"Checking for MTRR support"
104 linux_chkconfig_present MTRR
107 if [[ $?
-ne 0 ]] ; then
108 eerror
"Please enable MTRR support in your kernel config, found at:"
110 eerror
" Processor type and features"
111 eerror
" [*] MTRR (Memory Type Range Register) support"
113 eerror
"and recompile your kernel ..."
114 die
"MTRR support not detected!"
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:"
125 eerror
" Processor type and features"
126 eerror
" [*] Paravirtualized guest support"
128 eerror
"or XEN support"
130 eerror
"and recompile your kernel .."
131 die
"PARAVIRT support detected!"
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
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)"
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
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"
175 die
"Could not determine proper NVIDIA package"
180 if use kernel_linux
&& kernel_is lt
2 6 7; then
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"
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
198 # Patches go below here, add brief description
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
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
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.
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
245 local MLTEST
=$
(type dyn_unpack
)
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."
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
> \
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
275 for ABI
in $
(get_install_abis
) ; do
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
290 is_final_abi ||
return 0
293 dodoc
"${NV_DOC}"/{XF86Config.sample
,Copyrights
}
294 dohtml
"${NV_DOC}"/html
/*
295 if use x86-fbsd
; then
296 dodoc
"${NV_DOC}/README"
299 newdoc
"${NV_DOC}/README.txt" README
300 dodoc
"${NV_DOC}/NVIDIA_Changelog"
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
316 libname
=$
(basename $2)
318 # libnvidia-cfg.so is no longer supplied in lib32; step over it gracefully
319 if [ -e $2.
$3 ] ; then
321 dosym
${libname}.
$3 $1/${libname}
322 [[ $3 != "1" ]] && dosym
${libname}.
$3 $1/${libname}.1
328 local inslibdir
=$
(get_libdir
)
330 if [[ ${#} -eq 2 ]] ; then
333 elif has_multilib_profile
&& [[ ${ABI} == "x86" ]] ; then
337 local usrpkglibdir
=usr
/${pkglibdir}
338 local libdir
=usr
/X11R
6/${pkglibdir}
339 local drvdir
=${libdir}/modules
/drivers
340 local extdir
=${libdir}/modules
/extensions
341 local incdir
=usr
/include
/GL
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/
356 # don't ask me why the headers are there.. glxext.h is missing
359 # on FreeBSD it has just .1 suffix
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}
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}
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
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}
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
422 insinto ${NV_ROOT}/include
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
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
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
466 if use kernel_linux; then
467 linux-mod_pkg_postinst
470 # Switch to the nvidia implementation
471 eselect opengl set --use-old nvidia
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"
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"
484 elog
"To use the NVIDIA GLX, run \"eselect opengl set nvidia\""
486 elog
"nVidia has requested that any bug reports submitted have the"
487 elog
"output of /usr/bin/nvidia-bug-report.sh included."
489 elog
"To work with compiz, you must enable the AddARGBGLXVisuals option."
491 elog
"If you are having resolution problems, try disabling DynamicTwinView."
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
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
515 i486|i586
) return 1 ;;
519 # These versions built linuxthreads version to support tls, too
520 has_version
'>=sys-libs/glibc-2.3.4.20040619-r2' && return 0
526 if use kernel_linux
; then
529 eselect opengl
set --use-old xorg-x11