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

EAPI=5
inherit autotools linux-info linux-mod readme.gentoo

PV_MAJ="2.9beta"
MY_P="${PN}-${PV_MAJ}.20130530"

DESCRIPTION="OrangeFS is a branch of PVFS2 cluster filesystem"
HOMEPAGE="http://www.orangefs.org/"
SRC_URI="http://orangefs.org/downloads/${PV_MAJ}/source/${MY_P}.tar.gz"
S="${WORKDIR}/${MY_P}"

LICENSE="LGPL-2.1"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE="aio apidocs capcache certcache debug doc examples fuse gtk infiniband
kmod-threads ldap memtrace +mmap modules open-mx reset-file-pos security-key
security-cert sendfile +server ssl static static-libs +tcp +threads
trusted-connections +usrint usrint-cache +usrint-cwd usrint-kmount valgrind"

CDEPEND="
	dev-lang/perl
	>=sys-libs/db-4.8.30:=
	virtual/perl-Math-BigInt
	fuse? ( sys-fs/fuse:= )
	gtk? ( x11-libs/gtk+:2 )
	infiniband? ( sys-fabric/ofed )
	ldap? ( net-nds/openldap )
	open-mx? ( sys-cluster/open-mx[static-libs?] )
	ssl? ( dev-libs/openssl[static-libs?] )
	valgrind? ( dev-util/valgrind )
"
RDEPEND="${CDEPEND}
	modules? ( virtual/modutils )
"
DEPEND="${CDEPEND}
	>=sys-devel/autoconf-2.59
	sys-devel/bison
	sys-devel/flex
	virtual/pkgconfig
	apidocs? ( app-doc/doxygen )
	doc? ( dev-tex/latex2html )
	modules? ( virtual/linux-sources )
"

# aio and sendfile are only meaningful for kernel module;
# apidocs needs docs to be build first;
# kernel threads obviously needs kernel module and threads
# memtrace and valgrind witout debug info will be a pain;
# if both Myrinet and TCP interfaces are enabled in BMI, 5 sec delays will
# occur, though, at lest one of them must be enabled;
# static flag affects only server, so it must depend on it;
REQUIRED_USE="
	aio? ( modules )
	apidocs? ( doc )
	capcache? ( || ( security-cert security-key ) )
	certcache? ( security-cert )
	kmod-threads? ( modules threads )
	memtrace? ( debug )
	reset-file-pos? ( modules )
	security-cert? ( ldap ssl )
	security-key? ( ssl )
	sendfile? ( modules )
	static? ( server static-libs )
	tcp? ( !infiniband !open-mx )
	usrint-cache? ( usrint )
	usrint-cwd? ( usrint )
	usrint-kmount? ( usrint )
	valgrind? ( debug )
	|| ( infiniband open-mx tcp )
	?? ( security-cert security-key )
"

BUILD_TARGETS="just_kmod"
MODULE_NAMES="pvfs2(fs::src/kernel/linux-2.6)"

pkg_setup() {
	use modules && linux-mod_pkg_setup
	if use modules && kernel_is -ge 3 4; then
		eerror "Sorry, linux kernels >= 3.4 are not support yet."
		eerror "(Well they are, but you'll have a dead lock.)"
		eerror "You may disable modules use flag and use fuse client to mount filesystem."
		eerror "PVFS2 server and ROMIO I/O API are still available too."
		return 1
	fi

	if use security-key || use security-cert && ! use capcache; then
		ewarn "Upstream recommends to enable capabilities cache (--enable-capcache) when"
		ewarn "security-key or security-cert is used."
	fi
	if use security-cert && ! use certcache; then
		ewarn "Upstream recommends to enable certificate cache (--enable-certcache) when"
		ewarn "security-cert is used."
	fi
}

src_prepare() {
	# Upstream doesn't seem to want to apply this which makes
	# sense as it probably only matters to us.  Simple patch
	# to split the installation of the module (which we use
	# the eclass for) and the installation of the kernapps.
	epatch "${FILESDIR}"/${PN}-2.8.5-split-kernapps.patch

	# Fix libm underliking issue for kernapps
	epatch "${FILESDIR}"/${P}-kernapps-lm.patch

	# Change defalt server logfile location to more appropriate value
	# used by init script.
	sed -i "s%/tmp/pvfs2-server.log%${EPREFIX}var/log/pvfs2/server.log%g" \
	src/apps/admin/pvfs2-genconfig || die "sed on pvfs2-genconfig failed"

	AT_M4DIR=./maint/config eautoreconf
}

src_configure() {
	local myconf=""

	use threads && use aio || myconf+=" --disable-aio-threaded-callbacks"

	# fast mode disables optimizations
	use debug && myconf+=" --disable-fast --with-berkdb-debug" \
			  || myconf+=" --enable-fast  --without-berkdb-debug"

	use modules && myconf+=" --with-kernel=${KV_DIR}"

	# ARCH is used to define linux header path, should be not set.
	unset ARCH
	# FIXME: VIS build is broken at this moment.
	# Please add SDL dependency on reenable.
	# Note: jdk, jni, hadoop are disabled because hadoop is out of portage
	# and jdk/jni is useless otherwise
	econf \
		--disable-jni \
		--disable-hadoop \
		--disable-nptl-workaround \
		--disable-redhat24 \
		--disable-visual \
		--enable-epoll \
	    --enable-shared \
		--enable-verbose-build \
	    --sysconfdir="${EPREFIX}"/etc/pvfs2 \
	    $(use_enable aio kernel-aio) \
	    $(use_enable capcache) \
	    $(use_enable certcache) \
	    $(use_enable debug perf-counters) \
	    $(use_enable debug segv-backtrace) \
	    $(use_enable fuse) \
	    $(use_enable gtk karma) \
	    $(use_enable mmap mmap-racache) \
	    $(use_enable kmod-threads threaded-kmod-helper) \
	    $(use_enable reset-file-pos) \
	    $(use_enable security-cert) \
	    $(use_enable security-key) \
	    $(use_enable sendfile kernel-sendfile) \
	    $(use_enable server) \
	    $(use_enable static static-server) \
	    $(use_enable static-libs static) \
	    $(use_enable trusted-connections) \
	    $(use_enable usrint) \
	    $(use_enable usrint-cache ucache) \
	    $(use_enable usrint-cwd) \
	    $(use_enable usrint-kmount) \
	    $(use_with infiniband openib "${EPREFIX}"/usr/) \
	    $(use_with memtrace mtrace) \
	    $(use_with ldap) \
	    $(use_with open-mx mx "${EPREFIX}"/usr/) \
	    $(use_with ssl) \
	    $(use_with tcp bmi-tcp) \
	    $(use_with valgrind) \
		${myconf}
}

src_compile() {
	emake all
	if use modules; then
		linux-mod_src_compile
		emake kernapps
	fi

	use doc && emake docs
	if use apidocs; then
		cd "${S}"/doc
		doxygen doxygen/pvfs2-doxygen.conf || die "doxygen failed"
	fi
}

src_install() {
	emake DESTDIR="${D}" install
	if use modules; then
		linux-mod_src_install
		emake DESTDIR="${D}" kernapps_install

		newinitd "${FILESDIR}"/pvfs2-client-init.d pvfs2-client
		newconfd "${FILESDIR}"/pvfs2-client-conf.d pvfs2-client
	fi

	if use server; then
	    newinitd "${FILESDIR}"/pvfs2-server-init.d pvfs2-server
	    newconfd "${FILESDIR}"/pvfs2-server-conf.d pvfs2-server
	fi

	keepdir "${EPREFIX}var/log/pvfs2"

	dodoc AUTHORS CREDITS ChangeLog INSTALL README SecuritySetup
	readme.gentoo_create_doc

	if use doc; then
		dodoc doc/{coding/,}*.{pdf,txt} doc/random/*.pdf \
			doc/{coding/valgrind,add-client-syscall,add-server-req,REFERENCES.bib}

	    if use apidocs; then
	        dohtml -A map -A md5 doc/doxygen/html/*
	    fi

		docinto design
		dodoc doc/design/*.{pdf,txt}
	fi
	if use examples; then
	    docinto examples
	    dodoc -r examples/{certs,heartbeat,keys}
	fi
}

pkg_postinst() {
	use modules && linux-mod_pkg_postinst

	readme.gentoo_pkg_postinst
	if ! use modules; then
		ewarn
		ewarn "Without modules support you wouldn't be able to use pvfs2-client and mount"
		ewarn "partitions using kernel VFS. Though, you are still able to use libpvfs2,"
		ewarn "ROMIO interface, and FUSE client (if fuse use flag is enabled)."
	fi
	if use modules && kernel_is -ge 3 1; then
		ewarn
		ewarn "ACL support for 3.1 and 3.2 kernels is known to have bugs."
	fi
	if use sendfile; then
		ewarn
		ewarn "With sendfile enabled performance will be degraded for small access patterns."
	fi
}

pkg_config() {
	local s
	local f="$(source "${ROOT}"etc/conf.d/pvfs2-server; echo ${PVFS2_FS_CONF})"
	[[ -z "${f}" ]] && f="${ROOT}etc/pvfs2/fs.conf"
	if [[ -f "${f}" ]]; then
		ewarn "Previous install detected."
		ewarn "We're about to wipe out ${f} and replace it with"
		ewarn "the file generated by running pvfs2-genconfig.  If this is what"
		ewarn "you want to do, hit any key to continue.  Otherwise hit ctrl+C"
		ewarn "to abort."
		read s
	fi
	einfo "Creating unified configuration file"
	[ ! -d "${ROOT}$(dirname "${f}")" ] && mkdir -p "${ROOT}$(dirname "${f}")"
	"${ROOT}"usr/bin/pvfs2-genconfig "${f}"
}