If failed to invoke lookup-recipe while pkg not generated but provided by others, such as python3, it is provided by python3-core ... $ bitbake python3 $ oe-pkgdata-util -d lookup-recipe tmp/sysroots/qemux86/pkgdata/ "python3" ERROR: the following packages could not be found: python3 ...
In this situation, we search the pkg's rprovides (if available) to replace. [YOCTO #5264] Signed-off-by: Hongxu Jia <hongxu....@windriver.com> --- scripts/oe-pkgdata-util | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/scripts/oe-pkgdata-util b/scripts/oe-pkgdata-util index bf87547..e43f773 100755 --- a/scripts/oe-pkgdata-util +++ b/scripts/oe-pkgdata-util @@ -27,6 +27,7 @@ import fnmatch import re import optparse from collections import defaultdict +import codecs def glob(args, usage, debug=False): if len(args) < 3: @@ -234,6 +235,19 @@ def lookup_recipe(args, usage, debug=False): print('ERROR: Unable to find pkgdata directory %s' % pkgdata_dir) sys.exit(1) + # If the pkg not generated, search the rprovides to replace + rprovides = collect_rprovides(pkgdata_dir) + for pkg in pkgs[:]: + pkgfile = os.path.join(pkgdata_dir, 'runtime', pkg) + if not os.path.exists(pkgfile): + for newpkg, oldpkg in rprovides.items(): + if oldpkg == pkg: + if debug: + print('%s rprovides %s' % (newpkg, pkg)) + pkgs.remove(pkg) + pkgs.append(newpkg) + break + mappings = defaultdict(list) for pkg in pkgs: pkgfile = os.path.join(pkgdata_dir, 'runtime-reverse', pkg) @@ -254,6 +268,46 @@ def lookup_recipe(args, usage, debug=False): items.extend(mappings.get(pkg, [])) print '\n'.join(items) +def collect_rprovides(pkgdata_dir): + def read_pkgdatafile(fn): + pkgdata = {} + def decode(str): + c = codecs.getdecoder("string_escape") + return c(str)[0] + + if os.access(fn, os.R_OK): + import re + f = open(fn, 'r') + lines = f.readlines() + f.close() + r = re.compile("([^:]+):\s*(.*)") + for l in lines: + m = r.match(l) + if m: + pkgdata[m.group(1)] = decode(m.group(2)) + return pkgdata + + rprovides_dict = dict() + if os.path.exists(pkgdata_dir): + for root, dirs, files in os.walk("%s/runtime" % pkgdata_dir): + for pkgname in files: + pkgdatafile = "%s/%s" % (root, pkgname) + if not os.access("%s.packaged" % pkgdatafile, os.R_OK): + continue + + try: + sdata = read_pkgdatafile(pkgdatafile) + rprovides = sdata.get('RPROVIDES_%s' % pkgname) + if rprovides: + rprovides_dict[pkgname] = rprovides + + except Exception as e: + print("ERROR:%s: Failed to read pkgdata file %s: %s: %s" % + (pkgname, pkgdatafile, e.__class__, str(e))) + sys.exit(1) + + return rprovides_dict + def find_path(args, usage, debug=False): if len(args) < 2: usage() -- 1.9.1 -- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core