#!/bin/bash
# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id: /var/cvsroot/gentoo-src/portage/bin/prepstrip,v 1.23.2.3 2005/08/15 02:58:20 vapier Exp $

source "${PORTAGE_BIN_PATH:-/usr/lib/portage/bin}"/isolated-functions.sh

if hasq nostrip ${FEATURES} ${RESTRICT} || \
   hasq strip ${RESTRICT}
then
	exit 0
fi

STRIP=${STRIP:-${CHOST}-strip}
type -p -- ${STRIP} > /dev/null || STRIP=strip
OBJCOPY=${OBJCOPY:-${CHOST}-objcopy}
type -p -- ${OBJCOPY} > /dev/null || OBJCOPY=objcopy

export PORTAGE_STRIP_FLAGS=${PORTAGE_STRIP_FLAGS:---strip-unneeded}

banner=1

save_elf_debug() {
	local x=$1
	local y="${D}usr/lib/debug/${x:${#D}}.debug"

	hasq splitdebug ${FEATURES} || return 0

	# dont save debug info twice.
	[[ ${x:7} == ".debug" ]] && return 0

	mkdir -p $(dirname "${y}")
	${OBJCOPY} --only-keep-debug "${x}" "${y}"
	${OBJCOPY} --add-gnu-debuglink="${y}" "${x}"
	chmod a-x,o-w "${y}"

	hasq installsources ${FEATURES} || return 0

	if [[ -x "/usr/bin/debugedit" ]] ; then
		debugedit -b "${WORKDIR}" -d /usr/src/debug/${PF} -l "${T}"/debug.sources "${x}"
		if [[ -s ${T}/debug.sources ]] ; then 
			[[ -d ${D}/usr/src/debug/${PF} ]] || mkdir -p "${D}/usr/src/debug/${PF}"
			cat "${T}"/debug.sources | (cd "${WORKDIR}"; LANG=C sort -z -u | rsync -a0 --files-from=- "${WORKDIR}/" "${D}/usr/src/debug/${PF}/" )
		fi
	fi
}

# The existance of the section .symtab tells us that a binary is stripped.
# We want to log already stripped binaries, as this may be a QA violation.
# They prevent us from getting the splitdebug data.
f="$(scanelf -yqRBF '#k%F' -k '!.symtab' "$@")"
if [[ -n "${f}" ]] ; then
	vecho -e "\n\aQA Notice: pre-stripped files found:\a"
	vecho "${f}"
	echo "${f}" > "${T}"/scanelf-already-stripped.log
fi

# Now we look for unstripped binaries.
for x in $(scanelf -yqRBF '#k%F' -k '.symtab' "$@") $(for y in "$@"; do find "${y}" -type f -name '*.a' -print ; done); do
	if [[ ${banner} -eq 1 ]] ; then
		vecho "strip: ${STRIP} ${PORTAGE_STRIP_FLAGS}"
		banner=0
	fi

	f=$(file "${x}") || continue
	[[ -z ${f} ]] && continue

	# The noglob funk is to support STRIP_MASK="/*/booga" and to keep
	#  the for loop from expanding the globs.
	# The eval echo is to support STRIP_MASK="/*/{booga,bar}" sex.
	set -o noglob
	stripitbaby=1
	for m in $(eval echo ${STRIP_MASK}) ; do
		[[ ${x} == ${m} ]] && stripitbaby=1 && break
	done
	set +o noglob

	if [[ ${f} == *"current ar archive"* ]] ; then
		vecho "   ${x:${#D}}"
		[[ ${stripitbaby} -eq 1 ]] && ${STRIP} -g "${x}"
	fi
	if [[ ${f} == *"SB executable"* || ${f} == *"SB shared object"* ]] ; then
		vecho "   ${x:${#D}}"
		save_elf_debug "${x}"
		[[ ${stripitbaby} -eq 1 ]] && ${STRIP} ${PORTAGE_STRIP_FLAGS} "${x}"
	fi
done
