[pacman-dev] [PATCH] makepkg: libprovides: don't provide both versioned and unversioned sonames
Allan McRae
allan at archlinux.org
Fri Jun 26 06:09:00 UTC 2020
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 <eschwartz at 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[@]}"
>
More information about the pacman-dev
mailing list