summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Yang <liezhi.yang@windriver.com>2012-09-20 15:47:55 +0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-09-21 11:10:21 +0100
commit4946185084abba516988f61a911bd60f61a49168 (patch)
treeeed606a75897fdc826e6bd1c2580eaac311363d9
parent0c6aec8bd2e9ac9e7aab7170e06bd2f6b1ced8f4 (diff)
downloadpoky-4946185084abba516988f61a911bd60f61a49168.tar.gz
opkg svn: respect to the arch priority
This is for fixing the problem: 1) bitbake core-image-sato-sdk with MACHINE=qemux86 2) bitbake core-image-sato with with MACHINE=crownbay The qemux86's PACKAGE_ARCH is i586, the crownbay's is core2, but several i586 packages will be installed into crownbay's rootfs though there are core2 packages. For example, there are: xserver-xorg*_1.11.2-r7_i586.ipk xserver-xorg*_1.9.3-r1_core2.ipk The crownbay.conf says: PREFERRED_VERSION_xserver-xorg ?= "1.9.3" What the crownbay's image needs is xserver-xorg*_1.9.3-r1_core2.ipk, but the xserver-xorg*_1.11.2-r7_i586.ipk will be installed, this is incorrect. This is caused by opkg's selecting mechanism: when more than one candidate is found, it will use the higher version one and ignore the arch priority. we have several conf files which set the PREFERRED_VERSION_pkg = "..." , but there is no such a mechanism which can let us tell the opkg to install the preferred version. When the preferred version is higher, this is OK, but if the preferred version is lower, there would be problems: 1) Most of the packages are core2 in the image, but several of them are i586, though we have built the core2 ones, this seems strange. 2) What's worse is that the image may not work since the preferred version pkg is not installed. We have set the arch priority clearly in the opkg.conf, I think that respect to the arch priority is reasonable during the image generation. Add the "--select-higher-version" option to let the user have another choice, the default is no. [YOCTO #2575] (From OE-Core rev: 0a80a02644f624443cef8cc4f604edb5ef8e6975) Signed-off-by: Robert Yang <liezhi.yang@windriver.com> Signed-off-by: Saul Wold <sgw@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/recipes-devtools/opkg/opkg/0008-select_higher_version.patch102
-rw-r--r--meta/recipes-devtools/opkg/opkg_svn.bb3
2 files changed, 104 insertions, 1 deletions
diff --git a/meta/recipes-devtools/opkg/opkg/0008-select_higher_version.patch b/meta/recipes-devtools/opkg/opkg/0008-select_higher_version.patch
new file mode 100644
index 0000000000..46d11b0872
--- /dev/null
+++ b/meta/recipes-devtools/opkg/opkg/0008-select_higher_version.patch
@@ -0,0 +1,102 @@
1Add the --select-higher-version option
2
3If there were more than one candidate which had the same pkg name in the
4candidate list, for example, the same pkg with different versions, then
5it would use the last one which was the highest version one in the past,
6but it will use the higher arch priority one now.
7
8Add the "--select-higher-version" option to let it use the higher
9version package when enabled. the default is no.
10
11Upstream-Status: Pending
12
13Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
14---
15 libopkg/opkg_conf.h | 1 +
16 libopkg/pkg_hash.c | 18 +++++++++++++++---
17 src/opkg-cl.c | 9 +++++++++
18 3 files changed, 25 insertions(+), 3 deletions(-)
19
20diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
21--- a/libopkg/opkg_conf.h
22+++ b/libopkg/opkg_conf.h
23@@ -77,6 +77,7 @@ struct opkg_conf
24 int force_removal_of_essential_packages;
25 int force_postinstall;
26 int force_remove;
27+ int select_higher_version;
28 int check_signature;
29 int nodeps; /* do not follow dependencies */
30 char *offline_root;
31diff --git a/libopkg/pkg_hash.c b/libopkg/pkg_hash.c
32--- a/libopkg/pkg_hash.c
33+++ b/libopkg/pkg_hash.c
34@@ -376,10 +376,22 @@ pkg_hash_fetch_best_installation_candidate(abstract_pkg_t *apkg,
35 if (constraint_fcn(matching, cdata)) {
36 opkg_msg(DEBUG, "Candidate: %s %s.\n",
37 matching->name, matching->version) ;
38- good_pkg_by_name = matching;
39 /* It has been provided by hand, so it is what user want */
40- if (matching->provided_by_hand == 1)
41- break;
42+ if (matching->provided_by_hand == 1) {
43+ good_pkg_by_name = matching;
44+ break;
45+ }
46+ /* Respect to the arch priorities when given alternatives */
47+ if (good_pkg_by_name && !conf->select_higher_version) {
48+ if (matching->arch_priority >= good_pkg_by_name->arch_priority) {
49+ good_pkg_by_name = matching;
50+ opkg_msg(DEBUG, "%s %s wins by priority.\n",
51+ matching->name, matching->version) ;
52+ } else
53+ opkg_msg(DEBUG, "%s %s wins by priority.\n",
54+ good_pkg_by_name->name, good_pkg_by_name->version) ;
55+ } else
56+ good_pkg_by_name = matching;
57 }
58 }
59
60diff --git a/src/opkg-cl.c b/src/opkg-cl.c
61--- a/src/opkg-cl.c
62+++ b/src/opkg-cl.c
63@@ -42,6 +42,7 @@ enum {
64 ARGS_OPT_FORCE_SPACE,
65 ARGS_OPT_FORCE_POSTINSTALL,
66 ARGS_OPT_FORCE_REMOVE,
67+ ARGS_OPT_SELECT_HIGHER_VERSION,
68 ARGS_OPT_ADD_ARCH,
69 ARGS_OPT_ADD_DEST,
70 ARGS_OPT_NOACTION,
71@@ -83,6 +84,8 @@ static struct option long_options[] = {
72 {"force_postinstall", 0, 0, ARGS_OPT_FORCE_POSTINSTALL},
73 {"force-remove", 0, 0, ARGS_OPT_FORCE_REMOVE},
74 {"force_remove", 0, 0, ARGS_OPT_FORCE_REMOVE},
75+ {"select-higher-version", 0, 0, ARGS_OPT_SELECT_HIGHER_VERSION},
76+ {"select_higher_version", 0, 0, ARGS_OPT_SELECT_HIGHER_VERSION},
77 {"noaction", 0, 0, ARGS_OPT_NOACTION},
78 {"download-only", 0, 0, ARGS_OPT_DOWNLOAD_ONLY},
79 {"nodeps", 0, 0, ARGS_OPT_NODEPS},
80@@ -173,6 +176,9 @@ args_parse(int argc, char *argv[])
81 case ARGS_OPT_FORCE_REMOVE:
82 conf->force_remove = 1;
83 break;
84+ case ARGS_OPT_SELECT_HIGHER_VERSION:
85+ conf->select_higher_version = 1;
86+ break;
87 case ARGS_OPT_NODEPS:
88 conf->nodeps = 1;
89 break;
90@@ -271,6 +277,9 @@ usage()
91 printf("\t--offline-root <dir> offline installation of packages.\n");
92 printf("\t--add-arch <arch>:<prio> Register architecture with given priority\n");
93 printf("\t--add-dest <name>:<path> Register destination with given path\n");
94+ printf("\t--select-higher-version\t Use the higher version package rather\n");
95+ printf("\t than the higher arch priority one if more\n");
96+ printf("\t than one candidate is found.\n");
97
98 printf("\nForce Options:\n");
99 printf("\t--force-depends Install/remove despite failed dependencies\n");
100--
1011.7.1
102
diff --git a/meta/recipes-devtools/opkg/opkg_svn.bb b/meta/recipes-devtools/opkg/opkg_svn.bb
index 9a03f2efa8..820a2243b2 100644
--- a/meta/recipes-devtools/opkg/opkg_svn.bb
+++ b/meta/recipes-devtools/opkg/opkg_svn.bb
@@ -8,6 +8,7 @@ SRC_URI = "svn://opkg.googlecode.com/svn;module=trunk;protocol=http \
8 file://0005-Do-not-read-etc-opkg-.conf-if-f-is-specified.patch \ 8 file://0005-Do-not-read-etc-opkg-.conf-if-f-is-specified.patch \
9 file://0006-detect-circular-dependencies.patch \ 9 file://0006-detect-circular-dependencies.patch \
10 file://0007-merge-newpkg-provides-even-when-oldpkg-provides-exis.patch \ 10 file://0007-merge-newpkg-provides-even-when-oldpkg-provides-exis.patch \
11 file://0008-select_higher_version.patch \
11" 12"
12 13
13S = "${WORKDIR}/trunk" 14S = "${WORKDIR}/trunk"
@@ -15,4 +16,4 @@ S = "${WORKDIR}/trunk"
15SRCREV = "633" 16SRCREV = "633"
16PV = "0.1.8+svnr${SRCPV}" 17PV = "0.1.8+svnr${SRCPV}"
17 18
18PR = "${INC_PR}.3" 19PR = "${INC_PR}.4"