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

EAPI=5

inherit eutils toolchain-funcs

DESCRIPTION="An enhanced (world's fastest) tar, as well as enhanced mt/rmt"
HOMEPAGE="http://s-tar.sourceforge.net/"
SRC_URI="mirror://sourceforge/s-tar/${P}.tar.bz2"

LICENSE="GPL-2 LGPL-2.1 CDDL-Schily"
SLOT="0"
KEYWORDS="alpha amd64 hppa ia64 ~mips ppc ppc64 sparc x86 ~amd64-linux ~x86-linux ~ppc-macos ~x86-macos"
IUSE="acl xattr"

DEPEND="
	acl? ( sys-apps/acl )
	xattr? ( sys-apps/attr )"
RDEPEND="${DEPEND}"

S=${WORKDIR}/${P/_alpha[0-9][0-9]}

src_prepare() {
	find -type f -exec chmod -c u+w '{}' + || die
	sed \
		-e "s:/opt/schily:${EPREFIX}/usr:g" \
		-e 's:bin:root:g' \
		-e "s:/usr/src/linux/include:${EPREFIX}/usr/include:" \
		-i DEFAULTS/Defaults.linux || die

	# Disable libacl autodependency (hacky build system, hacky fix...)
	if use acl; then
		sed \
			-e 's:[$]ac_cv_header_sys_acl_h:disable acl:' \
			-i "${S}/autoconf/configure" || die
	fi

	if use xattr; then
		sed \
			-e 's:[$]ac_cv_header_attr_xattr_h:disable xattr:' \
			-i "${S}/autoconf/configure" || die
	fi

	# Create additional symlinks needed for some archs.
	pushd "${S}/RULES" > /dev/null
	local t
	for t in ppc64 s390x ; do
		ln -s i586-linux-cc.rul ${t}-linux-cc.rul || die
		ln -s i586-linux-gcc.rul ${t}-linux-gcc.rul || die
	done
	popd > /dev/null
}

src_configure() { :; } #avoid ./configure run

src_compile() {
	emake \
		CC="$(tc-getCC)" \
		COPTX="${CFLAGS}" \
		CPPOPTX="${CPPFLAGS}" \
		COPTGPROF= \
		COPTOPT= \
		LDOPTX="${LDFLAGS}"
}

src_install() {
	# Joerg Schilling suggested to integrate star into the main OS using call:
	# make INS_BASE=/usr DESTDIR="${D}" install

	dobin \
		star/OBJ/*-*-cc/star \
		tartest/OBJ/*-*-cc/tartest \
		star_sym/OBJ/*-*-cc/star_sym \
		mt/OBJ/*-*-cc/smt

	newsbin rmt/OBJ/*-*-cc/rmt rmt.star
	newman rmt/rmt.1 rmt.star.1

	# Note that we should never install gnutar, tar or rmt in this package.
	# tar and rmt are provided by app-arch/tar. gnutar is not compatible with
	# GNU tar and breakes compilation, or init scripts. bug #33119
	dosym {star,/usr/bin/ustar}
	dosym {star,/usr/bin/spax}
	dosym {star,/usr/bin/scpio}
	dosym {star,/usr/bin/suntar}

	#  match is needed to understand the pattern matcher, if you wondered why ;)
	doman man/man1/match.1 tartest/tartest.1 \
		star/{star.4,star.1,spax.1,scpio.1,suntar.1}

	insinto /etc/default
	newins star/star.dfl star
	newins rmt/rmt.dfl rmt

	dodoc star/{README.ACL,README.crash,README.largefiles,README.otherbugs} \
		star/{README.pattern,README.pax,README.posix-2001,README,STARvsGNUTAR} \
			rmt/default-rmt.sample TODO AN-* Changelog CONTRIBUTING
}
