makepkg: add libdepends support

The user adds libaries to the depends array without a version. These
must end with .so.
Example: depends=(glibc libc.so)

find_libdepends() looks for ELF files (not symlinks because these could
point outside of pkgdir) in $pkgdir, extracts the library sonames the
binary links to and outputs depends seperated by spaces.
This list contains all libraries needed by the package.
Example: libfoo.so=3-64

write_pkginfo() only keeps .so depends with version information and warns
the user about unneded ones.

Support-by: Thomas Bächler <thomas@archlinux.org>
Support-by: Christoph Schied <Christoph.Schied@uni-ulm.de>
Signed-off-by: Florian Pritz <bluewind@server-speed.net>
This commit is contained in:
Florian Pritz 2010-02-10 17:11:37 +01:00 committed by Florian Pritz
parent 79f1a3c4a1
commit 73d5eb1edf
1 changed files with 40 additions and 1 deletions

View File

@ -932,6 +932,31 @@ tidy_install() {
fi
}
find_libdepends() {
local libdepends
find "$pkgdir" -type f -perm -u+x | while read filename
do
# get architecture of the file; if soarch is empty it's not an ELF binary
soarch=$(LC_ALL=C readelf -h "$filename" 2>/dev/null | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p')
[ -n "$soarch" ] || continue
# process all libraries needed by the binary
for sofile in $(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p')
do
# extract the library name: libfoo.so
soname="${sofile%%\.so\.*}.so"
# extract the major version: 1
soversion="${sofile##*\.so\.}"
if in_array "${soname}" ${depends[@]}; then
if ! in_array "${soname}=${soversion}-${soarch}" ${libdepends[@]}; then
# libfoo.so=1-64
echo "${soname}=${soversion}-${soarch}"
libdepends=(${libdepends[@]} "${soname}=${soversion}-${soarch}")
fi
fi
done
done
}
find_libprovides() {
local libprovides
find "$pkgdir" -type f -name \*.so\* | while read filename
@ -988,7 +1013,6 @@ write_pkginfo() {
[[ $license ]] && printf "license = %s\n" "${license[@]}"
[[ $replaces ]] && printf "replaces = %s\n" "${replaces[@]}"
[[ $groups ]] && printf "group = %s\n" "${groups[@]}"
[[ $depends ]] && printf "depend = %s\n" "${depends[@]}"
[[ $optdepends ]] && printf "optdepend = %s\n" "${optdepends[@]}"
[[ $conflicts ]] && printf "conflict = %s\n" "${conflicts[@]}"
[[ $backup ]] && printf "backup = %s\n" "${backup[@]}"
@ -996,7 +1020,22 @@ write_pkginfo() {
local it
libprovides=$(find_libprovides)
libdepends=$(find_libdepends)
provides=("${provides[@]}" ${libprovides})
depends=("${depends[@]}" ${libdepends})
for it in "${depends[@]}"; do
if [[ $it = *.so ]]; then
# check if the entry has been found by find_libdepends
# if not, it's unneeded; tell the user so he can remove it
if [[ ! $libdepends =~ (^|\s)${it}=.* ]]; then
error "$(gettext "Can't find library listed in \$depends: %s")" "$it"
return 1
fi
else
echo "depend = $it"
fi
done
for it in "${provides[@]}"; do
# ignore versionless entires (those come from the PKGBUILD)