# This hook executes the following tasks: # - strips ELF binaries/libraries # - generates -dbg pkgs # - generates shlib-provides file for xbps-create(8) make_debug() { local dname= fname= dbgfile= [ -z "$XBPS_DEBUG_PKGS" -o -n "$disable_debug" -o -n "$nonfree" ] && return 0 dname=$(echo "$(dirname $1)"|sed -e "s|${PKGDESTDIR}||g") fname="$(basename $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= [ -z "$XBPS_DEBUG_PKGS" -o -n "$disable_debug" -o -n "$nonfree" ] && return 0 dname=$(echo "$(dirname $1)"|sed -e "s|${PKGDESTDIR}||g") fname="$(basename $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= [ -z "$XBPS_DEBUG_PKGS" -o -n "$disable_debug" -o -n "$nonfree" ] && 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 rmdir --ignore-fail-on-non-empty "${PKGDESTDIR}/usr/lib" 2>/dev/null return 0 } hook() { local fname= x= f= _soname= if [ -n "$nostrip" -o -n "$noarch" ]; then return 0 fi find ${PKGDESTDIR} -type f | while read f; do if [[ $f =~ ^/usr/lib/debug/ ]]; then continue fi fname=$(basename "$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 echo "$(file $f)" | grep -q "statically linked"; then # static binary $STRIP "$f" if [ $? -ne 0 ]; then msg_red "$pkgver: failed to strip ${f#$PKGDESTDIR}\n" return 1 fi echo " Stripped static executable: ${f#$PKGDESTDIR}" else make_debug "$f" $STRIP "$f" if [ $? -ne 0 ]; then msg_red "$pkgver: failed to strip ${f#$PKGDESTDIR}\n" return 1 fi echo " Stripped executable: ${f#$PKGDESTDIR}" attach_debug "$f" fi ;; application/x-sharedlib*) chmod +w "$f" # shared library make_debug "$f" $STRIP --strip-unneeded "$f" if [ $? -ne 0 ]; then msg_red "$pkgver: failed to strip ${f#$PKGDESTDIR}\n" return 1 fi echo " Stripped library: ${f#$PKGDESTDIR}" _soname=$(${OBJDUMP} -p "$f"|grep SONAME|awk '{print $2}') pattern="^[[:alnum:]]+(.*)+\.so(\.[0-9]+)*$" if [[ ${_soname} =~ $pattern ]]; then if [ ! -e ${PKGDESTDIR}/usr/lib/${fname} ]; then continue fi echo "${_soname}" >> ${PKGDESTDIR}/.shlib-provides fi attach_debug "$f" ;; application/x-archive*) chmod +w "$f" $STRIP --strip-debug "$f" if [ $? -ne 0 ]; then msg_red "$pkgver: failed to strip ${f#$PKGDESTDIR}\n" return 1 fi echo " Stripped static library: ${f#$PKGDESTDIR}";; esac done for f in ${shlib_provides}; do echo "$f" >> ${PKGDESTDIR}/.shlib-provides done if [ -s "$PKGDESTDIR/.shlib-provides" ]; then cat $PKGDESTDIR/.shlib-provides | tr '\n' ' ' > $PKGDESTDIR/shlib-provides echo >> $PKGDESTDIR/shlib-provides rm -f $PKGDESTDIR/.shlib-provides fi create_debug_pkg return $? }