# Copyright 1999-2005 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ inherit eutils linux-mod multilib versionator toolchain-funcs X86_PKG_V="pkg0" AMD64_PKG_V="pkg2" NV_V="${PV/1.0./1.0-}" X86_NV_PACKAGE="NVIDIA-Linux-x86-${NV_V}" AMD64_NV_PACKAGE="NVIDIA-Linux-x86_64-${NV_V}" X86_FBSD_NV_PACKAGE="NVIDIA-FreeBSD-x86-${NV_V}" # PAH: for nvidia settings and xconfig NVS="nvidia-settings" NVX="nvidia-xconfig" NVS_V="1.0" NVX_V="1.0" # this block is needed since portage > 2.0.52 seems # to not like the old method of downloading. So here # we'll populate the download list first, then send # that to SRC_URI if use x86; then NVDL="ftp://download.nvidia.com/XFree86/Linux-x86/${NV_V}/${X86_NV_PACKAGE}-${X86_PKG_V}.run" PKG_V="-${X86_PKG_V}" NV_PACKAGE="${X86_NV_PACKAGE}" elif use amd64; then NVDL="ftp://download.nvidia.com/XFree86/Linux-x86_64/${NV_V}/${AMD64_NV_PACKAGE}-${AMD64_PKG_V}.run" PKG_V="-${AMD64_PKG_V}" NV_PACKAGE="${AMD64_NV_PACKAGE}" elif use x86-fbsd; then NVDL="ftp://download.nvidia.com/freebsd/${NV_V}${X86_FBSD_NV_PACKAGE}.tar.gz" PKG_V="" NV_PACKAGE="${X86_FBSD_NV_PACKAGE}" fi # Add settings and xconfig to the download list NVDL="${NVDL} ftp://download.nvidia.com/XFree86/${NVS}/${NVS}-${NVS_V}.tar.gz \ ftp://download.nvidia.com/XFree86/${NVX}/${NVX}-${NVX_V}.tar.gz" DESCRIPTION="NVIDIA Linux X11 driver, GLX libraries, and utilities" HOMEPAGE="http://www.nvidia.com/" SRC_URI=${NVDL} S="${WORKDIR}/${NV_PACKAGE}${PKG_V}/usr/src/nv" LICENSE="NVIDIA" SLOT="0" KEYWORDS="-* ~amd64 ~x86" RESTRICT="nostrip multilib-pkg-force" IUSE="dlloader" PROVIDE="virtual/opengl" RDEPEND="virtual/modutils || ( >=x11-base/xorg-server-0.99.1-r7 virtual/x11 ) || ( media-libs/mesa virtual/x11 ) app-admin/eselect-opengl !app-emulation/emul-linux-x86-nvidia virtual/modutils !media-video/nvidia-kernel !media-video/nvidia-glx !media-video/nvidia-settings" DEPEND="virtual/linux-sources virtual/x11 >=x11-libs/gtk+-2" export _POSIX2_VERSION="199209" # On BSD userland it wants real make command MAKE="make" pkg_setup() { # NVIDIA KERNEL linux-mod_pkg_setup MODULE_NAMES="nvidia(video:${S})" BUILD_PARAMS="IGNORE_CC_MISMATCH=yes V=1 SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}" mtrr_check # NVIDIA GLX check_multilib } src_unpack() { local NV_PATCH_PREFIX="${FILESDIR}/${PV}/NVIDIA-1.0-${PV##*.}" # NVIDIA KERNEL if [[ ${KV_MINOR} -eq 6 && ${KV_PATCH} -lt 7 ]] ; then echo ewarn "Your kernel version is ${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}" ewarn "This is not officially supported for ${P}. It is likely you" ewarn "will not be able to compile or use the kernel module." ewarn "It is recommended that you upgrade your kernel to a version >= 2.6.7" echo ewarn "DO NOT file bug reports for kernel versions less than 2.6.7 as they will be ignored." fi if ! use x86-fbsd; then cd ${WORKDIR} bash ${DISTDIR}/${NV_PACKAGE}${PKG_V}.run --extract-only else unpack ${A} fi # Add patches below, with a breif description. cd ${WORKDIR}/${NV_PACKAGE}${PKG_V} pwd # Any general patches should go here if ! use x86-fbsd; then # nVidia wants us to use nvidia-installer, removing warning. epatch ${NV_PATCH_PREFIX}-makefile.patch fi # Use the correct defines to make gtkglext build work epatch ${NV_PATCH_PREFIX}-defines.patch # Use some more sensible gl headers and make way for new glext.h epatch ${NV_PATCH_PREFIX}-glheader.patch cd ${S} # Patches from Zander goes here epatch ${NV_PATCH_PREFIX}-1423627.diff # Now any patches specific to the 2.6 kernel should go here if kernel_is 2 6 ; then einfo "Applying 2.6 kernel patches" # Fix calling of smp_processor_id() when preempt is enabled epatch ${NV_PATCH_PREFIX}-disable-preempt-on-smp_processor_id.patch fi # Quiet down warnings the user do not need to see sed -i \ -e 's:-Wpointer-arith::g' \ -e 's:-Wsign-compare::g' \ ${S}/Makefile.kbuild # If you set this then it's your own fault when stuff breaks :) [[ -n ${USE_CRAZY_OPTS} ]] && sed -i "s:-O:${CFLAGS}:" Makefile.* # If greater than 2.6.5 use M= instead of SUBDIR= cd ${S}; convert_to_m Makefile.kbuild # PAH: hack to clean up desktop file provided for nvidia-settings sed -i \ -e 's:__.*__/::' \ -e 's:\.png::' \ ${WORKDIR}/${NV_PACKAGE}${PKG_V}/usr/share/applications/${NVS}.desktop # PAH: now unpack nvidia-settings and xconfig cd ${WORKDIR} unpack ${NVS}-${NVS_V}.tar.gz ${NVX}-${NVX_V}.tar.gz } src_compile() { # KERNEL einfo "making nvidia kernel modules" linux-mod_src_compile # NVIDIA-SETTINGS einfo "making nvidia settings" cd ${WORKDIR}/${NVS}-${NVS_V} cd src/libXNVCtrl einfo "Building libXNVCtrl..." # This next voodoo is just to work around xmkmf's broken behaviour # after the Xorg move to /usr (or I think, as I have not messed # with it in ages). ln -snf ${ROOT}/usr/include/X11 include xmkmf -a || die "Running xmkmf failed!" make CCOPTIONS="${CFLAGS}" clean all || die "Building libXNVCtrl failed!" cd ../.. einfo "Building nVidia-Settings..." emake CC=$(tc-getCC) || die "Failed to build nvidia-settings" # XCONFIG einfo "Building nVidia-xconfig..." cd ${WORKDIR}/${NVX}-${NVX_V} emake CC=$(tc-getCC) || die "Could not build nvidia-xconfig. Sorry :(" } src_install() { # KERNEL and GLX cd ${WORKDIR}/${NV_PACKAGE}${PKG_V} install_kernel_modules install_glx_modules # NVIDIA-SETTINGS cd ${WORKDIR}/${NVS}-${NVS_V} install_nvidia_settings # NVIDIA-XCONFIG cd ${WORKDIR}/${NVX}-${NVX_V} install_nvidia_xconfig if ! use x86-fbsd; then cd ${WORKDIR}/${NV_PACKAGE}${PKG_V}/usr/share/doc newdoc README.txt README dodoc NVIDIA_Changelog Copyrights XF86Config.sample dodoc nvidia-settings-user-guide.txt dohtml html/* else dodoc doc/README doc/XF86Config.sample doc/Copyrights doc/license.txt dohtml doc/html/* fi cd ../man/man1 doman nvidia-settings.1.gz nvidia-xconfig.1.gz # PAH: install nvidia-settings icon and desktop cd ../../ doicon doc/${NVS}.png domenu applications/${NVS}.desktop } pkg_preinst() { # Can we make up our minds ?!?!? local NV_D=${IMAGE:-${D}} if ! has_version x11-base/xorg-server ; then for dir in lib lib32 lib64 ; do if [[ -d ${NV_D}/usr/${dir}/xorg ]] ; then mv ${NV_D}/usr/${dir}/xorg/* ${NV_D}/usr/${dir} rmdir ${NV_D}/usr/${dir}/xorg fi done fi # Clean the dinamic libGL stuff's home to ensure # we dont have stale libs floating around if [[ -d ${ROOT}/usr/lib/opengl/nvidia ]] ; then rm -rf ${ROOT}/usr/lib/opengl/nvidia/* fi # Make sure we nuke the old nvidia-glx's env.d file if [[ -e ${ROOT}/etc/env.d/09nvidia ]] ; then rm -f ${ROOT}/etc/env.d/09nvidia fi } pkg_postinst() { linux-mod_pkg_postinst #switch to the nvidia implementation eselect opengl set nvidia echo einfo "To use the Nvidia GLX, run \"eselect opengl set nvidia\"" echo einfo "nVidia have requested that any bug reports submitted have the" einfo "output of /usr/bin/nvidia-bug-report.sh included." } pkg_postrm() { eselect opengl set --use-old xorg-x11 } mtrr_check() { ebegin "Checking for MTRR support" linux_chkconfig_present MTRR eend $? if [[ $? -ne 0 ]] ; then eerror "This version needs MTRR support for most chipsets!" eerror "Please enable MTRR support in your kernel config, found at:" eerror eerror " Processor type and features" eerror " [*] MTRR (Memory Type Range Register) support" eerror eerror "and recompile your kernel ..." die "MTRR support not detected!" fi } check_multilib() { if use amd64 && has_multilib_profile && [ "${DEFAULT_ABI}" != "amd64" ]; then eerror "This ebuild doesn't currently support changing your defualt abi." die "Unexpected \${DEFAULT_ABI} = ${DEFAULT_ABI}" fi } install_kernel_modules() { linux-mod_src_install # Add the aliases sed -e 's:\${PACKAGE}:'${PF}':g' ${FILESDIR}/nvidia > ${WORKDIR}/nvidia insinto /etc/modules.d newins ${WORKDIR}/nvidia nvidia } install_nvidia_settings() { exeinto /usr/bin doexe nvidia-settings # Install libXNVCtrl and headers insinto "/usr/$(get_libdir)" doins src/libXNVCtrl/libXNVCtrl.a insinto /usr/include/NVCtrl doins src/libXNVCtrl/{NVCtrl,NVCtrlLib}.h } install_nvidia_xconfig() { exeinto /usr/bin doexe nvidia-xconfig } install_glx_modules() { local MLTEST=$(type dyn_unpack) if [[ "${MLTEST/set_abi}" == "${MLTEST}" ]] && has_multilib_profile ; then local OABI=${ABI} for ABI in $(get_install_abis) ; do src_install-libs done ABI=${OABI} unset OABI elif use amd64 ; then src_install-libs lib32 $(get_multilibdir) src_install-libs lib $(get_libdir) rm -rf ${D}/usr/$(get_multilibdir)/opengl/nvidia/include rm -rf ${D}/usr/$(get_multilibdir)/opengl/nvidia/extensions else src_install-libs fi is_final_abi || return 0 # nVidia want bug reports using this script exeinto /usr/bin doexe usr/bin/nvidia-bug-report.sh } # Install nvidia library: # the first parameter is the place where to install it # the second paramis the base name of the library # the third parameter is the provided soversion donvidia() { dodir $1 exeinto $1 libname=$(basename $2) doexe $2.$3 dosym ${libname}.$3 $1/${libname} [[ $3 != "1" ]] && dosym ${libname}.$3 $1/${libname}.1 } src_install-libs() { local pkglibdir=lib local inslibdir=$(get_libdir) if [[ ${#} -eq 2 ]] ; then pkglibdir=${1} inslibdir=${2} elif has_multilib_profile && [[ ${ABI} == "x86" ]] ; then pkglibdir=lib32 fi local usrpkglibdir=usr/${pkglibdir} local libdir=usr/X11R6/${pkglibdir} local drvdir=${libdir}/modules/drivers local extdir=${libdir}/modules/extensions local incdir=usr/include/GL local sover=${PV} local NV_ROOT="/usr/${inslibdir}/opengl/nvidia" local NO_TLS_ROOT="${NV_ROOT}/no-tls" local TLS_ROOT="${NV_ROOT}/tls" local X11_LIB_DIR="/usr/${inslibdir}/xorg" if use x86-fbsd; then # on FreeBSD everything is on obj/ pkglibdir=obj usrpkglibdir=obj x11pkglibdir=obj drvdir=obj extdir=obj # don't ask me why the headers are there.. glxext.h is missing incdir=doc # on FreeBSD it has just .1 suffix sover=1 fi # The GLX libraries donvidia ${NV_ROOT}/lib ${usrpkglibdir}/libGL.so ${sover} donvidia ${NV_ROOT}/lib ${usrpkglibdir}/libGLcore.so ${sover} dodir ${NO_TLS_ROOT} donvidia ${NO_TLS_ROOT} ${usrpkglibdir}/libnvidia-tls.so ${sover} if ! use x86-fbsd; then donvidia ${TLS_ROOT} ${usrpkglibdir}/tls/libnvidia-tls.so ${sover} fi if want_tls ; then dosym ../tls/libnvidia-tls.so ${NV_ROOT}/lib dosym ../tls/libnvidia-tls.so.1 ${NV_ROOT}/lib dosym ../tls/libnvidia-tls.so.${sover} ${NV_ROOT}/lib else dosym ../no-tls/libnvidia-tls.so ${NV_ROOT}/lib dosym ../no-tls/libnvidia-tls.so.1 ${NV_ROOT}/lib dosym ../no-tls/libnvidia-tls.so.${sover} ${NV_ROOT}/lib fi exeinto ${X11_LIB_DIR}/modules/drivers if use dlloader; then [[ -f ${drvdir}/nvidia_drv.so ]] && \ doexe ${drvdir}/nvidia_drv.so else [[ -f ${drvdir}/nvidia_drv.o ]] && \ doexe ${drvdir}/nvidia_drv.o fi insinto ${X11_LIB_DIR} [[ -f ${libdir}/libXvMCNVIDIA.a ]] && \ doins ${libdir}/libXvMCNVIDIA.a exeinto ${X11_LIB_DIR} [[ -f ${libdir}/libXvMCNVIDIA.so.${PV} ]] && \ doexe ${libdir}/libXvMCNVIDIA.so.${PV} exeinto ${NV_ROOT}/extensions [[ -f ${extdir}/libglx.so.${sover} ]] && \ newexe ${extdir}/libglx.so.${sover} libglx.so # Includes insinto ${NV_ROOT}/include doins ${incdir}/*.h } want_tls() { # For uclibc or anything non glibc, return false has_version sys-libs/glibc || return 1 # Old versions of glibc were lt/no-tls only has_version '=sys-libs/glibc-2.3.5' ; then case ${CHOST/-*} in i486|i586) return 1 ;; esac fi # These versions built linuxthreads version to support tls, too has_version '>=sys-libs/glibc-2.3.4.20040619-r2' && return 0 return 1 }