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

EAPI=2

inherit toolchain-funcs

DESCRIPTION="the bind library for interix"
HOMEPAGE="https://dev.gentoo.org/~mduft"
SRC_URI=""

LICENSE="ISC BSD-4"
SLOT="0"
KEYWORDS="-* ~x86-interix"
IUSE=""

DEPEND=""
RDEPEND=""

src_install() {
	# scratch together the pieces of the bind installation from all over the
	# place on different interix systems, and copy the files to the local
	# prefix installation.

	if [[ -d /usr/local/bind ]]; then
		# layout as of vista onwards.
		local incdir="/usr/local/bind/include"
		local libdir="/usr/local/lib/bind"
	else
		# layout of xp and server 2003
		local incdir="/usr/local/include/bind"
		local libdir="/usr/local/lib/bind"

		# windows xp has a silly bug in the installer it seems:
		[[ -x "${incdir}/sys" ]] || chmod a+x "${incdir}/sys"
	fi

	insinto /usr/include/bind

	for obj in "${incdir}"/*; do
		[[ -f "${obj}" ]] && doins    "${obj}"
		[[ -d "${obj}" ]] && doins -r "${obj}"
	done

	cd "${T}"
	# wrap some symbols for the sake of configure link test. the libbind names
	# symbols differently than required (some extra underscores), and renames
	# them through the headers. however this is not enough, if configure checks
	# don't include header files ... :(
	$(tc-getCC) -c "${FILESDIR}"/weak.s

	mkdir "${T}"/link || die "cannot mkdir"
	cd "${T}"/link

	# now for the _magic_ part...
	ar -x "${libdir}/libbind.a"
	# permissions are _totally_ broken here...
	chmod 666 *.o

	# remove the gethostent.o file, since the contained gethostbyname* functions
	# seem to not work on older interixen, whereas the libc contained versions
	# do work well enough.
	rm gethostent.o

	# find libdb.a from the system - need the _oold_ one...
	local mydb=

	for mydb in \
			"/usr/lib/x86/libdb.a" \
			"/usr/lib/libdb.a"; do
		if test -f "${mydb}"; then
			break
		fi
	done

	# this needs a _stoneage_ berkeley db, so we really need to take the
	# systems instead if installing db ourselves. newer db's don't have the
	# requested symbols (they do support it, but with a different name). Another
	# option would be to generate wrapper symbols for the things needed, but i'd
	# rather avoid doing so, since i don't know them all.
	$(tc-getCC) -shared -Wl,-h,libbind.so.${PV} -o libbind.so.${PV} *.o \
		../weak.o "${mydb}" || die "cannot link shared libbind"

	dolib.so libbind.so.${PV}

	# to prevent accidental linking during configure tests of packages which are
	# not prepared for itx-bind, install things in a separate directory.
	# packages need to explicitly add this and the include directory for this to
	# work!
	dosym ../libbind.so.${PV} /usr/lib/bind/libbind.so
	dosym ../libbind.so.${PV} /usr/lib/bind/libresolv.so # mean, huh? :)
}
