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

EAPI=5

inherit eutils multilib

DESCRIPTION="Wrappers for gcc tools to be used on non-native CHOSTs"
HOMEPAGE="https://www.gentoo.org"
SRC_URI=""

LICENSE="public-domain"
SLOT="0"
KEYWORDS="~amd64"
IUSE=""

RDEPEND="sys-devel/gcc:="

S=${WORKDIR}

mkwrap() {
	einfo "	${2}"

	cat > "${T}"/wrapper <<-_EOF_
		#!${EPREFIX}/bin/sh
		exec ${1} $(get_abi_CFLAGS) "\${@}"
	_EOF_

	newbin "${T}"/wrapper "${2}"
}

src_install() {
	local host_prefix=${CHOST}
	# stolen from sys-devel/gcc-config
	# TODO: check if all of them actually support $(get_ABI_CFLAGS)
	local tools=(
		cpp cc gcc c++ g++ f77 g77 gcj gcjh gdc gdmd gfortran gccgo
	)

	cd "${EROOT%/}"/usr/bin || die
	eshopts_push -s nullglob

	# same as toolchain.eclass
	: ${TARGET_DEFAULT_ABI:=${DEFAULT_ABI}}
	: ${TARGET_MULTILIB_ABIS:=${MULTILIB_ABIS}}
	local ABI t e
	for ABI in $(get_all_abis TARGET); do
		[[ ${ABI} == ${TARGET_DEFAULT_ABI} ]] && continue

		einfo "Creating wrappers for ${ABI} ..."
		for t in "${tools[@]}"; do
			# look for both plain *-gcc and e.g. *-gcc-4.8.3
			# (but avoid *-gcc-nm)
			# note: nullglob applied above
			for e in ${host_prefix}[-]${t}{,-[0-9]*}; do
				local newname=$(get_abi_CHOST)-${e#${host_prefix}-}

				einfo "	${newname}"

				cat > "${T}"/wrapper <<-_EOF_
					#!${EPREFIX}/bin/sh
					exec ${e} $(get_abi_CFLAGS) "\${@}"
				_EOF_

				newbin "${T}"/wrapper "${newname}"
			done
		done
	done

	eshopts_pop
}
