# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

EAPI=5

if [[ ${PV} == "9999" ]] ; then
	EGIT_SUB_PROJECT="legacy"
	EGIT_URI_APPEND=${PN}
	EGIT_BRANCH=${PN}-1.7
else
	SRC_URI="https://download.enlightenment.org/releases/${P}.tar.bz2"
	EKEY_STATE="snap"
fi

# virtualx is required for tests, which are currently broken
#inherit virtualx
inherit enlightenment eutils

DESCRIPTION="Enlightenment's core event abstraction layer and OS abstraction layer"

LICENSE="BSD-2"
IUSE="ares curl directfb +evas examples fbcon gles glib gnutls +inotify ipv6 libressl opengl sdl ssl static-libs test +threads tslib wayland +X xcb xinerama xprint xscreensaver"

RDEPEND=">=dev-libs/eina-${PV}
	ares? ( net-dns/c-ares )
	glib? ( dev-libs/glib:2 )
	curl? ( net-misc/curl )
	gnutls? ( net-libs/gnutls )
	!gnutls? (
		ssl? (
			!libressl? ( dev-libs/openssl:0 )
			libressl? ( dev-libs/libressl )
		)
	)
	evas? (
		>=media-libs/evas-${PV}[directfb?,fbcon?,opengl?,X?,xcb?]
		opengl? ( virtual/opengl )
		wayland? (
			>=media-libs/evas-${PV}[directfb?,fbcon?,gles?,opengl?,wayland?,X?,xcb?]
		)
	)
	directfb? ( >=dev-libs/DirectFB-0.9.16 )
	tslib? ( x11-libs/tslib )
	sdl? ( media-libs/libsdl )
	wayland? ( dev-libs/wayland )
	X? (
		x11-libs/libX11
		x11-libs/libXcomposite
		x11-libs/libXcursor
		x11-libs/libXdamage
		x11-libs/libXext
		x11-libs/libXfixes
		x11-libs/libXi
		x11-libs/libXrender
		x11-libs/libXtst
		xinerama? ( x11-libs/libXinerama x11-libs/libXrandr )
		xprint? ( x11-libs/libXp )
		xscreensaver? ( x11-libs/libXScrnSaver )
	)
	!X? ( xcb? (
		x11-libs/pixman
		x11-libs/xcb-util
	) )"
DEPEND="${RDEPEND}"

# tests depend on temp data from eina WORKDIR.
RESTRICT="test"

src_configure() {
	local ssl_flags=() evas_flags=() x_flags=()

	if use gnutls && use ssl; then
		einfo "You have enabled both 'ssl' and 'gnutls', so we will use"
		einfo "gnutls and not openssl for ecore-con support."
	fi
	ssl_flags=(
		$(usex gnutls "--disable-openssl" "$(use_enable ssl openssl)")
		$(use_enable gnutls)
	)

	local x_or_xcb=$(usex X "X" "$(usev xcb)")

	if use evas; then
		if use opengl && [[ -z ${x_or_xcb} ]]; then
			ewarn "Ecore/Evas usage of OpenGL requires X11."
			ewarn "Compile dev-libs/ecore with USE=X or xcb."
			ewarn "Compiling without opengl support."
			evas_flags=(
				--disable-ecore-evas-software-x11
				--disable-ecore-evas-software-16-x11
			)
		else
			evas_flags=(
				--enable-ecore-evas-software-x11
				--enable-ecore-evas-software-16-x11
			)
		fi
		evas_flags+=(
			$(use_enable directfb ecore-evas-directfb)
			$(use_enable fbcon ecore-evas-fb)
			$(use_enable opengl ecore-evas-opengl-x11)
			$(use_enable wayland ecore-evas-wayland-shm)
			$(usex wayland "--disable-ecore-evas-wayland-egl" "$(use_enable gles ecore-evas-wayland-egl)")
		)
	else
		evas_flags=(
			--disable-ecore-evas-directfb
			--disable-ecore-evas-fb
			--disable-ecore-evas-software-x11
			--disable-ecore-evas-software-16-x11
			--disable-ecore-evas-opengl-x11
			--disable-ecore-evas-wayland-shm
			--disable-ecore-evas-wayland-egl
		)
		if use opengl; then
			ewarn "Ecore usage of OpenGL is dependent on media-libs/evas."
			ewarn "Compile dev-libs/ecore with USE=evas."
		fi
	fi

	if use X; then
		if use xcb; then
			ewarn "You have enabled both 'X' and 'xcb', so we will use"
			ewarn "X as it's considered the most stable for ecore-x."
		fi
		x_flags=(
			--enable-ecore-x
			--disable-ecore-x-xcb
		)
	elif use xcb; then
		x_flags=(
			--enable-ecore-x
			--enable-ecore-x-xcb
		)
	else
		x_flags=(
			--disable-ecore-x
			--disable-ecore-x-xcb
		)
	fi

	if [[ -n ${x_or_xcb} ]]; then
		x_flags+=(
			$(use_enable xinerama ecore-x-xinerama)
			$(use_enable xprint ecore-x-xprint)
			$(use_enable xscreensaver ecore-x-screensaver)
		)
	else
		x_flags+=(
			--disable-ecore-x-xinerama
			--disable-ecore-x-xprint
			--disable-ecore-x-screensaver
		)
	fi

	if use tslib && ! use fbcon; then
		ewarn "Ecore just uses tslib for framebuffer input."
		ewarn "Compile dev-libs/ecore with USE=fbcon."
	fi

	E_ECONF=(
		--enable-ecore-con
		--enable-ecore-ipc
		--enable-ecore-file
		--enable-ecore-imf
		--enable-ecore-input
		--disable-ecore-win32
		--disable-ecore-wince
		--disable-ecore-evas-software-gdi
		--disable-ecore-evas-software-ddraw
		--disable-ecore-evas-direct3d
		--disable-ecore-evas-opengl-glew
		--disable-ecore-evas-software-16-ddraw
		--disable-ecore-evas-software-16-wince
		--disable-ecore_imf_scim
		$(use_enable ares cares)
		$(use_enable curl)
		$(use_enable directfb ecore-directfb)
		$(use_enable doc)
		$(use_enable examples build-examples)
		$(use_enable examples install-examples)
		$(use_enable evas ecore-evas)
		$(use_enable evas ecore-input-evas)
		$(use_enable evas ecore-imf-evas)
		$(use_enable evas ecore-evas-software-buffer)
		$(use_enable fbcon ecore-fb)
		$(use_enable glib)
		$(use_enable inotify)
		$(use_enable ipv6)
		$(use_enable sdl ecore-sdl)
		$(use_enable test tests)
		$(use_enable threads posix-threads)
		$(use_enable tslib)
		$(use_enable wayland ecore-wayland)
		$(use_enable X xim)
		"${ssl_flags[@]}"
		"${evas_flags[@]}"
		"${x_flags[@]}"
	)
	enlightenment_src_configure
}

src_test() {
	Xemake check
}
