# Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/media-libs/mesa/mesa-7.5.1.ebuild,v 1.6 2009/10/11 11:13:58 nixnut Exp $

EAPI="2"

EGIT_REPO_URI="git://anongit.freedesktop.org/mesa/mesa"

if [[ ${PV} = 9999* ]]; then
	GIT_ECLASS="git"
	EXPERIMENTAL="true"
	IUSE_VIDEO_CARDS_UNSTABLE="video_cards_nouveau"
	IUSE_UNSTABLE="gallium"
	# User can also specify branch by simply adding MESA_LIVE_BRANCH="blesmrt"
	# to the make.conf, where blesmrt is desired branch.
	[[ -z ${MESA_LIVE_BRANCH} ]] || EGIT_BRANCH="${MESA_LIVE_BRANCH}"
fi

inherit autotools multilib flag-o-matic ${GIT_ECLASS} portability

OPENGL_DIR="xorg-x11"

MY_PN="${PN/m/M}"
MY_P="${MY_PN}-${PV/_/-}"
MY_SRC_P="${MY_PN}Lib-${PV/_/-}"
DESCRIPTION="OpenGL-like graphic library for Linux"
HOMEPAGE="http://mesa3d.sourceforge.net/"

#SRC_PATCHES="mirror://gentoo/${P}-gentoo-patches-01.tar.bz2"
if [[ $PV = *_rc* ]]; then
	SRC_URI="ftp://ftp.freedesktop.org/pub/mesa/beta/${MY_SRC_P}.tar.gz
		${SRC_PATCHES}"
elif [[ $PV = 9999* ]]; then
	SRC_URI="${SRC_PATCHES}"
else
	SRC_URI="ftp://ftp.freedesktop.org/pub/mesa/${PV}/${MY_SRC_P}.tar.bz2
		${SRC_PATCHES}"
fi

LICENSE="LGPL-2"
SLOT="0"
KEYWORDS="~alpha amd64 arm ~hppa ~ia64 ~mips ppc ~ppc64 ~sh ~sparc x86 ~x86-fbsd"

IUSE_VIDEO_CARDS="${IUSE_VIDEO_CARDS_UNSTABLE}
	video_cards_intel
	video_cards_mach64
	video_cards_mga
	video_cards_none
	video_cards_r128
	video_cards_radeon
	video_cards_radeonhd
	video_cards_s3virge
	video_cards_savage
	video_cards_sis
	video_cards_sunffb
	video_cards_tdfx
	video_cards_trident
	video_cards_via"
IUSE="${IUSE_VIDEO_CARDS} ${IUSE_UNSTABLE}
	debug motif nptl pic xcb kernel_FreeBSD"

# keep correct libdrm and dri2proto dep
# keep blocks in rdepend for binpkg
RDEPEND="!<=x11-base/xorg-x11-6.9
	!<=x11-proto/xf86driproto-2.0.3
	app-admin/eselect-opengl
	dev-libs/expat
	>=x11-libs/libdrm-2.4.9
	x11-libs/libICE
	x11-libs/libX11[xcb?]
	x11-libs/libXdamage
	x11-libs/libXext
	x11-libs/libXi
	x11-libs/libXmu
	x11-libs/libXxf86vm
	motif? ( x11-libs/openmotif )
"
DEPEND="${RDEPEND}
	dev-util/pkgconfig
	x11-misc/makedepend
	>=x11-proto/dri2proto-1.99.3
	>=x11-proto/glproto-1.4.8
	x11-proto/inputproto
	x11-proto/xextproto
	x11-proto/xf86driproto
	x11-proto/xf86vidmodeproto
"
# glew depend on mesa and it is needed in runtime
PDEPEND=">=media-libs/glew-1.5.1"

S="${WORKDIR}/${MY_P}"

# Think about: ggi, svga, fbcon, no-X configs

pkg_setup() {
	# gcc 4.2 has buggy ivopts
	if [[ $(gcc-version) = "4.2" ]]; then
		append-flags -fno-ivopts
	fi

	# recommended by upstream
	append-flags -ffast-math
}

src_unpack() {
	[[ $PV = 9999* ]] && git_src_unpack || unpack ${A}
}

src_prepare() {
	# apply patches
	if [[ ${PV} != 9999* && -n ${SRC_PATCHES} ]]; then
		EPATCH_FORCE="yes" \
		EPATCH_SOURCE="${WORKDIR}/patches" \
		EPATCH_SUFFIX="patch" \
		epatch
	fi
	EPATCH_OPTS="-p1" epatch "${FILESDIR}"/${PV}-pkgconfig.patch
	# FreeBSD 6.* doesn't have posix_memalign().
	[[ ${CHOST} == *-freebsd6.* ]] && \
		sed -i -e "s/-DHAVE_POSIX_MEMALIGN//" configure.ac

	eautoreconf
}

src_configure() {
	local myconf

	# Configurable DRI drivers
	driver_enable swrast
	driver_enable video_cards_intel i810 i915 i965
	driver_enable video_cards_mach64 mach64
	driver_enable video_cards_mga mga
	driver_enable video_cards_r128 r128
	# ATI has two implementations as video_cards
	driver_enable video_cards_radeon radeon r200 r300
	driver_enable video_cards_radeonhd r300
	driver_enable video_cards_s3virge s3v
	driver_enable video_cards_savage savage
	driver_enable video_cards_sis sis
	driver_enable video_cards_sunffb ffb
	driver_enable video_cards_tdfx tdfx
	driver_enable video_cards_trident trident
	driver_enable video_cards_via unichrome

	# all live (experimental) stuff is wrapped around with experimental variable
	# so the users cant get to this parts even with enabled useflags (downgrade
	# from live to stable for example)
	if [[ -n ${EXPERIMENTAL} ]]; then
		# nouveau works only with gallium and intel, radeon, radeonhd can use
		# gallium as alternative implementation (NOTE: THIS IS EXPERIMENTAL)
		if use video_cards_nouveau && ! use gallium ; then
			elog "Nouveau driver is available only via gallium interface."
			elog "Enable gallium useflag if you want to use nouveau."
			echo
		fi
		# state trackers, for now enable the one i want
		# think about this bit more...
		myconf="${myconf} $(use_enable gallium)"
		if use gallium; then
			elog "Warning gallium interface is highly experimental so use"
			elog "it only if you feel really really brave."
			elog
			elog "Intel: works only i915."
			elog "Nouveau: only available implementation, so no other choice"
			elog "Radeon: not working, disabled."
			echo
			myconf="${myconf}
				--with-state-trackers=glx,dri,egl
				$(use_enable video_cards_nouveau gallium-nouveau)
				$(use_enable video_cards_intel gallium-intel)"
				#$(use_enable video_cards_radeon gallium-radeon)
				#$(use_enable video_cards_radeonhd gallium-radeon)"
		fi
	else
		# we need to disable the gallium since they enable by default...
		myconf="${myconf} --disable-gallium"
	fi

	# Deactivate assembly code for pic build
	myconf="${myconf} $(use_enable !pic asm)"

	# Deactivate EGL
	myconf="${myconf} --disable-egl"

	# --with-driver=dri|xlib|osmesa ; might get changed later to something
	# else than dri
	econf \
		--with-driver=dri \
		--disable-glut \
		--without-demos \
		$(use_enable debug) \
		$(use_enable motif glw) \
		$(use_enable motif) \
		$(use_enable nptl glx-tls) \
		$(use_enable xcb) \
		--with-dri-drivers=${DRI_DRIVERS} \
		${myconf}
}

src_install() {
	dodir /usr
	emake DESTDIR="${D}" install || die "Installation failed"

	# Remove redundant headers
	# GLUT thing
	rm -f "${D}"/usr/include/GL/glut*.h || die "Removing glut include failed."
	# Glew includes
	rm -f "${D}"/usr/include/GL/{glew,glxew,wglew}.h \
		|| die "Removing glew includes failed."

	# Move libGL and others from /usr/lib to /usr/lib/opengl/blah/lib
	# because user can eselect desired GL provider.
	ebegin "Moving libGL and friends for dynamic switching"
		dodir /usr/$(get_libdir)/opengl/${OPENGL_DIR}/{lib,extensions,include}
		local x
		for x in "${D}"/usr/$(get_libdir)/libGL.{la,a,so*}; do
			if [ -f ${x} -o -L ${x} ]; then
				mv -f ${x} "${D}"/usr/$(get_libdir)/opengl/${OPENGL_DIR}/lib \
					|| die "Failed to move ${x}"
			fi
		done
		for x in "${D}"/usr/include/GL/{gl.h,glx.h,glext.h,glxext.h}; do
			if [ -f ${x} -o -L ${x} ]; then
				mv -f ${x} "${D}"/usr/$(get_libdir)/opengl/${OPENGL_DIR}/include \
					|| die "Failed to move ${x}"
			fi
		done
	eend $?

	# Install libtool archives
	insinto /usr/$(get_libdir)
	# Should this use the -L/usr/lib instead of -L/usr/$(get_libdir)?
	# Please confirm and update this comment or the file.
	doins "${FILESDIR}"/lib/libGLU.la || die "doins libGLU.la failed"
	sed \
		-e "s:\${libdir}:$(get_libdir):g" \
		"${FILESDIR}"/lib/libGL.la \
		> "${D}"/usr/$(get_libdir)/opengl/xorg-x11/lib/libGL.la

	# On *BSD libcs dlopen() and similar functions are present directly in
	# libc.so and does not require linking to libdl. portability eclass takes
	# care of finding the needed library (if needed) witht the dlopen_lib
	# function.
	sed -i \
		-e 's:-ldl:'$(dlopen_lib)':g' \
		"${D}"/usr/$(get_libdir)/{libGLU.la,opengl/xorg-x11/lib/libGL.la} \
			|| die "sed dlopen failed"
}

pkg_postinst() {
	# Switch to the xorg implementation.
	echo
	eselect opengl set --use-old ${OPENGL_DIR}
}

# $1 - VIDEO_CARDS flag
# other args - names of DRI drivers to enable
driver_enable() {
	case $# in
		# for enabling unconditionally
		1)
			DRI_DRIVERS="${DRI_DRIVERS},$1"
			;;
		*)
			if use $1; then
				shift
				for i in $@; do
					DRI_DRIVERS="${DRI_DRIVERS},${i}"
				done
			fi
			;;
	esac
}
