[OE-core] [PATCH 1/1] opkg svn: respect to the arch priority

Martin Jansa martin.jansa at gmail.com
Fri Sep 21 10:50:46 UTC 2012


On Tue, Sep 18, 2012 at 11:25:10PM +0800, Robert Yang wrote:
> 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.

Can you send this upstream to see what they think about this issue?

Thanks

Cheers,

> 
> [YOCTO #2575]
> 
> Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
> ---
>  .../opkg/opkg/select_higher_version.patch          |  102 ++++++++++++++++++++
>  meta/recipes-devtools/opkg/opkg_svn.bb             |    3 +-
>  2 files changed, 104 insertions(+), 1 deletions(-)
>  create mode 100644 meta/recipes-devtools/opkg/opkg/select_higher_version.patch
> 
> diff --git a/meta/recipes-devtools/opkg/opkg/select_higher_version.patch b/meta/recipes-devtools/opkg/opkg/select_higher_version.patch
> new file mode 100644
> index 0000000..46d11b0
> --- /dev/null
> +++ b/meta/recipes-devtools/opkg/opkg/select_higher_version.patch
> @@ -0,0 +1,102 @@
> +Add the --select-higher-version option
> +
> +If there were more than one candidate which had the same pkg name in the
> +candidate list, for example, the same pkg with different versions, then
> +it would use the last one which was the highest version one in the past,
> +but it will use the higher arch priority one now.
> +
> +Add the "--select-higher-version" option to let it use the higher
> +version package when enabled. the default is no.
> +
> +Upstream-Status: Pending
> +
> +Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
> +---
> + libopkg/opkg_conf.h |    1 +
> + libopkg/pkg_hash.c  |   18 +++++++++++++++---
> + src/opkg-cl.c       |    9 +++++++++
> + 3 files changed, 25 insertions(+), 3 deletions(-)
> +
> +diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
> +--- a/libopkg/opkg_conf.h
> ++++ b/libopkg/opkg_conf.h
> +@@ -77,6 +77,7 @@ struct opkg_conf
> +      int force_removal_of_essential_packages;
> +      int force_postinstall;
> +      int force_remove;
> ++     int select_higher_version;
> +      int check_signature;
> +      int nodeps; /* do not follow dependencies */
> +      char *offline_root;
> +diff --git a/libopkg/pkg_hash.c b/libopkg/pkg_hash.c
> +--- a/libopkg/pkg_hash.c
> ++++ b/libopkg/pkg_hash.c
> +@@ -376,10 +376,22 @@ pkg_hash_fetch_best_installation_candidate(abstract_pkg_t *apkg,
> +           if (constraint_fcn(matching, cdata)) {
> +              opkg_msg(DEBUG, "Candidate: %s %s.\n",
> + 			     matching->name, matching->version) ;
> +-             good_pkg_by_name = matching;
> + 	     /* It has been provided by hand, so it is what user want */
> +-             if (matching->provided_by_hand == 1)
> +-                break;
> ++             if (matching->provided_by_hand == 1) {
> ++                 good_pkg_by_name = matching;
> ++                 break;
> ++             }
> ++             /* Respect to the arch priorities when given alternatives */
> ++             if (good_pkg_by_name && !conf->select_higher_version) {
> ++                 if (matching->arch_priority >= good_pkg_by_name->arch_priority) {
> ++                     good_pkg_by_name = matching;
> ++                     opkg_msg(DEBUG, "%s %s wins by priority.\n",
> ++                         matching->name, matching->version) ;
> ++                 } else
> ++                     opkg_msg(DEBUG, "%s %s wins by priority.\n",
> ++                         good_pkg_by_name->name, good_pkg_by_name->version) ;
> ++             } else
> ++                 good_pkg_by_name = matching;
> +           }
> +      }
> + 
> +diff --git a/src/opkg-cl.c b/src/opkg-cl.c
> +--- a/src/opkg-cl.c
> ++++ b/src/opkg-cl.c
> +@@ -42,6 +42,7 @@ enum {
> + 	ARGS_OPT_FORCE_SPACE,
> + 	ARGS_OPT_FORCE_POSTINSTALL,
> + 	ARGS_OPT_FORCE_REMOVE,
> ++	ARGS_OPT_SELECT_HIGHER_VERSION,
> + 	ARGS_OPT_ADD_ARCH,
> + 	ARGS_OPT_ADD_DEST,
> + 	ARGS_OPT_NOACTION,
> +@@ -83,6 +84,8 @@ static struct option long_options[] = {
> + 	{"force_postinstall", 0, 0, ARGS_OPT_FORCE_POSTINSTALL},
> + 	{"force-remove", 0, 0, ARGS_OPT_FORCE_REMOVE},
> + 	{"force_remove", 0, 0, ARGS_OPT_FORCE_REMOVE},
> ++	{"select-higher-version", 0, 0, ARGS_OPT_SELECT_HIGHER_VERSION},
> ++	{"select_higher_version", 0, 0, ARGS_OPT_SELECT_HIGHER_VERSION},
> + 	{"noaction", 0, 0, ARGS_OPT_NOACTION},
> + 	{"download-only", 0, 0, ARGS_OPT_DOWNLOAD_ONLY},
> + 	{"nodeps", 0, 0, ARGS_OPT_NODEPS},
> +@@ -173,6 +176,9 @@ args_parse(int argc, char *argv[])
> + 		case ARGS_OPT_FORCE_REMOVE:
> + 			conf->force_remove = 1;
> + 			break;
> ++		case ARGS_OPT_SELECT_HIGHER_VERSION:
> ++			conf->select_higher_version = 1;
> ++			break;
> + 		case ARGS_OPT_NODEPS:
> + 			conf->nodeps = 1;
> + 			break;
> +@@ -271,6 +277,9 @@ usage()
> + 	printf("\t--offline-root <dir>	offline installation of packages.\n");
> + 	printf("\t--add-arch <arch>:<prio>	Register architecture with given priority\n");
> + 	printf("\t--add-dest <name>:<path>	Register destination with given path\n");
> ++	printf("\t--select-higher-version\t 	Use the higher version package rather\n");
> ++	printf("\t				than the higher arch priority one if more\n");
> ++	printf("\t				than one candidate is found.\n");
> + 
> + 	printf("\nForce Options:\n");
> + 	printf("\t--force-depends		Install/remove despite failed dependencies\n");
> +-- 
> +1.7.1
> +
> diff --git a/meta/recipes-devtools/opkg/opkg_svn.bb b/meta/recipes-devtools/opkg/opkg_svn.bb
> index 4146b7e..e21bcd5 100644
> --- a/meta/recipes-devtools/opkg/opkg_svn.bb
> +++ b/meta/recipes-devtools/opkg/opkg_svn.bb
> @@ -7,6 +7,7 @@ SRC_URI = "svn://opkg.googlecode.com/svn;module=trunk;protocol=http \
>             file://offline_postinstall.patch\
>             file://track_parents.patch \
>             file://conf_override.patch \
> +           file://select_higher_version.patch \
>  "
>  
>  S = "${WORKDIR}/trunk"
> @@ -14,4 +15,4 @@ S = "${WORKDIR}/trunk"
>  SRCREV = "633"
>  PV = "0.1.8+svnr${SRCPV}"
>  
> -PR = "${INC_PR}.2"
> +PR = "${INC_PR}.3"
> -- 
> 1.7.1
> 
> 
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core

-- 
Martin 'JaMa' Jansa     jabber: Martin.Jansa at gmail.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20120921/ab0a3eca/attachment-0002.sig>


More information about the Openembedded-core mailing list