bitbake: cooker: Rewrite dependency dot file generation
The package-depends.dot and pn-depends.dot files are inaccurate, missing out key dependencies such those made via the [depends] flags. As such they can be misleading to the user. They mainly exist for historical reasons, coming from a time before we had task based execution. This commit removes the two dated file formats and replaces them with a recipe-depends.dot which is a flattened version of task-depends.dot. The old format files are removed if present so that the user can't get confused about why data might not match between files. The code is also rewritten to use 'with f: f.write()' syntax as is more commonly used now. Also update the docs to match the change. (Bitbake rev: d3e182bc18ff2894f1efc8aad3d508dd432c996e) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
701ae7d1f4
commit
6cfc1c83b9
|
@ -666,19 +666,14 @@
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
When you generate a dependency graph, BitBake writes four files
|
When you generate a dependency graph, BitBake writes three files
|
||||||
to the current working directory:
|
to the current working directory:
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
<listitem><para><emphasis><filename>package-depends.dot</filename>:</emphasis>
|
<listitem><para><emphasis><filename>recipe-depends.dot</filename>:</emphasis>
|
||||||
Shows BitBake's knowledge of dependencies between
|
Shows dependencies between recipes (a collapsed version of task-depends.dot).
|
||||||
runtime targets.
|
|
||||||
</para></listitem>
|
|
||||||
<listitem><para><emphasis><filename>pn-depends.dot</filename>:</emphasis>
|
|
||||||
Shows dependencies between build-time targets
|
|
||||||
(i.e. recipes).
|
|
||||||
</para></listitem>
|
</para></listitem>
|
||||||
<listitem><para><emphasis><filename>task-depends.dot</filename>:</emphasis>
|
<listitem><para><emphasis><filename>task-depends.dot</filename>:</emphasis>
|
||||||
Shows dependencies between tasks.
|
Shows dependencies between tasks. This matches bitbake's internal task execution list.
|
||||||
</para></listitem>
|
</para></listitem>
|
||||||
<listitem><para><emphasis><filename>pn-buildlist</filename>:</emphasis>
|
<listitem><para><emphasis><filename>pn-buildlist</filename>:</emphasis>
|
||||||
Shows a simple list of targets that are to be built.
|
Shows a simple list of targets that are to be built.
|
||||||
|
|
|
@ -947,62 +947,54 @@ class BBCooker:
|
||||||
|
|
||||||
depgraph = self.generateTaskDepTreeData(pkgs_to_build, task)
|
depgraph = self.generateTaskDepTreeData(pkgs_to_build, task)
|
||||||
|
|
||||||
# Prints a flattened form of package-depends below where subpackages of a package are merged into the main pn
|
with open('pn-buildlist', 'w') as f:
|
||||||
depends_file = open('pn-depends.dot', 'w' )
|
|
||||||
buildlist_file = open('pn-buildlist', 'w' )
|
|
||||||
print("digraph depends {", file=depends_file)
|
|
||||||
for pn in depgraph["pn"]:
|
for pn in depgraph["pn"]:
|
||||||
fn = depgraph["pn"][pn]["filename"]
|
f.write(pn + "\n")
|
||||||
version = depgraph["pn"][pn]["version"]
|
|
||||||
print('"%s" [label="%s %s\\n%s"]' % (pn, pn, version, fn), file=depends_file)
|
|
||||||
print("%s" % pn, file=buildlist_file)
|
|
||||||
buildlist_file.close()
|
|
||||||
logger.info("PN build list saved to 'pn-buildlist'")
|
logger.info("PN build list saved to 'pn-buildlist'")
|
||||||
for pn in depgraph["depends"]:
|
|
||||||
for depend in depgraph["depends"][pn]:
|
|
||||||
print('"%s" -> "%s" [style=solid]' % (pn, depend), file=depends_file)
|
|
||||||
for pn in depgraph["rdepends-pn"]:
|
|
||||||
for rdepend in depgraph["rdepends-pn"][pn]:
|
|
||||||
print('"%s" -> "%s" [style=dashed]' % (pn, rdepend), file=depends_file)
|
|
||||||
print("}", file=depends_file)
|
|
||||||
depends_file.close()
|
|
||||||
logger.info("PN dependencies saved to 'pn-depends.dot'")
|
|
||||||
|
|
||||||
depends_file = open('package-depends.dot', 'w' )
|
# Remove old format output files to ensure no confusion with stale data
|
||||||
print("digraph depends {", file=depends_file)
|
try:
|
||||||
for package in depgraph["packages"]:
|
os.unlink('pn-depends.dot')
|
||||||
pn = depgraph["packages"][package]["pn"]
|
except FileNotFoundError:
|
||||||
fn = depgraph["packages"][package]["filename"]
|
pass
|
||||||
version = depgraph["packages"][package]["version"]
|
try:
|
||||||
if package == pn:
|
os.unlink('package-depends.dot')
|
||||||
print('"%s" [label="%s %s\\n%s"]' % (pn, pn, version, fn), file=depends_file)
|
except FileNotFoundError:
|
||||||
else:
|
pass
|
||||||
print('"%s" [label="%s(%s) %s\\n%s"]' % (package, package, pn, version, fn), file=depends_file)
|
|
||||||
for depend in depgraph["depends"][pn]:
|
|
||||||
print('"%s" -> "%s" [style=solid]' % (package, depend), file=depends_file)
|
|
||||||
for package in depgraph["rdepends-pkg"]:
|
|
||||||
for rdepend in depgraph["rdepends-pkg"][package]:
|
|
||||||
print('"%s" -> "%s" [style=dashed]' % (package, rdepend), file=depends_file)
|
|
||||||
for package in depgraph["rrecs-pkg"]:
|
|
||||||
for rdepend in depgraph["rrecs-pkg"][package]:
|
|
||||||
print('"%s" -> "%s" [style=dotted]' % (package, rdepend), file=depends_file)
|
|
||||||
print("}", file=depends_file)
|
|
||||||
depends_file.close()
|
|
||||||
logger.info("Package dependencies saved to 'package-depends.dot'")
|
|
||||||
|
|
||||||
tdepends_file = open('task-depends.dot', 'w' )
|
with open('task-depends.dot', 'w') as f:
|
||||||
print("digraph depends {", file=tdepends_file)
|
f.write("digraph depends {\n")
|
||||||
for task in depgraph["tdepends"]:
|
for task in depgraph["tdepends"]:
|
||||||
(pn, taskname) = task.rsplit(".", 1)
|
(pn, taskname) = task.rsplit(".", 1)
|
||||||
fn = depgraph["pn"][pn]["filename"]
|
fn = depgraph["pn"][pn]["filename"]
|
||||||
version = depgraph["pn"][pn]["version"]
|
version = depgraph["pn"][pn]["version"]
|
||||||
print('"%s.%s" [label="%s %s\\n%s\\n%s"]' % (pn, taskname, pn, taskname, version, fn), file=tdepends_file)
|
f.write('"%s.%s" [label="%s %s\\n%s\\n%s"]\n' % (pn, taskname, pn, taskname, version, fn))
|
||||||
for dep in depgraph["tdepends"][task]:
|
for dep in depgraph["tdepends"][task]:
|
||||||
print('"%s" -> "%s"' % (task, dep), file=tdepends_file)
|
f.write('"%s" -> "%s"\n' % (task, dep))
|
||||||
print("}", file=tdepends_file)
|
f.write("}\n")
|
||||||
tdepends_file.close()
|
|
||||||
logger.info("Task dependencies saved to 'task-depends.dot'")
|
logger.info("Task dependencies saved to 'task-depends.dot'")
|
||||||
|
|
||||||
|
with open('recipe-depends.dot', 'w') as f:
|
||||||
|
f.write("digraph depends {\n")
|
||||||
|
pndeps = {}
|
||||||
|
for task in depgraph["tdepends"]:
|
||||||
|
(pn, taskname) = task.rsplit(".", 1)
|
||||||
|
if pn not in pndeps:
|
||||||
|
pndeps[pn] = set()
|
||||||
|
for dep in depgraph["tdepends"][task]:
|
||||||
|
(deppn, deptaskname) = dep.rsplit(".", 1)
|
||||||
|
pndeps[pn].add(deppn)
|
||||||
|
for pn in pndeps:
|
||||||
|
fn = depgraph["pn"][pn]["filename"]
|
||||||
|
version = depgraph["pn"][pn]["version"]
|
||||||
|
f.write('"%s" [label="%s\\n%s\\n%s"]\n' % (pn, pn, version, fn))
|
||||||
|
for dep in pndeps[pn]:
|
||||||
|
if dep == pn:
|
||||||
|
continue
|
||||||
|
f.write('"%s" -> "%s"\n' % (pn, dep))
|
||||||
|
f.write("}\n")
|
||||||
|
logger.info("Flatened recipe dependencies saved to 'recipe-depends.dot'")
|
||||||
|
|
||||||
def show_appends_with_no_recipes(self):
|
def show_appends_with_no_recipes(self):
|
||||||
# Determine which bbappends haven't been applied
|
# Determine which bbappends haven't been applied
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue