[OE-core] [PATCH 6/6 v2] package_rpm: Allow translation of requirement to package name

Otavio Salvador otavio at ossystems.com.br
Wed Nov 13 12:31:29 UTC 2013


On Wed, Nov 13, 2013 at 8:33 AM, Paul Eggleton
<paul.eggleton at linux.intel.com> wrote:
> 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 <mark.hatle at windriver.com>
>> ---
>>  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?

Agreed; this seems OE is doing too much.

Another think which bothers me is it being RPM specific ... :-(

-- 
Otavio Salvador                             O.S. Systems
http://www.ossystems.com.br        http://code.ossystems.com.br
Mobile: +55 (53) 9981-7854            Mobile: +1 (347) 903-9750



More information about the Openembedded-core mailing list