[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