[pacman-dev] [PATCH] makepkg: make source tarballs work with per-package files containing '$pkgname'

Allan McRae allan at archlinux.org
Tue Jan 7 03:07:15 UTC 2020


On 23/12/19 1:57 am, Eli Schwartz wrote:
> Extracting function variables containing arbitrarily scoped variables of
> arbitrary nature is a disaster, but let's at least cover the common case
> of using the actual '$pkgname' in an install/changelog file. It's the
> odd case of actually being basically justified use of disambiguating
> between the same variable used in multiple different split packages and
> is even recommended in the PKGBUILD(5) documentation...
> 
> ... and also, --printsrcinfo already uses and overwrites the variable
> 'pkgname' in pkgbuild_extract_to_srcinfo, so this "works" in .SRCINFO
> but doesn't work in .src.tar.gz
> 
> Fixes FS#64932
> 
> Signed-off-by: Eli Schwartz <eschwartz at archlinux.org>
> ---
>  scripts/makepkg.sh.in | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
> index ca3e7459..674e0d87 100644
> --- a/scripts/makepkg.sh.in
> +++ b/scripts/makepkg.sh.in
> @@ -784,13 +784,14 @@ create_srcpackage() {
>  		fi
>  	done
>  
> -	local i
> +	local pkgname_backup=(${pkgname[@]})
> +	local i pkgname
>  	for i in 'changelog' 'install'; do
>  		local file files
>  
>  		[[ ${!i} ]] && files+=("${!i}")
> -		for name in "${pkgname[@]}"; do
> -			if extract_function_variable "package_$name" "$i" 0 file; then
> +		for pkgname in "${pkgname_backup[@]}"; do
> +			if extract_function_variable "package_$pkgname" "$i" 0 file; then

It took me a while to see what this change did...   We need $pkgname set
right for the eval in extract_function_variable to do its thing.

Can we get a brief comment in that regard above the place where you
backup ${pkgname[@]}?



Also note, this problem extends into checking files are present early in
makepkg. e.g. for a PKGBUILD with pkgname=('a' 'b'), and using
$pkgname.install in both package_*() functions we get:

$ makepkg
==> ERROR: install file (a.install) does not exist or is not a regular file.
==> ERROR: install file (a.install) does not exist or is not a regular file.


>  				files+=("$file")
>  			fi
>  		done
> @@ -802,6 +803,7 @@ create_srcpackage() {
>  			fi
>  		done
>  	done
> +	pkgname=(${pkgname_backup[@]})
>  
>  	local fullver=$(get_full_version)
>  	local pkg_file="$SRCPKGDEST/${pkgbase}-${fullver}${SRCEXT}"
> 


More information about the pacman-dev mailing list