]> code.ossystems Code Review - openembedded-core.git/commitdiff
buildhistory: Label packages providing per-file dependencies in depends.dot
authorAndres Beltran <abeltran@linux.microsoft.com>
Mon, 30 Aug 2021 22:53:03 +0000 (22:53 +0000)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 1 Sep 2021 13:05:41 +0000 (14:05 +0100)
Currently, depends.dot includes per-file dependencies but not the packages
providing those files. This makes it hard to obtain all package
dependencies by just looking at depends.dot.

Parse the RPROVIDES and FILERPROVIDES fields from pkgdata to map each of
their values to the package providing the component. Include runtime
packages as dependencies in depends.dot, together with the component
provided by the package as a label.

Signed-off-by: Andres Beltran <abeltran@linux.microsoft.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/classes/buildhistory.bbclass
meta/lib/oe/utils.py

index cdcf99a4999dff8cad6b6a856ba2583ac8878cfd..a61330627022cea0e3a85200af87d80b9afb1780 100644 (file)
@@ -446,7 +446,7 @@ def buildhistory_list_installed(d, rootfs_type="image"):
         output_file_full = os.path.join(d.getVar('WORKDIR'), output_file)
 
         with open(output_file_full, 'w') as output:
-            output.write(format_pkg_list(pkgs, output_type))
+            output.write(format_pkg_list(pkgs, output_type, d.getVar('PKGDATA_DIR')))
 
 python buildhistory_list_installed_image() {
     buildhistory_list_installed(d)
@@ -487,6 +487,8 @@ buildhistory_get_installed() {
               -e 's:|: -> :' \
               -e 's:"\[REC\]":[style=dotted]:' \
               -e 's:"\([<>=]\+\)" "\([^"]*\)":[label="\1 \2"]:' \
+              -e 's:"\([*]\+\)" "\([^"]*\)":[label="\2"]:' \
+              -e 's:"\[RPROVIDES\]":[style=dashed]:' \
                $1/depends.tmp
        # Add header, sorted and de-duped contents and footer and then delete the temp file
        printf "digraph depends {\n    node [shape=plaintext]\n" > $1/depends.dot
index a84039f58552c208a2aab8fc41b9e1b612058944..238af314d1fdf0a11e7561f3e46d63b67eaf8667 100644 (file)
@@ -344,7 +344,29 @@ def squashspaces(string):
     import re
     return re.sub(r"\s+", " ", string).strip()
 
-def format_pkg_list(pkg_dict, ret_format=None):
+def rprovides_map(pkgdata_dir, pkg_dict):
+    # Map file -> pkg provider
+    rprov_map = {}
+
+    for pkg in pkg_dict:
+        path_to_pkgfile = os.path.join(pkgdata_dir, 'runtime-reverse', pkg)
+        if not os.path.isfile(path_to_pkgfile):
+            continue
+        with open(path_to_pkgfile) as f:
+            for line in f:
+                if line.startswith('RPROVIDES') or line.startswith('FILERPROVIDES'):
+                    # List all components provided by pkg.
+                    # Exclude version strings, i.e. those starting with (
+                    provides = [x for x in line.split()[1:] if not x.startswith('(')]
+                    for prov in provides:
+                        if prov in rprov_map:
+                            rprov_map[prov].append(pkg)
+                        else:
+                            rprov_map[prov] = [pkg]
+
+    return rprov_map
+
+def format_pkg_list(pkg_dict, ret_format=None, pkgdata_dir=None):
     output = []
 
     if ret_format == "arch":
@@ -357,9 +379,15 @@ def format_pkg_list(pkg_dict, ret_format=None):
         for pkg in sorted(pkg_dict):
             output.append("%s %s %s" % (pkg, pkg_dict[pkg]["arch"], pkg_dict[pkg]["ver"]))
     elif ret_format == "deps":
+        rprov_map = rprovides_map(pkgdata_dir, pkg_dict)
         for pkg in sorted(pkg_dict):
             for dep in pkg_dict[pkg]["deps"]:
-                output.append("%s|%s" % (pkg, dep))
+                if dep in rprov_map:
+                    # There could be multiple providers within the image
+                    for pkg_provider in rprov_map[dep]:
+                        output.append("%s|%s * %s [RPROVIDES]" % (pkg, pkg_provider, dep))
+                else:
+                    output.append("%s|%s" % (pkg, dep))
     else:
         for pkg in sorted(pkg_dict):
             output.append(pkg)