[pacman-dev] [PATCH] [makepkg] split debug support

Arerep Serdna aepd87 at gmail.com
Fri May 21 19:10:21 EDT 2010


ver 2

~ Regression: STRIP_DIRS should be unquoted to handle /opt/*
~ Bad assignments for $dirname

ver 1

~ Less code repetition
~ Drop -t flag; OPTIONS=(splitdbg) only
~ secure_dir isn't really secure but I couldn't think of a better name

Signed-off-by: Arerep Serdna <aepd87 at gmail.com>
---

Original by Jan M. (funkyou): http://bugs.archlinux.org/task/10975

Signed-off-by: Arerep Serdna <aepd87 at gmail.com>
---
 etc/makepkg.conf.in   |    1 +
 scripts/makepkg.sh.in |  134 ++++++++++++++++++++++++++++++++-----------------
 2 files changed, 89 insertions(+), 46 deletions(-)

diff --git a/etc/makepkg.conf.in b/etc/makepkg.conf.in
index f0d1c44..f744ac3 100644
--- a/etc/makepkg.conf.in
+++ b/etc/makepkg.conf.in
@@ -62,6 +62,7 @@ BUILDENV=(fakeroot !distcc color !ccache)
 #  A negated option will do the opposite of the comments below.
 #
 #-- strip:     Strip symbols from binaries/libraries in STRIP_DIRS
+#-- splitdbg:  Same as above, while keeping the symbols in usr/lib/debug
 #-- docs:      Save doc directories specified by DOC_DIRS
 #-- libtool:   Leave libtool (.la) files in packages
 #-- emptydirs: Leave empty directories in packages
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 1707245..bd7babd 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -43,8 +43,9 @@ BUILDSCRIPT='@BUILDSCRIPT@'
 startdir="$PWD"
 srcdir="$startdir/src"
 pkgdir="$startdir/pkg"
+dbgdir="$startdir/dbg"
 
-packaging_options=('strip' 'docs' 'libtool' 'emptydirs' 'zipman' 'purge')
+packaging_options=('strip' 'splitdbg' 'docs' 'libtool' 'emptydirs' 'zipman' 'purge')
 other_options=('ccache' 'distcc' 'makeflags' 'force')
 splitpkg_overrides=('pkgver' 'pkgrel' 'pkgdesc' 'arch' 'license' 'groups' \
                     'depends' 'optdepends' 'provides' 'conflicts' 'replaces' \
@@ -808,6 +809,28 @@ run_package() {
 	run_function "$pkgfunc"
 }
 
+secure_dir() {
+	[[ -d $1 ]] || mkdir -p "$1"; chmod a-s "$1"
+}
+
+# strip_flags must be declared local in the inclosing function
+pre_strip() {
+	local binary
+	while read binary; do
+		case "$(file -biz "$binary")" in
+			*application/x-sharedlib*)  # Libraries (.so)
+				strip_flags="$STRIP_SHARED";;
+			*application/x-archive*)    # Libraries (.a)
+				strip_flags="$STRIP_STATIC";;
+			*application/x-executable*) # Binaries
+				strip_flags="$STRIP_BINARIES";;
+			*)
+				continue;;
+		esac
+		echo "$binary"
+	done < <(find ${STRIP_DIRS[@]} -type f -perm -u+w 2>/dev/null)
+}
+
 tidy_install() {
 	cd "$pkgdir"
 	msg "$(gettext "Tidying install...")"
@@ -865,21 +888,32 @@ tidy_install() {
 		done
 	fi
 
-	if [[ $(check_option strip) = y && -n ${STRIP_DIRS[*]} ]]; then
-		msg2 "$(gettext "Stripping unneeded symbols from binaries and libraries...")"
-		local binary
-		find ${STRIP_DIRS[@]} -type f -perm -u+w 2>/dev/null | while read binary ; do
-			case "$(file -biz "$binary")" in
-				*compressed-encoding*)      # Skip compressed binaries
-					;;
-				*application/x-sharedlib*)  # Libraries (.so)
-					/usr/bin/strip $STRIP_SHARED "$binary";;
-				*application/x-archive*)    # Libraries (.a)
-					/usr/bin/strip $STRIP_STATIC "$binary";;
-				*application/x-executable*) # Binaries
-					/usr/bin/strip $STRIP_BINARIES "$binary";;
-			esac
-		done
+	if [[ -n ${STRIP_DIRS[*]} ]]; then
+		local strip_flags
+		if [[ $(check_option splitdbg) = "y" ]]; then
+			msg2 "$(gettext "Moving debugging symbols from binaries and libraries into separate files...")"
+			pre_strip | while read binary; do
+				basename="${binary%%*/}"
+				dirname="${binary%/*}"
+				dbg_file="$basename.debug"
+				dbg_dest="$dbgdir/usr/lib/debug/$binary.debug"
+				dbg_destdir="${dbg_dest%/*}"
+				pushd "$dirname" &>/dev/null
+					/usr/bin/objcopy --only-keep-debug "$basename" "$dbg_file"
+					/usr/bin/strip $strip_flags "$basename"
+					/usr/bin/objcopy --add-gnu-debuglink="$dbg_file" "$basename"
+					if [[ ! -d $dbg_destdir ]]; then
+						mkdir -p "$dbg_destdir"
+					fi
+					mv "$dbg_file" "$dbg_dest"
+				popd &>/dev/null
+			done
+		elif [[ $(check_option strip) = "y" ]]; then
+			msg2 "$(gettext "Stripping unneeded symbols from binaries and libraries...")"
+			pre_strip | while read binary; do
+				/usr/bin/strip $strip_flags "$binary"
+			done
+		fi
 	fi
 
 	if [[ $(check_option libtool) = "n" ]]; then
@@ -1070,12 +1104,23 @@ create_package() {
 	fi
 }
 
+create_dbgpackage() {
+	[[ -n $(find "$dbgdir" -type f -name \*.debug -print -quit) &&
+		$(check_option splitdbg) = "y" ]] || return 0
+	local pkg="${1:-$pkgname}"
+	pkgdesc+=" (Debug symbols)"
+	pkgdir="$dbgdir"
+	depends=("$pkg")
+	unset backup build changelog conflicts install optdepends \
+		provides replaces source
+	create_package "$pkg-debug"
+}
+
 create_srcpackage() {
 	cd "$startdir"
 
 	# Get back to our src directory so we can begin with sources.
-	mkdir -p "$srcdir"
-	chmod a-s "$srcdir"
+	secure_dir "$srcdir"
 	cd "$srcdir"
 	if (( ! SKIPINTEG || SOURCEONLY == 2 )); then
 		download_sources
@@ -1417,6 +1462,24 @@ restore_package_variables() {
 	done
 }
 
+process_splitpkg() {
+	for pkg in ${pkgname[@]}; do
+		for dir in {pkg,dbg}dir; do
+			read $dir <<<"${!dir}/$pkg"
+			secure_dir "${!dir}"
+		done
+		backup_package_variables
+		run_package $pkg
+		tidy_install
+		create_package $pkg
+		create_dbgpackage $pkg
+		restore_package_variables
+		for dir in {pkg,dbg}dir; do
+			read $dir <<<"${!dir%/*}"
+		done
+	done
+}
+
 # getopt like parser
 parse_options() {
 	local short_options=$1; shift;
@@ -1782,8 +1845,7 @@ else
 fi
 
 if (( GENINTEG )); then
-	mkdir -p "$srcdir"
-	chmod a-s "$srcdir"
+	secure_dir "$srcdir"
 	cd "$srcdir"
 	download_sources
 	generate_checksums
@@ -1884,18 +1946,9 @@ if (( INFAKEROOT )); then
 			tidy_install
 		fi
 		create_package
+		create_dbgpackage
 	else
-		for pkg in ${pkgname[@]}; do
-			pkgdir="$pkgdir/$pkg"
-			mkdir -p "$pkgdir"
-			chmod a-s "$pkgdir"
-			backup_package_variables
-			run_package $pkg
-			tidy_install
-			create_package $pkg
-			restore_package_variables
-			pkgdir="${pkgdir%/*}"
-		done
+		process_splitpkg
 	fi
 
 	msg "$(gettext "Leaving fakeroot environment.")"
@@ -1949,8 +2002,7 @@ fi
 umask 0022
 
 # get back to our src directory so we can begin with sources
-mkdir -p "$srcdir"
-chmod a-s "$srcdir"
+secure_dir "$srcdir"
 cd "$srcdir"
 
 if (( NOEXTRACT )); then
@@ -1989,8 +2041,7 @@ else
 		msg "$(gettext "Removing existing pkg/ directory...")"
 		rm -rf "$pkgdir"
 	fi
-	mkdir -p "$pkgdir"
-	chmod a-s "$pkgdir"
+	secure_dir "$pkgdir"
 	cd "$startdir"
 
 	# if we are root or if fakeroot is not enabled, then we don't use it
@@ -2012,18 +2063,9 @@ else
 				fi
 			fi
 			create_package
+			create_dbgpackage
 		else
-			for pkg in ${pkgname[@]}; do
-				pkgdir="$pkgdir/$pkg"
-				mkdir -p "$pkgdir"
-				chmod a-s "$pkgdir"
-				backup_package_variables
-				run_package $pkg
-				tidy_install
-				create_package $pkg
-				restore_package_variables
-				pkgdir="${pkgdir%/*}"
-			done
+			process_splitpkg
 		fi
 	else
 		if (( ! REPKG && ( PKGFUNC || SPLITPKG ) )); then
-- 
1.7.1



More information about the pacman-dev mailing list