From 406a37206f9afbc3731ac22eda5b45b5a15eddc5 Mon Sep 17 00:00:00 2001 From: Eli Schwartz Date: Thu, 14 May 2020 13:05:30 -0400 Subject: makepkg: libprovides: don't provide both versioned and unversioned sonames 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 Signed-off-by: Allan McRae --- scripts/makepkg.sh.in | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'scripts') diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index ed31ca0e..3ed12eab 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -522,9 +522,10 @@ find_libdepends() { find_libprovides() { - local p libprovides missing + local p versioned_provides libprovides missing for p in "${provides[@]}"; do missing=0 + versioned_provides=() case "$p" in *.so) mapfile -t filename < <(find "$pkgdir" -type f -name $p\* | LC_ALL=C sort) @@ -537,7 +538,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 @@ -547,25 +547,25 @@ find_libprovides() { # extract the library major version local soversion="${sofile##*\.so\.}" - libprovides+=("${p}=${soversion}-${soarch}") + versioned_provides+=("${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 (( ${#versioned_provides[@]} > 0 )); then + libprovides+=("${versioned_provides[@]}") + else + libprovides+=("$p") + fi done (( ${#libprovides[@]} )) && printf '%s\n' "${libprovides[@]}" -- cgit v1.2.3-54-g00ecf