summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/classes/buildhistory.bbclass4
-rw-r--r--meta/lib/oe/utils.py32
2 files changed, 33 insertions, 3 deletions
diff --git a/meta/classes/buildhistory.bbclass b/meta/classes/buildhistory.bbclass
index cdcf99a499..a613306270 100644
--- a/meta/classes/buildhistory.bbclass
+++ b/meta/classes/buildhistory.bbclass
@@ -446,7 +446,7 @@ def buildhistory_list_installed(d, rootfs_type="image"):
446 output_file_full = os.path.join(d.getVar('WORKDIR'), output_file) 446 output_file_full = os.path.join(d.getVar('WORKDIR'), output_file)
447 447
448 with open(output_file_full, 'w') as output: 448 with open(output_file_full, 'w') as output:
449 output.write(format_pkg_list(pkgs, output_type)) 449 output.write(format_pkg_list(pkgs, output_type, d.getVar('PKGDATA_DIR')))
450 450
451python buildhistory_list_installed_image() { 451python buildhistory_list_installed_image() {
452 buildhistory_list_installed(d) 452 buildhistory_list_installed(d)
@@ -487,6 +487,8 @@ buildhistory_get_installed() {
487 -e 's:|: -> :' \ 487 -e 's:|: -> :' \
488 -e 's:"\[REC\]":[style=dotted]:' \ 488 -e 's:"\[REC\]":[style=dotted]:' \
489 -e 's:"\([<>=]\+\)" "\([^"]*\)":[label="\1 \2"]:' \ 489 -e 's:"\([<>=]\+\)" "\([^"]*\)":[label="\1 \2"]:' \
490 -e 's:"\([*]\+\)" "\([^"]*\)":[label="\2"]:' \
491 -e 's:"\[RPROVIDES\]":[style=dashed]:' \
490 $1/depends.tmp 492 $1/depends.tmp
491 # Add header, sorted and de-duped contents and footer and then delete the temp file 493 # Add header, sorted and de-duped contents and footer and then delete the temp file
492 printf "digraph depends {\n node [shape=plaintext]\n" > $1/depends.dot 494 printf "digraph depends {\n node [shape=plaintext]\n" > $1/depends.dot
diff --git a/meta/lib/oe/utils.py b/meta/lib/oe/utils.py
index a84039f585..238af314d1 100644
--- a/meta/lib/oe/utils.py
+++ b/meta/lib/oe/utils.py
@@ -344,7 +344,29 @@ def squashspaces(string):
344 import re 344 import re
345 return re.sub(r"\s+", " ", string).strip() 345 return re.sub(r"\s+", " ", string).strip()
346 346
347def format_pkg_list(pkg_dict, ret_format=None): 347def rprovides_map(pkgdata_dir, pkg_dict):
348 # Map file -> pkg provider
349 rprov_map = {}
350
351 for pkg in pkg_dict:
352 path_to_pkgfile = os.path.join(pkgdata_dir, 'runtime-reverse', pkg)
353 if not os.path.isfile(path_to_pkgfile):
354 continue
355 with open(path_to_pkgfile) as f:
356 for line in f:
357 if line.startswith('RPROVIDES') or line.startswith('FILERPROVIDES'):
358 # List all components provided by pkg.
359 # Exclude version strings, i.e. those starting with (
360 provides = [x for x in line.split()[1:] if not x.startswith('(')]
361 for prov in provides:
362 if prov in rprov_map:
363 rprov_map[prov].append(pkg)
364 else:
365 rprov_map[prov] = [pkg]
366
367 return rprov_map
368
369def format_pkg_list(pkg_dict, ret_format=None, pkgdata_dir=None):
348 output = [] 370 output = []
349 371
350 if ret_format == "arch": 372 if ret_format == "arch":
@@ -357,9 +379,15 @@ def format_pkg_list(pkg_dict, ret_format=None):
357 for pkg in sorted(pkg_dict): 379 for pkg in sorted(pkg_dict):
358 output.append("%s %s %s" % (pkg, pkg_dict[pkg]["arch"], pkg_dict[pkg]["ver"])) 380 output.append("%s %s %s" % (pkg, pkg_dict[pkg]["arch"], pkg_dict[pkg]["ver"]))
359 elif ret_format == "deps": 381 elif ret_format == "deps":
382 rprov_map = rprovides_map(pkgdata_dir, pkg_dict)
360 for pkg in sorted(pkg_dict): 383 for pkg in sorted(pkg_dict):
361 for dep in pkg_dict[pkg]["deps"]: 384 for dep in pkg_dict[pkg]["deps"]:
362 output.append("%s|%s" % (pkg, dep)) 385 if dep in rprov_map:
386 # There could be multiple providers within the image
387 for pkg_provider in rprov_map[dep]:
388 output.append("%s|%s * %s [RPROVIDES]" % (pkg, pkg_provider, dep))
389 else:
390 output.append("%s|%s" % (pkg, dep))
363 else: 391 else:
364 for pkg in sorted(pkg_dict): 392 for pkg in sorted(pkg_dict):
365 output.append(pkg) 393 output.append(pkg)