# This hook executes the following tasks:
#	- strips ELF binaries/libraries
#	- generates -dbg pkgs

make_debug() {
	local dname= fname= dbgfile=

	[ -n "$nodebug" ] && return 0

	dname=${1%/*}/ ; dname=${dname#$PKGDESTDIR}
	fname="${1##*/}"
	dbgfile="${dname}/${fname}"

	mkdir -p "${PKGDESTDIR}/usr/lib/debug/${dname}"
	$OBJCOPY --only-keep-debug --compress-debug-sections \
		"$1" "${PKGDESTDIR}/usr/lib/debug/${dbgfile}"
	if [ $? -ne 0 ]; then
		msg_red "${pkgver}: failed to create dbg file: ${dbgfile}\n"
		return 1
	fi
	chmod 644 "${PKGDESTDIR}/usr/lib/debug/${dbgfile}"
}

attach_debug() {
	local dname= fname= dbgfile=

	[ -n "$nodebug" ] && return 0

	dname=${1%/*}/ ; dname=${dname#$PKGDESTDIR}
	fname="${1##*/}"
	dbgfile="${dname}/${fname}"

	$OBJCOPY --add-gnu-debuglink="${PKGDESTDIR}/usr/lib/debug/${dbgfile}" "$1"
	if [ $? -ne 0 ]; then
		msg_red "${pkgver}: failed to attach dbg to ${dbgfile}\n"
		return 1
	fi
}

create_debug_pkg() {
	local _pkgname= _destdir=

	[ -n "$nodebug" ] && return 0
	[ ! -d "${PKGDESTDIR}/usr/lib/debug" ] && return 0

	_pkgname="${pkgname}-dbg-${version}"
	_destdir="${XBPS_DESTDIR}/${XBPS_CROSS_TRIPLET}/${_pkgname}"
	mkdir -p "${_destdir}/usr/lib"
	mv ${PKGDESTDIR}/usr/lib/debug ${_destdir}/usr/lib
	if [ $? -ne 0 ]; then
		msg_red "$pkgver: failed to create debug pkg\n"
		return 1
	fi
	printf "${pkgver} " >> ${_destdir}/rdeps
	rmdir --ignore-fail-on-non-empty "${PKGDESTDIR}/usr/lib" 2>/dev/null
	return 0
}

hook() {
	local fname= x= f= _soname= STRIPCMD=

	if [ -n "$nostrip" ]; then
		return 0
	fi

	STRIPCMD=/usr/bin/$STRIP

	find ${PKGDESTDIR} -type f | while read f; do
		if [[ $f =~ ^${PKGDESTDIR}/usr/lib/debug/ ]]; then
			continue
		fi

		fname=${f##*/}
		for x in ${nostrip_files}; do
			if [ "$x" = "$fname" ]; then
				found=1
				break
			fi
		done
		if [ -n "$found" ]; then
			unset found
			continue
		fi
		case "$(file -bi "$f")" in
		application/x-executable*)
			chmod +w "$f"
			if [[ $(file $f) =~ "statically linked" ]]; then
				# static binary
				if ! $STRIPCMD "$f"; then
					msg_red "$pkgver: failed to strip ${f#$PKGDESTDIR}\n"
					return 1
				fi
				echo "   Stripped static executable: ${f#$PKGDESTDIR}"
			else
				make_debug "$f"
				if ! $STRIPCMD "$f"; then
					msg_red "$pkgver: failed to strip ${f#$PKGDESTDIR}\n"
					return 1
				fi
				echo "   Stripped executable: ${f#$PKGDESTDIR}"
				unset nopie_found
				for x in ${nopie_files}; do
					if [ "$x" = "${f#$PKGDESTDIR}" ]; then
						nopie_found=1
						break
					fi
				done
				if [ -z "$nopie" ] && [ -z "$nopie_found" ]; then
					msg_red "$pkgver: non-PIE executable found in PIE build: ${f#$PKGDESTDIR}\n"
					return 1
				fi
				attach_debug "$f"
			fi
			;;
		application/x-sharedlib*|application/x-pie-executable*)
			local type="$(file -b "$f")"
			if [[ $type =~ "no machine" ]]; then
				# using ELF as a container format (e.g. guile)
				echo "   Ignoring ELF file without machine set: ${f#$PKGDESTDIR}"
				continue
			fi

			chmod +w "$f"
			# shared library
			make_debug "$f"
			if ! $STRIPCMD --strip-unneeded "$f"; then
				msg_red "$pkgver: failed to strip ${f#$PKGDESTDIR}\n"
				return 1
			fi
			if [[ $type =~ "interpreter " ]]; then
				echo "   Stripped position-independent executable: ${f#$PKGDESTDIR}"
			else
				echo "   Stripped library: ${f#$PKGDESTDIR}"
			fi
			attach_debug "$f"
			;;
		application/x-archive*)
			chmod +w "$f"
			if ! $STRIPCMD --strip-debug "$f"; then
				msg_red "$pkgver: failed to strip ${f#$PKGDESTDIR}\n"
				return 1
			fi
			echo "   Stripped static library: ${f#$PKGDESTDIR}";;
		esac
	done
	create_debug_pkg
	return $?
}
