rpm 5.4.0: respect to the arch when choose the alternatives

There is a bug if we:
1) bitbake diffutils with MACHINE=crownbay
2) bitbake diffutils with MACHINE=qemux86
3) bitbake core-image-sato with MACHINE=crownbay

Then the diffutils.i586 would be installed to the crownbay's image, this
is because diffutils.i586 is newer than diffutils.core2, and rpm doesn't
respect to the arch priorities:

We have put the archs in order in _solve_dbpath:

crownbay/solvedb:core2/solvedb:i586/solvedb:all/solvedb

Fix rpm to respect to the order, for example, if it finds a pkg in both
core2/ and i586/, and the core2/ comes first, it should not use the one
in i586/ even if it's build time is newer.

Note: Don't worry about the _free(*ptr), it can check whether ptr is
NULL or not.

This is for the denzil branch, and the master branch also needs it.

[YOCTO #2360]

(From OE-Core rev: 2199e6b9c82bb2b6738e87903f30329586db20e2)

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Robert Yang
2012-05-23 13:55:39 +08:00
committed by Richard Purdie
parent 3cb36a5ed9
commit 59ac33c77f
2 changed files with 69 additions and 1 deletions

View File

@@ -0,0 +1,67 @@
rpmts.c: respect to the arch priorities
Let rpm respect to the priorities when choose alternatives rpm, the arch
which comes first is preferred.
Upstream-Status: Pending
Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
lib/rpmts.c | 14 ++++++++++++++
1 files changed, 14 insertions(+), 0 deletions(-)
diff --git a/lib/rpmts.c b/lib/rpmts.c
index 3fbbc9e..40ec08e 100644
--- a/lib/rpmts.c
+++ b/lib/rpmts.c
@@ -353,6 +353,7 @@ int rpmtsSolve(rpmts ts, rpmds ds, /*@unused@*/ const void * data)
Header h = NULL;
size_t bhnamelen = 0;
time_t bhtime = 0;
+ const char *bharch = NULL;
rpmTag rpmtag;
const char * keyp;
size_t keylen = 0;
@@ -409,6 +410,7 @@ fprintf(stderr, "--> %s(%p,%p,%p)\n", __FUNCTION__, ts, ds, data);
while ((h = rpmmiNext(mi)) != NULL) {
size_t hnamelen;
time_t htime;
+ const char *harch = NULL;
if (rpmtag == RPMTAG_PROVIDENAME && !rpmdsAnyMatchesDep(h, ds, 1))
continue;
@@ -431,12 +433,23 @@ fprintf(stderr, "--> %s(%p,%p,%p)\n", __FUNCTION__, ts, ds, data);
if (htime <= bhtime)
continue;
+ /* XXX Respect to the arch priorities */
+ he->tag = RPMTAG_ARCH;
+ xx = headerGet(h, he, 0);
+ harch = ((xx && he->p.str) ? xstrdup(he->p.str) : NULL);
+ he->p.ptr = _free(he->p.ptr);
+ if (bharch && (strcmp(bharch, harch) != 0))
+ continue;
+
/* Save new "best" candidate. */
(void)headerFree(bh);
bh = NULL;
bh = headerLink(h);
bhtime = htime;
bhnamelen = hnamelen;
+ bharch = _free(bharch);
+ bharch = xstrdup(harch);
+ harch = _free(harch);
}
mi = rpmmiFree(mi);
@@ -449,6 +462,7 @@ fprintf(stderr, "--> %s(%p,%p,%p)\n", __FUNCTION__, ts, ds, data);
} while (1);
}
+ bharch = _free(bharch);
/* Is there a suggested resolution? */
if (bh == NULL)
--
1.7.1

View File

@@ -45,7 +45,7 @@ LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=2d5025d4aa3495befef8f17206a5b0a1"
DEPENDS = "bzip2 zlib db openssl elfutils expat libpcre attr acl popt ${extrarpmdeps}"
extrarpmdeps = "python perl file"
extrarpmdeps_virtclass-native = "python-native file-native"
PR = "r36"
PR = "r37"
# rpm2cpio is a shell script, which is part of the rpm src.rpm. It is needed
# in order to extract the distribution SRPM into a format we can extract...
@@ -70,6 +70,7 @@ SRC_URI = "http://www.rpm5.org/files/rpm/rpm-5.4/rpm-5.4.0-0.20101229.src.rpm;ex
file://pythondeps.sh \
file://rpmdeps-oecore.patch \
file://rpm-resolvedep.patch \
file://rpm-respect-arch.patch \
"
# file://rpm-autoconf.patch \