vp-build/common/hooks/post-install/03-strip-and-debug-pkgs.sh
Juan RP 86ba1ea9c5 hooks/strip: before stripping make sure files have write bit set.
... otherwise strip(1) errors out. Perl installs shlibs without write
bit set and results in EPERM errors.

Perl could be fixed instead, but meanwhile this works.
2014-10-12 08:56:32 +02:00

147 lines
3.7 KiB
Bash

# 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 $?
}