[pacman-dev] [PATCH] [makepkg] New patch for split debug support, using generic split packaging mechanism

Vitaliy Gorbunov vit.gorbunov at gmail.com
Wed Aug 10 14:25:58 EDT 2011


---------- Forwarded message ----------
From: Vitaliy Gorbunov <vit.gorbunov at gmail.com>
Date: Wed, Aug 10, 2011 at 9:14 PM
Subject: Re: [pacman-dev] [PATCH] [makepkg] New patch for split debug
support, using generic split packaging mechanism
To: Dan McGee <dpmcgee at gmail.com>


Sorry:) Here it is.
--- bin/makepkg    2011-08-10 19:37:37.000000000 +0300
+++ local/bin/makepkg4    2011-08-10 19:41:15.000000000 +0300
@@ -44,7 +44,7 @@
 srcdir="$startdir/src"
 pkgdir="$startdir/pkg"

-packaging_options=('strip' 'docs' 'libtool' 'emptydirs' 'zipman' 'purge')
+packaging_options=('strip' 'splitdbg' 'docs' 'libtool' 'emptydirs' 'zipman'
'purge')
 other_options=('ccache' 'distcc' 'buildflags' 'makeflags')
 splitpkg_overrides=('pkgver' 'pkgrel' 'pkgdesc' 'arch' 'license' 'groups' \
                     'depends' 'optdepends' 'provides' 'conflicts'
'replaces' \
@@ -74,6 +74,8 @@
 CHECKFUNC=0
 PKGFUNC=0
 SPLITPKG=0
+SPLIT_DBG=0
+SKIP_DEBUG_PACKAGE=0
 PKGLIST=()

 # Forces the pkgver of the current PKGBUILD. Used by the fakeroot call
@@ -902,21 +904,49 @@
         done
     fi

+    local is_splitdbg
+    [ "$(check_option splitdbg)" = "y" ] || (( SPLIT_DBG )) &&
is_splitdbg=1
+    (( is_splitdbg )) && backup_package_variables "dbg"
+
+    local dbgdir="$pkgdir-dbg"
     if [[ $(check_option strip) = y ]]; then
         msg2 "$(gettext "Stripping unneeded symbols from binaries and
libraries...")"
         # make sure library stripping variables are defined to prevent
excess stripping
         [[ -z ${STRIP_SHARED+x} ]] && STRIP_SHARED="-S"
         [[ -z ${STRIP_STATIC+x} ]] && STRIP_STATIC="-S"
-        local binary
+        local binary hardlink strip_opt
         find . -type f -perm -u+w 2>/dev/null | while read binary ; do
             case "$(file -bi "$binary")" in
                 *application/x-sharedlib*)  # Libraries (.so)
-                    /usr/bin/strip $STRIP_SHARED "$binary";;
+                    strip_opt=$STRIP_SHARED;;
                 *application/x-archive*)    # Libraries (.a)
-                    /usr/bin/strip $STRIP_STATIC "$binary";;
+                    strip_opt=$STRIP_STATIC;;
                 *application/x-executable*) # Binaries
-                    /usr/bin/strip $STRIP_BINARIES "$binary";;
+                    strip_opt=$STRIP_BINARIES;;
+                *) continue ;;
             esac
+            # Strip symbols
+            if (( is_splitdbg )); then
+                # Create directory for the symbol file
+                mkdir -p "${dbgdir}/usr/lib/debug/${binary%/*}"
+                if readelf -S $binary | grep "\.gnu_debuglink" &>/dev/null;
then
+                    # An already stripped binary is a hard link
+                    find ${STRIP_DIRS[@]} -samefile "$binary" 2>/dev/null |
while read hardlink ; do
+                        # Is the symbol file for the hardlink in the right
dir ?
+                        [ -e "${dbgdir}/usr/lib/debug/${hardlink#/}.debug"
] && \
+                        [ "${hardlink%/*}" != "${binary%/*}" ] && \
+                            ln
"${dbgdir}/usr/lib/debug/${hardlink#/}.debug"
"${dbgdir}/usr/lib/debug/${binary%/*}" && break
+                    done
+                else
+                    # Strip the file
+                    /usr/bin/objcopy --only-keep-debug "$binary"
"${dbgdir}/usr/lib/debug/${binary#/}.debug"
+                    /usr/bin/strip $strip_opts "$binary"
+                    /usr/bin/objcopy
--add-gnu-debuglink="${dbgdir}/usr/lib/debug/${binary#/}.debug" "$binary"
+                    chmod 644 "${dbgdir}/usr/lib/debug/${binary#/}.debug"
+                fi
+            else
+                /usr/bin/strip $strip_opts "$binary"
+            fi
         done
     fi

@@ -1008,6 +1038,12 @@
 }

 create_package() {
+    if (( SKIP_DEBUG_PACKAGE )); then
+        warning "$(gettext "No .debug files for debug package found,
skipping...")"
+        SKIP_DEBUG_PACKAGE=0
+        return
+    fi
+
     if [[ ! -d $pkgdir ]]; then
         error "$(gettext "Missing pkg/ directory.")"
         plain "$(gettext "Aborting...")"
@@ -1096,6 +1132,38 @@
     fi
 }

+add_split_debug_packages(){
+    [ ${#pkgname[@]} = 1 ] && eval "function package_${pkgname}() {
package;}"
+
+    local pkg pkgname_dbg
+    for pkg in ${pkgname[@]}
+    do
+        pkgname_dbg=( ${pkgname_dbg[@]} ${pkg} ${pkg/%/-dbg} )
+        eval "function package_${pkg}-dbg() { package_dbg; }"
+    done
+    pkgname=( ${pkgname_dbg[@]} )
+}
+
+package_dbg(){
+    check_dbg_files=`find $pkgdir/ -name "*.debug"`
+    if [ -z "$check_dbg_files" ]; then
+        SKIP_DEBUG_PACKAGE=1
+        return
+    fi
+
+    restore_package_variables "dbg"
+    pkgdesc="$pkgdesc (debugging symbols)"
+    depends=("${pkgname%-dbg}=$pkgver-$pkgrel")
+    groups=('debug' ${groups[@]/%/-debug})
+    optdepends=()
+    replaces=()
+    provides=()
+    conflicts=()
+    backup=()
+    options=(!strip !splitdbg docs !zipman !purge libtool !emptydirs)
+    unset install
+}
+
 create_srcpackage() {
     cd "$startdir"

@@ -1423,17 +1491,19 @@
 }

 backup_package_variables() {
-    local var
+    local var suffix
+    suffix=$1
     for var in ${splitpkg_overrides[@]}; do
-        local indirect="${var}_backup"
+        local indirect="${var}_backup${suffix}"
         eval "${indirect}=(\"\${$var[@]}\")"
     done
 }

 restore_package_variables() {
-    local var
+    local var suffix
+    suffix=$1
     for var in ${splitpkg_overrides[@]}; do
-        local indirect="${var}_backup"
+        local indirect="${var}_backup${suffix}"
         if [[ -n ${!indirect} ]]; then
             eval "${var}=(\"\${$indirect[@]}\")"
         else
@@ -1582,6 +1652,7 @@
     echo "$(gettext "  -r, --rmdeps     Remove installed dependencies after
a successful build")"
     echo "$(gettext "  -R, --repackage  Repackage contents of the package
without rebuilding")"
     echo "$(gettext "  -s, --syncdeps   Install missing dependencies with
pacman")"
+    echo "$(gettext "  -t, --splitdbg   Split debugging symbols into
separate package")"
     echo "$(gettext "  --allsource      Generate a source-only tarball
including downloaded sources")"
     echo "$(gettext "  --asroot         Allow makepkg to run as root
user")"
     printf "$(gettext "  --check          Run the check() function in the
%s")\n" "$BUILDSCRIPT"
@@ -1622,11 +1693,11 @@
 ARGLIST=("$@")

 # Parse Command Line Options.
-OPT_SHORT="AcCdefFghiLmop:rRsV"
+OPT_SHORT="AcCdefFghiLmop:rRstV"
 OPT_LONG="allsource,asroot,ignorearch,check,clean,cleancache,nodeps"
 OPT_LONG+=",noextract,force,forcever:,geninteg,help,holdver"
 OPT_LONG+=",install,log,nocolor,nobuild,nocheck,pkg:,rmdeps"
-OPT_LONG+=",repackage,skipinteg,source,syncdeps,version,config:"
+OPT_LONG+=",repackage,skipinteg,source,syncdeps,splitdbg,version,config:"
 # Pacman Options
 OPT_LONG+=",noconfirm,noprogressbar"
 OPT_TEMP="$(parse_options $OPT_SHORT $OPT_LONG "$@" || echo 'PARSE_OPTIONS
FAILED')"
@@ -1671,6 +1742,7 @@
         --skipinteg)      SKIPINTEG=1 ;;
         --source)         SOURCEONLY=1 ;;
         -s|--syncdeps)    DEP_BIN=1 ;;
+        -t|--splitdbg)    SPLIT_DBG=1 ;;

         -h|--help)        usage; exit 0 ;; # E_OK
         -V|--version)     version; exit 0 ;; # E_OK
@@ -1874,6 +1946,8 @@
 devel_check
 devel_update

+[ "$(check_option splitdbg)" = "y" ] || (( SPLIT_DBG )) &&
add_split_debug_packages
+
 if (( ${#pkgname[@]} > 1 )); then
     SPLITPKG=1
 fi



On Wed, Aug 10, 2011 at 9:09 PM, Dan McGee <dpmcgee at gmail.com> wrote:

> On Wed, Aug 10, 2011 at 12:04 PM, Vitaliy Gorbunov
> <vit.gorbunov at gmail.com> wrote:
> > I rewrite patch from Remy Oudomphen**g
> Rémy Oudompheng ? Not sure what the ** was for. :)
> > (http://bugs.archlinux.org/task/10975<
> http://bugs.archlinux.org/task/10975>)
> > in order to use generic split packaging mechanism.
> > The main idea is that debug packages will be added to pkgname array and
> for
> > each of it package_<name>-dbg function will be created. So it treated
> like
> > usual split packages.
> > Tested on split and non-split packages. All seems to work fine.
>
> Please send inline rather than as an attachment so we can review it,
> thanks!
>
> -Dan
>


More information about the pacman-dev mailing list