Hi, I'm guessing this patch was more a request for comments rather than for actual consideration given a few of the issues I point out below mean this will not actually work... So I will not comment on implementation at all. As far as the idea goes, I do not like it... This turns makepkg into a bit of a black box as you can no longer see the depends and provides from the PKGBUILD. Although, I do like the idea of having soname provides and depends in general. Allan
From: Florian Pritz <bluewind@xssn.at>
Support-by: brain0 <thomas@archlinux.org> Support-by: GNU\caustic <Christoph.Schied@uni-ulm.de> --- etc/makepkg.conf.in | 3 ++- scripts/makepkg.sh.in | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletions(-)
diff --git a/etc/makepkg.conf.in b/etc/makepkg.conf.in index 3a3a415..c3caf3c 100644 --- a/etc/makepkg.conf.in +++ b/etc/makepkg.conf.in @@ -67,8 +67,9 @@ BUILDENV=(fakeroot !distcc color !ccache) #-- emptydirs: Leave empty directories in packages #-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip #-- purge: Remove files specified by PURGE_TARGETS +#-- sodepends: add .so files to depends/provides arrays # -OPTIONS=(strip docs libtool emptydirs zipman purge) +OPTIONS=(strip docs libtool emptydirs zipman purge !sodepends)
#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512 INTEGRITY_CHECK=(md5) diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index daa9585..405f3cb 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -872,6 +872,33 @@ tidy_install() { fi }
+find_sodependencies() +{ + find $pkgdir | while read filename + do + arch=$(readelf -h "$filename" 2> /dev/null| sed -nr 's/.*Class:.*ELF(.*).*/\1/p') + [ -n "$arch" ] || continue
Hmmm.... not good. Think arch=('i686' 'x86_64')
+ + readelf -d "$filename" 2> /dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p' \ + | while read dep + do + echo sodep-${arch}-${dep} + done + done +} + +find_soprovides() +{ + find $pkgdir -name \*.so | while read filename + do + arch=$(readelf -h "$filename" 2> /dev/null| sed -nr 's/.*Class:.*ELF(.*).*/\1/p') + [ -n "$arch" ] || continue
Again.
+ soname=$(readelf -d "$filename" 2>/dev/null | sed -nr 's/.*Library soname: \[(.*)\].*/\1/p') + [ -n "$soname" ] || continue + echo sodep-${arch}-${soname} + done +} + write_pkginfo() { local builddate=$(date -u "+%s") if [ -n "$PACKAGER" ]; then @@ -902,6 +929,22 @@ write_pkginfo() { echo "force = true" >> .PKGINFO fi
+ if [ "$(check_option sodepends)" = "y" ]; then + sodepends=$(find_sodependencies) + soprovides=$(find_soprovides) + + OLDIFS="$IFS" + IFS=""
Huh... IFS?
+ + # filter .so files provided by the package itself + sodepends=$(echo $sodepends $soprovides $soprovides | sort | uniq -u) + + IFS="$OLDIFS" + + depends=($depends $sodepends) + provices=($provides $soprovides)
"provides"
+ fi + local it for it in "${license[@]}"; do echo "license = $it" >>.PKGINFO