Hi Mark, On Tuesday 12 November 2013 19:59:20 Mark Hatle wrote: > In the translate oe to smart function, we only translated package names. > However, it's allowed that people can put in a dependency name in the > IMAGE_INSTALL. So on a failure to translate a package name, we fall back > and attempt to resolve based on a package's provide. > > Note: it may be possible to generate an unsolvable install solution. If the > dependency is provided by one or more things that conflict with something > else set to be installed. We can't determine this until smart is run. > > If this occurs, file a bug and we'll have to identify a way to deal with the > RCONFLICTS and RREPLACES. As a workaround replace the conflict REQUIRES > with actual package names. > > Signed-off-by: Mark Hatle <[email protected]> > --- > meta/classes/package_rpm.bbclass | 79 > ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), > 4 deletions(-) > > diff --git a/meta/classes/package_rpm.bbclass > b/meta/classes/package_rpm.bbclass index 31265d9..9fe0e6c 100644 > --- a/meta/classes/package_rpm.bbclass > +++ b/meta/classes/package_rpm.bbclass > @@ -166,6 +166,7 @@ translate_oe_to_smart() { > [ ! -e ${target_rootfs}/install/tmp/fullpkglist.query ] && smart > --data-dir=${target_rootfs}/var/lib/smart query --output > ${target_rootfs}/install/tmp/fullpkglist.query > > pkgs_to_install="" > + not_found="" > for pkg in "$@" ; do > new_pkg="$pkg" > if [ -z "$sdk_mode" ]; then > @@ -184,7 +185,6 @@ translate_oe_to_smart() { > fi > subst=${pkg#${mlib}-} > if [ "$subst" != "$pkg" ]; then > - feeds=$@ > while [ -n "$1" ]; do > arch="$1" > arch=`echo "$arch" | tr - _` > @@ -197,6 +197,76 @@ translate_oe_to_smart() { > done > if [ "$pkg" = "$new_pkg" ]; then > # Failed to translate, package > not found! > + not_found="$not_found $pkg" > + continue > + fi > + fi > + done > + fi > + # Apparently not a multilib package... > + if [ "$pkg" = "$new_pkg" ]; then > + default_archs_fixed=`echo "$default_archs" | tr - _` > + for arch in $default_archs_fixed ; do > + if grep -q '^'$pkg'-[^-]*-[^-]*@'$arch'$' > ${target_rootfs}/install/tmp/fullpkglist.query ; then > + new_pkg="$pkg@$arch" > + # First found is best match > + break > + fi > + done > + if [ "$pkg" = "$new_pkg" ]; then > + # Failed to translate, package not found! > + not_found="$not_found $pkg" > + continue > + fi > + fi > + #echo "$pkg -> $new_pkg" >&2 > + pkgs_to_install="${pkgs_to_install} ${new_pkg}" > + done > + > + # Parse the not_found items and see if they were dependencies > (RPROVIDES) > + # Follow the parsing example above... > + for pkg in $not_found ; do > + new_pkg="$pkg" > + smart --data-dir=${target_rootfs}/var/lib/smart query > --provides=$pkg > --output ${target_rootfs}/install/tmp/provide.query + grep '^[^@ > ]*@[^@]*$' ${target_rootfs}/install/tmp/provide.query | sed -e > 's,\(.*\)-[^-]*-[^-]*\(@[^@]*\)$,\1\2,' > > ${target_rootfs}/install/tmp/provide.query.list || : + > prov=`echo > $pkgs_to_install | xargs -n 1 echo | grep -f > ${target_rootfs}/install/tmp/provide.query.list || :` + if [ -n > "$prov" ]; > then > + # Nothing to do, already in the list > + #echo "Skipping $pkg -> $prov, already in install set" > >&2 > + continue > + fi > + if [ -z "$sdk_mode" ]; then > + for i in ${MULTILIB_PREFIX_LIST} ; do > + old_IFS="$IFS" > + IFS=":" > + set $i > + IFS="$old_IFS" > + mlib="$1" > + shift > + if [ "$mlib" = "default" ]; then > + if [ -z "$default_archs" ]; then > + default_archs=$@ > + fi > + continue > + fi > + subst=${pkg#${mlib}-} > + if [ "$subst" != "$pkg" ]; then > + feeds=$@ > + smart > --data-dir=${target_rootfs}/var/lib/smart query > --provides=$subst --output ${target_rootfs}/install/tmp/provide.query > + grep '^[^@ ]*@[^@]*$' ${target_rootfs}/install/tmp/provide.query | > sed -e 's,\(.*\)-[^-]*-[^-]*\(@[^@]*\)$,\1\2,' > > ${target_rootfs}/install/tmp/provide.query.list || : + > while [ -n "$1" > ]; do > + arch="$1" > + arch=`echo "$arch" | tr - _` > + shift > + # Select first found, we don't > know if one is better then another... > + prov=`grep '^[^@ ]*@'$arch'$' > ${target_rootfs}/install/tmp/provide.query.list | head -n 1` + > if [ -n > "$prov" ]; then > + new_pkg=$prov > + break > + fi > + done > + if [ "$pkg" = "$new_pkg" ]; then > + # Failed to translate, package > not found! > echo "$attemptonly: $pkg not > found in the $mlib feeds ($feeds)." >&2 > if [ "$attemptonly" = "Error" > ]; then > exit 1 > @@ -210,9 +280,10 @@ translate_oe_to_smart() { > if [ "$pkg" = "$new_pkg" ]; then > default_archs_fixed=`echo "$default_archs" | tr - _` > for arch in $default_archs_fixed ; do > - if grep -q '^'$pkg'-[^-]*-[^-]*@'$arch'$' > ${target_rootfs}/install/tmp/fullpkglist.query ; then > - new_pkg="$pkg@$arch" > - # First found is best match > + # Select first found, we don't know if one is > better then another... > + prov=`grep '^[^@ ]*@'$arch'$' > ${target_rootfs}/install/tmp/provide.query.list | head -n 1` + > if [ -n > "$prov" ]; then > + new_pkg=$prov > break > fi > done
Sigh... this code is getting ridiculously complicated. Shouldn't Smart be doing more of the heavy lifting here? Cheers, Paul -- Paul Eggleton Intel Open Source Technology Centre _______________________________________________ Openembedded-core mailing list [email protected] http://lists.openembedded.org/mailman/listinfo/openembedded-core
