summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/lib/oe/packagedata.py101
1 files changed, 91 insertions, 10 deletions
diff --git a/meta/lib/oe/packagedata.py b/meta/lib/oe/packagedata.py
index 3635509ea00..98e4e13a2f1 100644
--- a/meta/lib/oe/packagedata.py
+++ b/meta/lib/oe/packagedata.py
@@ -379,6 +379,51 @@ def mapping_rename_hook(d):
oe.packagedata.runtime_mapping_rename("RRECOMMENDS", pkg, d)
oe.packagedata.runtime_mapping_rename("RSUGGESTS", pkg, d)
+def _filerprovidesmap(d):
+ """Return a dictionary mapping FILERPROVIDES to (sub)package name."""
+
+ pkgdatadir = d.getVar("PKGDATA_DIR")
+
+ filerprovidesmap = {}
+ try:
+ files = os.listdir(os.path.join(pkgdatadir, 'runtime'))
+ except OSError:
+ bb.warn("No files in %s?" % pkgdatadir)
+ files = []
+
+ for pkg in [f for f in files if not os.path.isdir(os.path.join(pkgdatadir, 'runtime', f))]:
+ try:
+ if pkg.endswith('.packaged'):
+ continue
+ subpkgdata = read_subpkgdata(pkg, d)
+ #pkgdata = read_pkgdatafile(os.path.join(pkgdatadir, pkg))
+ except OSError:
+ continue
+
+ #filerprovides = pkgdata.get("FILERPROVDES") or ""
+ bb.debug(1, "subpkgdata: %s" % subpkgdata)
+ #filerprovideslist = subpkgdata.get("FILERPROVIDESLIST") or ""
+ filerprovideslist = list_pkg_filerprovides(pkg, d)
+ bb.debug(1, "fileprovideslist: %s" % filerprovideslist)
+ #filerprovides = subpkgdata.get("FILERPROVIDES") or ""
+ #bb.debug(1, "fileprovides: %s" % filerprovides)
+ for filerprovide in filerprovideslist:
+ bb.debug(1, "filerprovide[%s]: %s" % (filerprovide, pkg))
+ filerprovidesmap.update({filerprovide: pkg})
+
+ return filerprovidesmap
+
+def filerprovidesmap(d):
+ """Return a dictionary mapping FILERPROVIDES to package name.
+ Cache the mapping in the metadata"""
+
+ filerprovidesmap_data = d.getVar("__filerprovidesmap_data", False)
+ if filerprovidesmap_data is None:
+ filerprovidesmap_data = _filerprovidesmap(d)
+ d.setVar("__filerprovidesmap_data", filerprovidesmap_data)
+
+ return filerprovidesmap_data
+
#
# packagedata utility functions based on scripts/oe-pkgdata-util
#
@@ -404,6 +449,36 @@ def lookup_pkglist(pkgs, pkgdata_dir, reverse):
break
return mappings
+def list_pkg_filerprovides(pkg, d):
+ import json
+ import oe.package
+
+ filerprovides = []
+ subpkgdata = read_subpkgdata(pkg, d)
+ found = False
+ try:
+ files_info = json.loads(subpkgdata['FILES_INFO']) or dict()
+ except (KeyError, AttributeError):
+ files_info = dict()
+ bb.debug(3, "[%s] FILES_INFO: %s" % (pkg, files_info))
+ for _file in files_info:
+ bb.debug(3, "_file: %s" % _file)
+ try:
+ _filerprovides = subpkgdata.get('FILERPROVIDES:%s:%s' % (oe.package.file_translate(_file), pkg)).split() or list()
+ except AttributeError:
+ _filerprovides = list()
+ except KeyError:
+ _filerprovides = list()
+ finally:
+ bb.debug(3, "FILERPROVIDES:%s:%s: %s" % (pkg, _file, _filerprovides))
+ if _filerprovides != list():
+ found = True
+ filerprovides.extend(_filerprovides)
+ if not found:
+ bb.debug(2, 'Unable to find FILERPROVIDES entry in %s' % subpkgdata)
+ return filerprovides
+
+
def list_pkg_files(pkg, d):
import json
@@ -453,6 +528,12 @@ def find_file_rprovides(file_rprovides, pkgdata_dir, d):
found = False
matching_pkgs = {}
+ filerprovides_map = filerprovidesmap(d)
+ bb.debug(1, "filerprovidesmap(d): %s" % filerprovides_map)
+ #pkg_map = pkgmap(d)
+ #bb.debug(1, "pkgmap(d): %s" % pkg_map)
+ exit(1)
+
for root, dirs, files in os.walk(os.path.join(pkgdata_dir, 'runtime')):
for fn in files:
with open(os.path.join(root, fn)) as f:
@@ -486,18 +567,18 @@ def find_file_rprovides(file_rprovides, pkgdata_dir, d):
#raise PathNotFoundError('Unable to find any package which FILERPROVIDES %s' % file_rprovides)
return dict()
-def package_info(pkg, d):
+def package_info(pkg, d, extra=None):
import re
pkgdatafile = get_subpkgedata_fn(pkg, d)
def parse_pkgdatafile(pkgdatafile):
vars = ['PKGV', 'PKGE', 'PKGR', 'PN', 'PV', 'PE', 'PR', 'PKGSIZE']
-# if args.extra:
-# vars += args.extra
+ if extra:
+ vars += extra
with open(pkgdatafile, 'r') as f:
vals = dict()
- extra = ''
+ _extra = ''
for line in f:
for var in vars:
m = re.match(var + '(?:_\S+)?:\s*(.+?)\s*$', line)
@@ -515,12 +596,12 @@ def package_info(pkg, d):
recipe_version = vals['PE'] + ":" + recipe_version
if 'PR' in vals:
recipe_version = recipe_version + "-" + vals['PR']
-# if args.extra:
-# for var in args.extra:
-# if var in vals:
-# val = re.sub(r'\s+', ' ', vals[var])
-# extra += ' "%s"' % val
- return pkg, pkg_version, recipe, recipe_version, pkg_size, extra
+ if extra:
+ for var in extra:
+ if var in vals:
+ val = re.sub(r'\s+', ' ', vals[var])
+ _extra += ' "%s"' % val
+ return pkg, pkg_version, recipe, recipe_version, pkg_size, _extra
parse_pkgdatafile(pkgdatafile)
# Handle both multiple arguments and multiple values within an arg (old syntax)