#!/bin/bash
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

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

banner=false
SKIP_STRIP=false
if hasq nostrip ${FEATURES} || \
   hasq strip ${RESTRICT}
then
	SKIP_STRIP=true
	banner=true
	hasq installsources ${FEATURES} || 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

# We'll leave out -R .note for now until we can check out the relevance
# of the section when it has the ALLOC flag set on it ...
export SAFE_STRIP_FLAGS="--strip-unneeded"
export PORTAGE_STRIP_FLAGS=${PORTAGE_STRIP_FLAGS-${SAFE_STRIP_FLAGS} -R .comment}
prepstrip_sources_dir=/usr/src/debug/${CATEGORY}/${PF}

if hasq installsources ${FEATURES} && ! type -P debugedit >/dev/null ; then
	ewarn "FEATURES=installsources is enabled but the debugedit binary could not"
	ewarn "be found. This feature will not work unless debugedit is installed!"
fi

unset ${!INODE_*}

inode_var_name() {
	if  [[ $USERLAND = BSD ]] ; then
		stat -f 'INODE_%d_%i' "$1"
	else
		stat -c 'INODE_%d_%i' "$1"
	fi
}

save_elf_sources() {
	hasq installsources ${FEATURES} || return 0
	hasq installsources ${RESTRICT} && return 0
	type -P debugedit >/dev/null || return 0

	local x=$1
	local inode=$(inode_var_name "$x")
	[[ -n ${!inode} ]] && return 0
	debugedit -b "${WORKDIR}" -d "${prepstrip_sources_dir}" \
		-l "${T}"/debug.sources "${x}"
}

save_elf_debug() {
	hasq splitdebug ${FEATURES} || return 0

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

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

	# this will recompute the build-id, but for now that's ok
	local buildid="$( type -P debugedit >/dev/null && debugedit -i "${x}" )"

	mkdir -p $(dirname "${y}")

	local inode=$(inode_var_name "$x")
	if [[ -n ${!inode} ]] ; then
		ln "${D}usr/lib/debug/${!inode:${#D}}.debug" "$y"
	else
		eval $inode=\$x
		${OBJCOPY} --only-keep-debug "${x}" "${y}"
		${OBJCOPY} --add-gnu-debuglink="${y}" "${x}"
		[[ -g ${x} ]] && chmod go-r "${y}"
		[[ -u ${x} ]] && chmod go-r "${y}"
		chmod a-x,o-w "${y}"
	fi

	if [[ -n ${buildid} ]] ; then
		local buildid_dir="${D}usr/lib/debug/.build-id/${buildid:0:2}"
		local buildid_file="${buildid_dir}/${buildid:2}"
		mkdir -p "${buildid_dir}"
		ln -s "../../${x:${#D}}.debug" "${buildid_file}.debug"
		ln -s "/${x:${#D}}" "${buildid_file}"
	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.
if ! hasq binchecks ${RESTRICT} && \
	! hasq strip ${RESTRICT} ; then
	log=$T/scanelf-already-stripped.log
	qa_var="QA_PRESTRIPPED_${ARCH/-/_}"
	[[ -n ${!qa_var} ]] && QA_PRESTRIPPED="${!qa_var}"
	scanelf -yqRBF '#k%F' -k '!.symtab' "$@" | sed -e "s#^$D##" > "$log"
	if [[ -n $QA_PRESTRIPPED && -s $log && \
		${QA_STRICT_PRESTRIPPED-unset} = unset ]] ; then
		shopts=$-
		set -o noglob
		for x in $QA_PRESTRIPPED ; do
			sed -e "s#^${x#/}\$##" -i "$log"
		done
		set +o noglob
		set -$shopts
	fi
	sed -e "/^\$/d" -e "s#^#/#" -i "$log"
	if [[ -s $log ]] ; then
		vecho -e "\n"
		eqawarn "QA Notice: Pre-stripped files found:"
		eqawarn "$(<"$log")"
	else
		rm -f "$log"
	fi
fi

# Now we look for unstripped binaries.
for x in \
	$(scanelf -yqRBF '#k%F' -k '.symtab' "$@") \
	$(find "$@" -type f -name '*.a')
do
	if ! ${banner} ; then
		vecho "strip: ${STRIP} ${PORTAGE_STRIP_FLAGS}"
		banner=true
	fi

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

	if ! ${SKIP_STRIP} ; then
		# 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
		strip_this=true
		for m in $(eval echo ${STRIP_MASK}) ; do
			[[ /${x#${D}} == ${m} ]] && strip_this=false && break
		done
		set +o noglob
	else
		strip_this=false
	fi

	# only split debug info for final linked objects
	# or kernel modules as debuginfo for intermediatary
	# files (think crt*.o from gcc/glibc) is useless and
	# actually causes problems.  install sources for all
	# elf types though cause that stuff is good.

	if [[ ${f} == *"current ar archive"* ]] ; then
		vecho "   ${x:${#D}}"
		if ${strip_this} ; then
			# hmm, can we split debug/sources for .a ?
			${STRIP} -g "${x}"
		fi
	elif [[ ${f} == *"SB executable"* || ${f} == *"SB shared object"* ]] ; then
		vecho "   ${x:${#D}}"
		save_elf_sources "${x}"
		if ${strip_this} ; then
			save_elf_debug "${x}"
			${STRIP} ${PORTAGE_STRIP_FLAGS} "${x}"
		fi
	elif [[ ${f} == *"SB relocatable"* ]] ; then
		vecho "   ${x:${#D}}"
		save_elf_sources "${x}"
		if ${strip_this} ; then
			[[ ${x} == *.ko ]] && save_elf_debug "${x}"
			${STRIP} ${SAFE_STRIP_FLAGS} "${x}"
		fi
	fi
done

if [[ -s ${T}/debug.sources ]] && \
        hasq installsources ${FEATURES} && \
        ! hasq installsources ${RESTRICT} && \
        type -P debugedit >/dev/null
then
	vecho "installsources: rsyncing source files"
	[[ -d ${D}${prepstrip_sources_dir} ]] || mkdir -p "${D}${prepstrip_sources_dir}"
	grep -zv '/<[^/>]*>$' "${T}"/debug.sources | \
		(cd "${WORKDIR}"; LANG=C sort -z -u | \
		rsync -tL0 --files-from=- "${WORKDIR}/" "${D}${prepstrip_sources_dir}/" )

	# Preserve directory structure.
	# Needed after running save_elf_sources.
	# https://bugzilla.redhat.com/show_bug.cgi?id=444310
	while read -r -d $'\0' emptydir
	do
		touch "$emptydir"/.keepdir
	done < <(find "${D}${prepstrip_sources_dir}/" -type d -empty -print0)
fi
