On 15/5/20 3:05 am, Eli Schwartz wrote:
> If multiple files match the pattern libfoo.so*, we want to check each of
> them and see if they are shared libraries, and if so, if they have
> versions attached.
> 
> But some packages can have both shared libraries and random files which
> match the filename pattern. This is true at least for files in
> /usr/share/gdb/auto-load/, which must match the filename they are paired
> with, followed by "-gdb.py" (or some other gdb scripting ext), but
> definitely don't contain a shared library. In this case, we don't want
> to double-report the library in the generated provides.
> 
> It's also possible (probably) for a package to provide a versioned as
> well as an unversioned shared library, but in such cases a single
> provides entry is sufficient to cover both cases (and the libdepends
> for the depending package would contain an unversioned dependency).
> 
> Solve this by keeping track of whether we have added a versioned soname
> provides already, and then only adding a maximum of one unversioned
> provides *iff* there isn't a versioned one yet.
> 
> Signed-off-by: Eli Schwartz <eschwa...@archlinux.org>
> ---


This patch is fine, but I don't like "newp" as a variable name.  It will
not help me understand this in a years time.

How about versioned_provides=() instead?

> 
> Notes:
>     Currently we only have gdb/auto-load/ scripts for shared libraries in:
>     - gcc
>     - glib2
>     - gstreamer
>     - efl
>     
>     In the first 3 cases, libprovides is entirely useless anyway.
>     
>     libstdc++ is perpetually stable (backwards-compatible ABI) just like 
> glibc.

Except when it did get an soname bump...  Those were the days!

>     glib2 actually does use libprovides, despite that it makes no sense for 
> glib2
>     to libprovide anything, as the glib2 developers have this thing where they
>     always use a soname of "0" and bump ABI versions by changing 
> libglib-2.0.so to
>     libglib-3.0.so -- as a result if you want to track dependencies you need 
> to
>     change to a different soname manually, and might as well just depend on 
> the
>     package itself (which already has a version in the pkgname).
>     
>     (gstreamer is in the same boat as glib2 because it is part of the same 
> ecosystem.)
>     
>     efl doesn't currently libprovide "libeo.so", but if it did, then the issue
>     would exist and be fixed by this patch. And more generally, any project 
> wishing
>     to implement gdb/auto-load/ scripts could have this issue, so it makes 
> sense to
>     make it work nicely.
> 
>  scripts/makepkg.sh.in | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
> index d1416d15..3f746b77 100644
> --- a/scripts/makepkg.sh.in
> +++ b/scripts/makepkg.sh.in
> @@ -516,9 +516,10 @@ find_libdepends() {
>  
>  
>  find_libprovides() {
> -     local p libprovides missing
> +     local p newp libprovides missing
>       for p in "${provides[@]}"; do
>               missing=0
> +             newp=()
>               case "$p" in
>                       *.so)
>                               mapfile -t filename < <(find "$pkgdir" -type f 
> -name $p\*)
> @@ -531,7 +532,6 @@ find_libprovides() {
>                                                       local sofile=$(LC_ALL=C 
> readelf -d "$fn" 2>/dev/null | sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p')
>                                                       if [[ -z "$sofile" ]]; 
> then
>                                                               warning 
> "$(gettext "Library listed in %s is not versioned: %s")" "'provides'" "$p"
> -                                                             
> libprovides+=("$p")
>                                                               continue
>                                                       fi
>  
> @@ -541,25 +541,25 @@ find_libprovides() {
>                                                       # extract the library 
> major version
>                                                       local 
> soversion="${sofile##*\.so\.}"
>  
> -                                                     
> libprovides+=("${p}=${soversion}-${soarch}")
> +                                                     
> newp+=("${p}=${soversion}-${soarch}")
>                                               else
>                                                       warning "$(gettext 
> "Library listed in %s is not a shared object: %s")" "'provides'" "$p"
> -                                                     libprovides+=("$p")
>                                               fi
>                                       done
>                               else
> -                                     libprovides+=("$p")
>                                       missing=1
>                               fi
>                               ;;
> -                     *)
> -                             libprovides+=("$p")
> -                             ;;
>               esac
>  
>               if (( missing )); then
>                       warning "$(gettext "Cannot find library listed in %s: 
> %s")" "'provides'" "$p"
>               fi
> +             if (( ${#newp[@]} > 0 )); then
> +                     libprovides+=("${newp[@]}")
> +             else
> +                     libprovides+=("$p")
> +             fi
>       done
>  
>       (( ${#libprovides[@]} )) && printf '%s\n' "${libprovides[@]}"
> 

Reply via email to