#!/bin/bash
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-devel/binutils-config/files/binutils-config-1.9,v 1.10 2007/05/06 09:04:01 vapier Exp $

# Format of /etc/env.d/binutils/:
#  config-TARGET:	CURRENT=version for TARGET
#  TARGET-VER:		has a TARGET and VER variable

[[ -z ${ROOT} ]] && ROOT="/"
[[ ${ROOT} != */ ]] && ROOT="${ROOT}/"
[[ ${ROOT} != /* ]] && ROOT="${PWD}${ROOT}"

cd /

trap ":" INT QUIT TSTP

argv0=${0##*/}
source /etc/init.d/functions.sh || {
	echo "${argv0}: Could not source /etc/init.d/functions.sh!" 1>&2
	exit 1
}
esyslog() { :; }
umask 022

usage() {
cat << USAGE_END

Usage: ${HILITE}binutils-config${NORMAL} ${GOOD}[options]${NORMAL} ${BRACKET}[binutils profile]${NORMAL}

${HILITE}General Options:${NORMAL}
  ${GOOD}-c, --get-current-profile${NORMAL}  Print current profile
  ${GOOD}-l, --list-profiles${NORMAL}        Print a list of available profiles
  ${GOOD}-u, --uninstall${NORMAL}            Remove all signs of specified target
  ${GOOD}-d, --debug${NORMAL}                Execute with debug output

${HILITE}Arch Specific Cruft:${NORMAL}
  ${GOOD}--amd64${NORMAL}                    Install extra amd64 links (x86_64)
  ${GOOD}--arm${NORMAL}                      Install extra arm links (arm/armeb)
  ${GOOD}--mips${NORMAL}                     Install extra mips links (mips/mipsel)
  ${GOOD}--x86${NORMAL}                      Install extra x86 links (i[3-6]86)

Profile names are of the form:  ${BRACKET}<CTARGET>-<binutils version>${NORMAL}
For example:                    ${BRACKET}i686-pc-linux-gnu-2.15.92.0.2${NORMAL}

For more info, please see ${HILITE}binutils-config${NORMAL}(8).
USAGE_END
}

switch_profile() {
	unset TARGET VER LIBPATH FAKE_TARGETS
	source "${ENV_D}/${PROFILE}"
	if [[ -z ${TARGET} ]] ; then
		eerror "${PROFILE} is invalid (no \$TARGET defined) :("
		return 1
	fi
	if [[ -z ${VER} ]] ; then
		eerror "${PROFILE} is invalid (no \$VER defined) :("
		return 1
	fi

	#
	# Older installs don't have 'FAKE_TARGETS' defined, so lets 
	# update these env.d entries so that we don't force the poor 
	# user to re-emerge their binutils just for 1 envvar :/
	#
	if [[ ${FAKE_TARGETS-poor user} == "poor user" ]] ; then
		local targ=${TARGET/-*}
		local FAKE_TARGETS=${TARGET}
		case ${targ} in
			mips|powerpc|sparc)
				FAKE_TARGETS="${FAKE_TARGETS} ${TARGET/-/64-}";;
			mips64|powerpc64|sparc64)
				FAKE_TARGETS="${FAKE_TARGETS} ${TARGET/64-/-}";;
		esac
		echo "FAKE_TARGETS=\"${FAKE_TARGETS}\"" >> "${ENV_D}/${PROFILE}"
	fi
	local fake_targ_append="${TARGET#*-}"
	FAKE_TARGETS="${FAKE_TARGETS} ${FAKE_TARGETS_USER// /-${fake_targ_append} }"

	ebegin "Switching to ${PROFILE}"

	#
	# Generate binary symlinks
	# On systems that do 32bit/64bit, we need to fake an 
	# extra set of binary names (${FAKE_TARGETS})
	#
	BINPATH=""
	BINPATH_LINKS=""
	if [[ ${TARGET} != ${HOST} ]] ; then
		#
		# Newer paths: /usr/${HOST}/${TARGET}/...
		# Older paths: /usr/${TARGET}/...
		#
		if [[ -d ${ROOT}/usr/${HOST}/${TARGET}/binutils-bin/${VER} ]] ; then
			BINPATH=/usr/${HOST}/${TARGET}/binutils-bin/${VER}
			BINPATH_LINKS=/usr/libexec/gcc/${TARGET}
		fi
	fi
	if [[ -z ${BINPATH} ]] ; then
		BINPATH=/usr/${TARGET}/binutils-bin/${VER}
		BINPATH_LINKS=/usr/${TARGET}/bin
	fi
	cd "${ROOT}/${BINPATH}" || exit 1
	mkdir -p "${ROOT}/${BINPATH_LINKS}" "${ROOT}/usr/bin"
	for x in * ; do
		ln -sf "${BINPATH}/${x}" "${ROOT}/${BINPATH_LINKS}/${x}"
		ln -sf "${BINPATH_LINKS}/${x}" "${ROOT}"/usr/bin/${TARGET}-${x}
		for fake in ${FAKE_TARGETS} ; do
			[[ -f ${ENV_D}/config-${fake} ]] && continue
			ln -sf "${BINPATH_LINKS}/${x}" "${ROOT}"/usr/bin/${fake}-${x}
		done
		if [[ ${TARGET} == ${HOST} ]] ; then
			ln -sf ${TARGET}-${x} "${ROOT}"/usr/bin/${x}
		fi
	done

	#
	# Generate library / ldscripts symlinks
	#
	LIBPATH=${LIBPATH:-/usr/lib/binutils/${TARGET}/${VER}}
	cd "${ROOT}/${LIBPATH}" || exit 1
	if [[ ${TARGET} == ${HOST} ]] ; then
		dstlib=${ROOT}/usr/${HOST}/lib
	else
		dstlib=${ROOT}/usr/${HOST}/${TARGET}/lib
		# Clean out old path
		rm -rf "${ROOT}"/usr/${TARGET}/lib/ldscripts
		rmdir "${ROOT}"/usr/${TARGET}/lib >& /dev/null
	fi
	# When upgrading, we need to clean up ldscripts and libs
	rm -rf "${dstlib}/ldscripts" "${ROOT}/${BINPATH_LINKS}"/ldscripts
	mkdir -p "${dstlib}"
	ln -sf "${LIBPATH}/ldscripts" "${dstlib}"/ldscripts
	find -L "${dstlib}" -type l -exec rm {} \;
	for x in lib* ; do
		ln -sf "${LIBPATH}/${x}" "${dstlib}/${x}"
	done

	#
	# Generate include symlinks
	#
	INCPATH=${LIBPATH}/include
	if [[ -d ${ROOT}/${INCPATH} ]] ; then
		cd "${ROOT}/${INCPATH}" || exit 1
		if [[ ${HOST} == ${TARGET} ]] ; then
			mkdir -p "${ROOT}/usr/include"
			for x in * ; do
				ln -sf "${INCPATH}/${x}" "${ROOT}/usr/include/${x}"
			done
		else
			# Clean out old path
			find . -type f -exec rm -f "${ROOT}/usr/${TARGET}/usr/include/{}" \;
			rmdir "${ROOT}/usr/${TARGET}/usr/include" >& /dev/null
			rmdir "${ROOT}/usr/${TARGET}/usr" >& /dev/null
			rmdir "${ROOT}/usr/${TARGET}" >& /dev/null
		fi
	fi

	#
	# Make sure proper paths get updated
	#
	if [[ ${TARGET} == ${HOST} ]] ; then
		DATAPATH=/usr/share/binutils-data/${TARGET}/${VER}
		[[ -d ${DATAPATH}/man ]] && \
		echo "MANPATH=${DATAPATH}/man" > "${ROOT}"/etc/env.d/05binutils
		[[ -d ${DATAPATH}/info ]] && \
		echo "INFOPATH=${DATAPATH}/info" >> "${ROOT}"/etc/env.d/05binutils
		# hmm, `ld` has this in SEARCH_DIR(), but ld.so does not ...
		echo "LDPATH=/usr/${TARGET}/lib" >> "${ROOT}"/etc/env.d/05binutils
	fi

	eend 0

	echo "CURRENT=${VER}" > "${ENV_D}/config-${TARGET}"

	#
	# Regen env.d if need/can be
	#
	if [[ ${ROOT} == "/" ]] && [[ ${TARGET} == ${HOST} ]] ; then
		env-update
		echo
		ewarn "Please remember to run:"
		echo
		ewarn "  # source /etc/profile"
		echo
	fi

	return 0
}

uninstall_target() {
	if [[ ${TARGET} == ${HOST} ]] ; then
		eerror "${argv0}: Refusing to uninstall native binutils"
		exit 1
	fi

	shopt -s nullglob
	PROFILE=""

	for PROFILE in "${ENV_D}"/${TARGET}-* ; do
		ewarn "Removing all signs of ${PROFILE##*/}"
		rm -f "${ENV_D}"/${PROFILE}
	done
	if [[ -z ${PROFILE} ]] && [[ ! -e ${ENV_D}/config-${TARGET} ]] ; then
		eerror "${argv0}: No profiles exist for '${TARGET}'"
		exit 1
	fi

	rm -f "${ENV_D}"/config-${TARGET}

	# XXX: we still leave behind FAKE_TARGETS in /usr/bin ...
	for x in addr2line ar as c++filt elf2flt flthdr gprof ld ld.real \
	         nm objcopy objdump ranlib readelf size strings strip ; do
		rm -f "${ROOT}"/usr/bin/${TARGET}-${x}
		rm -f "${ROOT}"/usr/{${HOST}/,}${TARGET}/bin/${x}
		rm -f "${ROOT}"/usr/libexec/gcc/${TARGET}/${x}
	done
	for x in ansidecl.h bfd.h bfdlink.h dis-asm.h symcat.h ; do
		rm -f "${ROOT}"/usr/{${HOST}/,}${TARGET}/{usr/,}include/${x}
	done
	for x in bfd iberty opcodes ; do
		rm -f "${ROOT}"/usr/${HOST}/${TARGET}/lib/lib${x}{{-*,}.so,.a,.la}
	done
	# Delete broken symlinks
	local destdir="${ROOT}/usr/${HOST}/${TARGET}"
	rm -f "${destdir}"/lib/ldscripts
	find -L "${destdir}"/lib -type l -exec rm {} \;
	rmdir "${destdir}"/lib "${destdir}" 2>/dev/null
	rmdir "${destdir}"/{bin,include,lib,usr} "${destdir}" 2>/dev/null
	rmdir "${ROOT}"/var/db/pkg/cross-${TARGET} 2>/dev/null

	rm -f "${ENV_D}"/${TARGET}-*
}

get_current_profile() {
	if [[ ! -f ${ENV_D}/config-${PROFILE} ]] ; then
		eerror "${argv0}: No binutils profile is active!"
		return 1
	fi

	source "${ENV_D}/config-${PROFILE}"

	if [[ -z ${CURRENT} ]] ; then
		eerror "${argv0}: No binutils profile is active!"
		return 1
	fi

	echo "${PROFILE}-${CURRENT}"

	return 0
}

list_profiles() {
	local i=1

	set_HOST

	if [[ ${ROOT} != / ]] ; then
		echo "Using binutils-config info in ${ROOT}"
	fi
	target=
	for x in "${ENV_D}"/* ; do
		if [[ -f ${x} ]] && [[ ${x/\/config-} == ${x} ]] ; then
			source "${x}"
			if [[ ${target} != ${TARGET} ]] ; then
				[[ -n ${target} ]] && echo
				target=${TARGET}
			fi

			x=${x##*/}
			if [[ -e ${ENV_D}/config-${TARGET} ]] ; then
				source "${ENV_D}/config-${TARGET}"
				if [[ ${VER} == ${CURRENT} ]] ; then
					[[ ${TARGET} == ${HOST} ]] \
						&& x="${x} ${GOOD}*${NORMAL}" \
						|| x="${x} ${HILITE}*${NORMAL}"
				fi
			fi
			echo " [${i}] ${x}"
			((++i))
		fi
	done
}

set_HOST() {
	[[ -n ${HOST} ]] && return 0

	if [[ -z ${CHOST} ]] ; then
		HOST=$(portageq envvar CHOST)
	else
		HOST=${CHOST}
	fi
}

ENV_D="${ROOT}etc/env.d/binutils"

DEBUG="no"
NEED_ACTION="yes"
DOIT="switch_profile"
PROFILE=""
FAKE_TARGETS_USER=""
HOST=""

while [[ $# -gt 0 ]] ; do
	x=$1
	shift
	case ${x} in
		-c|--get-current-profile)
			if [[ ${NEED_ACTION} == "yes" ]] ; then
				NEED_ACTION="no"
				DOIT="get_current_profile"
			fi
			;;
		-d|--debug)
			DEBUG="yes"
			;;
		-l|--list-profiles)
			if [[ ${NEED_ACTION} == "yes" ]] ; then
				NEED_ACTION="no"
				DOIT="list_profiles"
			fi
			;;
		-u|--uninstall)
			if [[ ${NEED_ACTION} == "yes" ]] ; then
				NEED_ACTION="no"
				DOIT="uninstall_target"
				TARGET=$1
				shift
			fi
			;;
		-h|--help)
			usage
			exit 0
			;;
		-V|--version)
			cvsver="$Header: /var/cvsroot/gentoo-x86/sys-devel/binutils-config/files/binutils-config-1.9,v 1.10 2007/05/06 09:04:01 vapier Exp $"
			cvsver=${cvsver##*binutils-config-}
			bver=${cvsver%%,v *}
			cvsver=${cvsver#* }
			echo "binutils-config-${bver} (r${cvsver%% *})"
			exit 0
			;;
		--amd64|--arm|--mips|--x86)
			if [[ ${NEED_ACTION} == "yes" ]] ; then
				# Make sure we have a space after each target
				NEED_ACTION="no"
				[[ -z ${PROFILE} ]] && PROFILE="current"
				case ${x} in
					--amd64) FAKE_TARGETS_USER="x86_64 ";;
					--arm)   FAKE_TARGETS_USER="arm armeb ";;
					--x86)   FAKE_TARGETS_USER="i386 i486 i586 i686 ";;
					--mips)  FAKE_TARGETS_USER="mips mips64 mipsel mipsel64 ";;
				esac
			fi
			;;
		-*)
			eerror "${0##*/}: Invalid switch!  Try '--help'."
			exit 1
			;;
		*)
			if [[ -n ${PROFILE} ]] && [[ ${PROFILE} != "current" ]] ; then
				eerror "${argv0}: Too many arguments!  Run ${argv0} without parameters for help."
				exit 1
			fi

			if [[ -z $(echo ${x} | tr -d '[:digit:]') ]] ; then
				# User gave us a # representing the profile
				i=1
				for y in "${ENV_D}"/* ; do
					[[ ${y/config-} != ${y} ]] && continue

					if [[ -f ${y} ]] && [[ ${x} -eq ${i} ]] ; then
						PROFILE=${y##*/}
						NEED_ACTION="no"
						break
					fi
					((++i))
				done
			fi

			if [[ -z ${PROFILE} ]] ; then
				# User gave us a full HOST-ver
				x=${x##*/}
				if [[ ! -f ${ENV_D}/${x} ]] && [[ ! -f ${ENV_D}/config-${x} ]] ; then
					# Maybe they just gave us a ver ...
					set_HOST
					if [[ -f ${ENV_D}/${HOST}-${x} ]] ; then
						x=${HOST}-${x}
					else
						eerror "${argv0}: Could not locate '$x' in '${ENV_D}/'!"
						exit 1
					fi
				fi
				PROFILE=${x}
				NEED_ACTION="no"
			fi
			;;
	esac
done

[[ ${NEED_ACTION} == "yes" ]] && usage && exit 1
[[ ${DEBUG} == "yes" ]] && set -x

[[ ${DOIT} != "list_profiles" ]] && set_HOST
[[ -z ${PROFILE} ]] && PROFILE=${HOST}
[[ ${PROFILE} == "current" ]] && PROFILE=$(PROFILE=${HOST} get_current_profile)
eval ${DOIT}

# vim:ts=4
