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,[email protected]
>From a2062a4b3dc2c2a3f7ca5fb9cece056f63bb3b21 Mon Sep 17 00:00:00 2001
From: Florian Pritz <[email protected]>
Date: Wed, 10 Feb 2010 17:07:30 +0100
Subject: [PATCH 1/2] makepkg: add soprovides support
Support-by: brain0 <[email protected]>
Support-by: GNU\caustic <[email protected]>
Signed-off-by: Florian Pritz <[email protected]>
---
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 <[email protected]>
Date: Wed, 10 Feb 2010 17:11:37 +0100
Subject: [PATCH 2/2] makepkg: add sodepends support
Support-by: brain0 <[email protected]>
Support-by: GNU\caustic <[email protected]>
Signed-off-by: Florian Pritz <[email protected]>
---
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