On 02/10/2010 07:02 PM, Florian Pritz wrote: > On 02/10/2010 07:08 AM, Allan McRae wrote: >> provides=(foobar libfoo.so) >> >> would result in >> >> provides = foobar >> provides = libfoo.so=6-x86_64 (does that order look right...?) >> >> in the .PKGINFO file. >> >> I am fairly sure that pacman can handle two packages providing different >> versions of libfoo.so but that needs checked. > I did a quick test and it seems to work. > The attached two patches should fit.
-- Florian Pritz -- {flo,bluewi...@server-speed.net
>From a2062a4b3dc2c2a3f7ca5fb9cece056f63bb3b21 Mon Sep 17 00:00:00 2001 From: Florian Pritz <bluew...@xssn.at> Date: Wed, 10 Feb 2010 17:07:30 +0100 Subject: [PATCH 1/2] makepkg: add soprovides support Support-by: brain0 <tho...@archlinux.org> Support-by: GNU\caustic <christoph.sch...@uni-ulm.de> Signed-off-by: Florian Pritz <bluew...@xssn.at> --- scripts/makepkg.sh.in | 28 +++++++++++++++++++++++++++- 1 files changed, 27 insertions(+), 1 deletions(-) diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index 5bd294c..4f88c13 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -874,6 +874,27 @@ tidy_install() { fi } +find_soprovides() { + local soprovides + find $pkgdir -type f -name \*.so\* | while read filename + do + if readelf -h "$filename" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then + soarch=$(objdump -a "$filename" 2>/dev/null | sed -rn 's/.* file format (.*)$/\1/p' | tr - _) + sofile=$(readelf -d "$filename" 2>/dev/null | sed -nr 's/.*Library soname: \[(.*)\].*/\1/p') + [ -z "$sofile" ] && sofile="$(basename "$filename")" + + soname=$(sed -rn 's/(.*)\.so.*/\1.so/p' <<< "$sofile") + soversion=$(sed -rn 's/.*\.so\.(.*)/\1/p' <<< "$sofile") + if in_array "${soname}" ${provides}; then + if ! in_array "${soname}=${soversion}-${soarch}" ${soprovid...@]}; then + echo "${soname}=${soversion}-${soarch}" + soprovides=(${soprovid...@]} "${soname}=${soversion}-${soarch}") + fi + fi + fi + done +} + write_pkginfo() { local builddate=$(date -u "+%s") if [[ -n $PACKAGER ]]; then @@ -903,6 +924,9 @@ write_pkginfo() { echo "force = true" >> .PKGINFO fi + soprovides=$(find_soprovides) + provides=("${provid...@]}" ${soprovides}) + local it for it in "${licen...@]}"; do echo "license = $it" >>.PKGINFO @@ -923,7 +947,9 @@ write_pkginfo() { echo "conflict = $it" >>.PKGINFO done for it in "${provid...@]}"; do - echo "provides = $it" >>.PKGINFO + if ! grep -q ".*\.so$" <<< $it; then + echo "provides = $it" >>.PKGINFO + fi done for it in "${back...@]}"; do echo "backup = $it" >>.PKGINFO -- 1.6.6.1
>From 95eddf14cdc11f3a06931e086835d94efd84cc49 Mon Sep 17 00:00:00 2001 From: Florian Pritz <bluew...@xssn.at> Date: Wed, 10 Feb 2010 17:11:37 +0100 Subject: [PATCH 2/2] makepkg: add sodepends support Support-by: brain0 <tho...@archlinux.org> Support-by: GNU\caustic <christoph.sch...@uni-ulm.de> Signed-off-by: Florian Pritz <bluew...@xssn.at> --- scripts/makepkg.sh.in | 26 +++++++++++++++++++++++++- 1 files changed, 25 insertions(+), 1 deletions(-) diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index 4f88c13..8e9dbfd 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -874,6 +874,26 @@ tidy_install() { fi } +find_sodepends() { + local sodepends + find $pkgdir -type f | while read filename + do + soarch=$(objdump -a "$filename" 2>/dev/null | sed -rn 's/.* file format (.*)$/\1/p' | tr - _) + [ -n "$soarch" ] || continue + for sofile in $(readelf -d "$filename" 2> /dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p') + do + soname=$(sed -rn 's/(.*)\.so.*/\1.so/p' <<< "$sofile") + soversion=$(sed -rn 's/.*\.so\.(.*)/\1/p' <<< "$sofile") + if in_array "${soname}" ${depen...@]}; then + if ! in_array "${soname}=${soversion}-${soarch}" ${sodepen...@]}; then + echo "${soname}=${soversion}-${soarch}" + sodepends=(${sodepen...@]} "${soname}=${soversion}-${soarch}") + fi + fi + done + done +} + find_soprovides() { local soprovides find $pkgdir -type f -name \*.so\* | while read filename @@ -925,6 +945,8 @@ write_pkginfo() { fi soprovides=$(find_soprovides) + sodepends=$(find_sodepends) + depends=("${depen...@]}" ${sodepends}) provides=("${provid...@]}" ${soprovides}) local it @@ -938,7 +960,9 @@ write_pkginfo() { echo "group = $it" >>.PKGINFO done for it in "${depen...@]}"; do - echo "depend = $it" >>.PKGINFO + if ! grep -q ".*\.so$" <<< $it; then + echo "depend = $it" >>.PKGINFO + fi done for it in "${optdepen...@]}"; do echo "optdepend = $it" >>.PKGINFO -- 1.6.6.1