[pacman-dev] [PATCH] makepkg: tell the compiler to record debugging info for debug packages

Allan McRae allan at archlinux.org
Sun Oct 8 13:53:14 UTC 2017


On 08/10/17 16:38, Eli Schwartz wrote:
> 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.
> 
> Signed-off-by: Eli Schwartz <eschwartz at archlinux.org>

This patch is doing many things at once.

1) Add the DBGSRCDIR configuration option
2) Add -fdebug-prefix-map
3) What ever the changes in the while loop are...
(at first glance they seem wrong)

Please submit as separate patches.

> ---
>  doc/makepkg.conf.5.txt              |  6 ++++++
>  etc/makepkg.conf.in                 |  2 ++
>  scripts/libmakepkg/tidy/strip.sh.in | 11 ++++-------
>  scripts/makepkg.sh.in               |  4 ++++
>  4 files changed, 16 insertions(+), 7 deletions(-)
> 
> diff --git a/doc/makepkg.conf.5.txt b/doc/makepkg.conf.5.txt
> index d61858ca..ca74c2dd 100644
> --- a/doc/makepkg.conf.5.txt
> +++ b/doc/makepkg.conf.5.txt
> @@ -215,6 +215,12 @@ Options
>  	instruct makepkg which files to remove from the package. This is
>  	useful for index files that are added by multiple packages.
>  
> +**DBGSRCDIR=**"/usr/src/debug"::
> +	If `strip` and `debug` are specified in the `OPTIONS` array, this variable
> +	will instruct makepkg where to place source files for installed binaries.
> +	The compiler will be instructed to link this directory for the debugger
> +	search path.
> +
>  **PKGDEST=**"/path/to/directory"::
>  	If this value is not set, packages will, by default, be placed in the
>  	current directory (location of the linkman:PKGBUILD[5]). Many people
> diff --git a/etc/makepkg.conf.in b/etc/makepkg.conf.in
> index d2beef50..33c4e92d 100644
> --- a/etc/makepkg.conf.in
> +++ b/etc/makepkg.conf.in
> @@ -99,6 +99,8 @@ MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info})
>  DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc})
>  #-- Files to be removed from all packages (if purge is specified)
>  PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
> +#-- Directory, if any, to store source code in for debug packages
> +DBGSRCDIR="/usr/src/debug"
>  
>  #########################################################################
>  # PACKAGE OUTPUT
> diff --git a/scripts/libmakepkg/tidy/strip.sh.in b/scripts/libmakepkg/tidy/strip.sh.in
> index 76562808..49e8aacd 100644
> --- a/scripts/libmakepkg/tidy/strip.sh.in
> +++ b/scripts/libmakepkg/tidy/strip.sh.in
> @@ -58,14 +58,11 @@ strip_file() {
>  		# copy source files to debug directory
>  		local f t
>  		while read -r f; do
> -			t=${f/"$srcdir"/$dbgsrc}
> -			mkdir -p "${t%/*}"
> -			cp -- "$f" "$t"
> +			t=${f/$dbgsrc/"$srcdir"}
> +			mkdir -p "${f%/*}"
> +			cp -- "$t" "$f"
>  		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"
> @@ -107,7 +104,7 @@ tidy_strip() {
>  		if check_option "debug" "y"; then
>  
>  			dbgdir="$pkgdirbase/$pkgbase- at DEBUGSUFFIX@/usr/lib/debug"
> -			dbgsrc="$pkgdirbase/$pkgbase- at DEBUGSUFFIX@/usr/src/debug"
> +			dbgsrc="$pkgdirbase/$pkgbase- at DEBUGSUFFIX@$DBGSRCDIR"
>  			mkdir -p "$dbgdir" "$dbgsrc"
>  		fi
>  
> diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
> index b25e4106..b74da0a5 100644
> --- a/scripts/makepkg.sh.in
> +++ b/scripts/makepkg.sh.in
> @@ -379,6 +379,10 @@ prepare_buildenv() {
>  	fi
>  
>  	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
>  		CFLAGS+=" $DEBUG_CFLAGS"
>  		CXXFLAGS+=" $DEBUG_CXXFLAGS"
>  	fi
> 


More information about the pacman-dev mailing list