[pacman-dev,v2,2/2] makepkg: tell the compiler to record debugging info for debug packages

Message ID 20171030183523.25835-2-eschwartz@archlinux.org
State Accepted, archived
Headers show
Series [pacman-dev,v2,1/2] makepkg: Add a config option to specify the location of debug sources | expand

Commit Message

Eli Schwartz Oct. 30, 2017, 6:35 p.m. UTC
In commit 8b0d59b83a60eb504567590346119fe4cd891cad support was added for
storing the source files of binaries in debug packages. This made use of
the debugedit program which is part of the RPM package manager, which is
not very standalone.

The same effect can be achieved using -fdebug-prefix-map, an option
accepted by both the gcc and clang compilers which modifies how the
compiler itself stores the references to the source files rather than
requiring us to later edit the produced binaries. This also removes the
dependency on external programs like debugedit.

As a result of this change, source files will only be effectively added
for programs which actually use the exported CFLAGS. This is a reasonable
tradeoff as we expect our CFLAGS to be used rather than ignored. Upstream
software which do not produce useful debug packages are expected to fix
their build systems to respect the environment CFLAGS.

As a result of this change, the routine for extracting source filenames
from binaries had to be modified to derive the source file from the
final debug location, rather than the other way around.

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>

v2: split out DBGSRCDIR changes into separate patch

 scripts/libmakepkg/tidy/strip.sh.in | 7 ++-----
 scripts/makepkg.sh.in               | 4 ++++
 2 files changed, 6 insertions(+), 5 deletions(-)


diff --git a/scripts/libmakepkg/tidy/strip.sh.in b/scripts/libmakepkg/tidy/strip.sh.in
index e88bde78..8a1d6096 100644
--- a/scripts/libmakepkg/tidy/strip.sh.in
+++ b/scripts/libmakepkg/tidy/strip.sh.in
@@ -57,15 +57,12 @@  strip_file() {
 		# copy source files to debug directory
 		local f t
-		while read -r f; do
-			t=${f/"$srcdir"/$dbgsrc}
+		while read -r t; do
+			f=${t/$dbgsrc/"$srcdir"}
 			mkdir -p "${t%/*}"
 			cp -- "$f" "$t"
 		done < <(source_files "$binary")
-		# adjust debug symbols to point at sources
-		debugedit -b "${srcdir}" -d /usr/src/debug/ -i "$binary" &> /dev/null
 		# copy debug symbols to debug directory
 		mkdir -p "$dbgdir/${binary%/*}"
 		objcopy --only-keep-debug "$binary" "$dbgdir/$binary.debug"
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 35665f16..cdcda4e8 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -379,6 +379,10 @@  prepare_buildenv() {
 	if check_option "debug" "y"; then
+		if [[ -v DBGSRCDIR ]]; then
+			DEBUG_CFLAGS+=" -fdebug-prefix-map=$srcdir=$DBGSRCDIR"
+			DEBUG_CXXFLAGS+=" -fdebug-prefix-map=$srcdir=$DBGSRCDIR"
+		fi