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

EAPI="5"

inherit bash-completion-r1 eutils

DESCRIPTION="A download utility with segmented downloading with BitTorrent support"
HOMEPAGE="http://aria2.sourceforge.net/"
SRC_URI="mirror://sourceforge/${PN}/${P}.tar.bz2"

LICENSE="GPL-2"
KEYWORDS="~amd64 ~arm ~ppc ~ppc64 ~sparc ~x86 ~amd64-linux ~x86-linux"
SLOT="0"
IUSE="adns bittorrent +gnutls jemalloc libuv +libxml2 metalink +nettle nls sqlite scripts ssh ssl tcmalloc test xmlrpc"

CDEPEND="sys-libs/zlib:0=
	ssl? (
		app-misc/ca-certificates
		gnutls? ( >=net-libs/gnutls-1.2.9:0= )
		!gnutls? ( dev-libs/openssl:0= ) )
	adns? ( >=net-dns/c-ares-1.5.0:0= )
	bittorrent? (
		ssl? (
			gnutls? (
				nettle? ( >=dev-libs/nettle-2.4:0=[gmp] >=dev-libs/gmp-5:0= )
				!nettle? ( >=dev-libs/libgcrypt-1.2.2:0= ) ) )
		!ssl? (
			nettle? ( >=dev-libs/nettle-2.4:0=[gmp] >=dev-libs/gmp-5:0= )
			!nettle? ( >=dev-libs/libgcrypt-1.2.2:0= ) ) )
	jemalloc? ( dev-libs/jemalloc )
	libuv? ( dev-libs/libuv:0= )
	metalink? (
		libxml2? ( >=dev-libs/libxml2-2.6.26:2= )
		!libxml2? ( dev-libs/expat:0= ) )
	sqlite? ( dev-db/sqlite:3= )
	ssh? ( net-libs/libssh2:= )
	tcmalloc? ( dev-util/google-perftools )
	xmlrpc? (
		libxml2? ( >=dev-libs/libxml2-2.6.26:2= )
		!libxml2? ( dev-libs/expat:0= ) )"

DEPEND="${CDEPEND}
	virtual/pkgconfig
	nls? ( sys-devel/gettext )
	test? ( >=dev-util/cppunit-1.12.0:0 )"
RDEPEND="${CDEPEND}
	nls? ( virtual/libiconv virtual/libintl )
	scripts? ( dev-lang/ruby )"

REQUIRED_USE="jemalloc? ( !tcmalloc )
	tcmalloc? ( !jemalloc )"

pkg_setup() {
	if use scripts && use !xmlrpc && use !metalink; then
		ewarn "Please note that you may need to enable USE=xmlrpc to run the aria2rpc"
		ewarn "and aria2mon scripts against the local aria2."
	fi
}

src_prepare() {
	epatch_user
	sed -i -e "s|/tmp|${T}|" test/*.cc test/*.txt || die "sed failed"
}

src_configure() {
	local myconf=(
		# threads, epoll: check for best portability

		# do not try to compile and run a test LIBXML program
		--disable-xmltest
		# enable the shared library
		--enable-libaria2
		# zlib should always be available anyway
		--with-libz
		--with-ca-bundle="${EPREFIX}/etc/ssl/certs/ca-certificates.crt"

		# optional features
		$(use_enable bittorrent)
		$(use_enable metalink)
		$(use_enable nls)
		$(use_with sqlite sqlite3)
		$(use_with adns libcares)
		$(use_with libuv)
		$(use_with jemalloc)
		$(use_with tcmalloc)
	)

	# SSL := gnutls / openssl
	# USE=ssl
	#  + USE=gnutls -> gnutls
	#  + USE=-gnutls -> openssl

	if use ssl; then
		myconf+=( $(use_with gnutls) $(use_with !gnutls openssl) )
	else
		myconf+=( --without-gnutls --without-openssl )
	fi

	# message-digest := nettle / gcrypt / openssl
	# bignum := nettle+gmp / gcrypt / openssl
	# bittorrent := message-digest + bignum
	# USE=bittorrent
	#  + USE=(ssl -gnutls) -> openssl
	#  + USE=nettle -> nettle+gmp
	#  + USE=-nettle -> gcrypt

	if use !bittorrent || use ssl && use !gnutls; then
		myconf+=( --without-libgcrypt --without-libnettle --without-libgmp )
	else
		myconf+=( $(use_with !nettle libgcrypt)
			$(use_with nettle libnettle) $(use_with nettle libgmp) )
	fi

	# metalink+xmlrpc := libxml2 / expat
	# USE=(metalink || xmlrpc)
	#  + USE=libxml2 -> libxml2
	#  + USE=-libxml2 -> expat

	if use metalink || use xmlrpc; then
		myconf+=( $(use_with !libxml2 libexpat) $(use_with libxml2) )
	else
		myconf+=( --without-libexpat --without-libxml2 )
	fi

	# Note:
	# - always enable gzip/http compression since zlib should always be available anyway
	# - always enable epoll since we can assume kernel 2.6.x
	# - other options for threads: solaris, pth, win32
	econf "${myconf[@]}"
}

src_install() {
	default
	rm -rf "${D}"/usr/share/doc/aria2 \
		"${D}"/usr/share/doc/${PF}/README{,.html}

	dobashcomp doc/bash_completion/aria2c
	use scripts && dobin doc/xmlrpc/aria2{mon,rpc}
}

pkg_postinst() {
	if use xmlrpc || use metalink; then
		elog "If you would like to use the additional aria2mon and aria2rpc tools,"
		elog "you need to have \033[1mdev-lang/ruby\033[0m installed."
	fi
}
