summaryrefslogtreecommitdiffstats
path: root/bitbake/lib
diff options
context:
space:
mode:
authorDongxiao Xu <dongxiao.xu@intel.com>2012-02-23 21:47:14 +0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-02-23 22:52:17 +0000
commitde77b9752ab2df56d87dc15ed5cd0d2cd5544dc7 (patch)
tree74b02b6df6ab08626eab2fd6b17440b6cfd977fa /bitbake/lib
parent85fa989df7a4928e42aad2eb5f34a5f3c2c9ae93 (diff)
downloadast2050-yocto-poky-de77b9752ab2df56d87dc15ed5cd0d2cd5544dc7.zip
ast2050-yocto-poky-de77b9752ab2df56d87dc15ed5cd0d2cd5544dc7.tar.gz
command.py: add resolve option for generateTargetsTree API
Currently we have generateTargetsTree API, which is used to get dependency information. However in that tree, there will be "virtual/xxx" in depends fields. Therefore we add the resolve option to replace it with its real providers. Besides, for packages that provided by multiple recipes, we will find their preverred provider. (Bitbake rev: 28501612efdfc6ee47576cc90deb6e897883e7f5) Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
-rw-r--r--bitbake/lib/bb/command.py11
-rw-r--r--bitbake/lib/bb/cooker.py58
2 files changed, 56 insertions, 13 deletions
diff --git a/bitbake/lib/bb/command.py b/bitbake/lib/bb/command.py
index be26937..06e8869 100644
--- a/bitbake/lib/bb/command.py
+++ b/bitbake/lib/bb/command.py
@@ -242,14 +242,21 @@ class CommandsAsync:
included in the package list.
If pkg_list provided use that list (plus any extras brought in by
klass) rather than generating a tree for all packages.
+
+ Add a new option "resolve" to indicate if we need to resolve the
+ replacement for "virtual/xxx" like pn.
"""
klass = params[0]
- if len(params) > 1:
+ resolve = False
+ if len(params) > 2:
+ pkg_list = params[1]
+ resolve = params[2]
+ elif len(params) > 1:
pkg_list = params[1]
else:
pkg_list = []
- command.cooker.generateTargetsTree(klass, pkg_list)
+ command.cooker.generateTargetsTree(klass, pkg_list, resolve)
command.finishAsyncCommand()
generateTargetsTree.needcache = True
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py
index b0b58a6..91fdc96 100644
--- a/bitbake/lib/bb/cooker.py
+++ b/bitbake/lib/bb/cooker.py
@@ -429,7 +429,20 @@ class BBCooker:
return depend_tree
- def generatePkgDepTreeData(self, pkgs_to_build, task):
+ def append_package(self, taskdata, depend_tree_package, package):
+ if package not in depend_tree_package:
+ targetid = taskdata.getrun_id(package)
+ if targetid in taskdata.run_targets and taskdata.run_targets[targetid]:
+ fnid = taskdata.run_targets[targetid][0]
+ fn = taskdata.fn_index[fnid]
+ pn = self.status.pkg_fn[fn]
+ version = "%s:%s-%s" % self.status.pkg_pepvpr[fn]
+ depend_tree_package[package] = {}
+ depend_tree_package[package]["pn"] = pn
+ depend_tree_package[package]["filename"] = fn
+ depend_tree_package[package]["version"] = version
+
+ def generatePkgDepTreeData(self, pkgs_to_build, task, resolve=False):
"""
Create a dependency tree of pkgs_to_build, returning the data.
"""
@@ -446,6 +459,7 @@ class BBCooker:
depend_tree["rdepends-pn"] = {}
depend_tree["packages"] = {}
depend_tree["rdepends-pkg"] = {}
+ depend_tree["rrecs-pkg"] = {}
for task in xrange(len(tasks_fnid)):
fnid = tasks_fnid[task]
@@ -456,6 +470,8 @@ class BBCooker:
lic = self.status.license[fn]
section = self.status.section[fn]
description = self.status.description[fn]
+ rdepends = self.status.rundeps[fn]
+ rrecs = self.status.runrecs[fn]
if pn not in depend_tree["pn"]:
depend_tree["pn"][pn] = {}
depend_tree["pn"][pn]["filename"] = fn
@@ -464,6 +480,7 @@ class BBCooker:
depend_tree["pn"][pn]["license"] = lic
depend_tree["pn"][pn]["section"] = section
depend_tree["pn"][pn]["description"] = description
+ depend_tree["pn"][pn]["packages"] = rdepends.keys()
if fnid not in seen_fnids:
seen_fnids.append(fnid)
@@ -471,25 +488,44 @@ class BBCooker:
depend_tree["depends"][pn] = []
for dep in taskdata.depids[fnid]:
- depend_tree["depends"][pn].append(taskdata.build_names_index[dep])
+ if resolve:
+ item = taskdata.build_names_index[dep]
+ pn_provider = ""
+ targetid = taskdata.getbuild_id(item)
+ if targetid in taskdata.build_targets and taskdata.build_targets[targetid]:
+ fnid = taskdata.build_targets[targetid][0]
+ fn_provider = taskdata.fn_index[fnid]
+ pn_provider = self.status.pkg_fn[fn_provider]
+ else:
+ pn_provider = item
+ depend_tree["depends"][pn].append(pn_provider)
+ else:
+ depend_tree["depends"][pn].append(taskdata.build_names_index[dep])
depend_tree["rdepends-pn"][pn] = []
for rdep in taskdata.rdepids[fnid]:
depend_tree["rdepends-pn"][pn].append(taskdata.run_names_index[rdep])
- rdepends = self.status.rundeps[fn]
for package in rdepends:
depend_tree["rdepends-pkg"][package] = []
for rdepend in rdepends[package]:
depend_tree["rdepends-pkg"][package].append(rdepend)
- packages.append(package)
+ if resolve:
+ self.append_package(taskdata, depend_tree["packages"], rdepend)
+ if not package in packages:
+ packages.append(package)
+
+ for package in rrecs:
+ depend_tree["rrecs-pkg"][package] = []
+ for rrec in rrecs[package]:
+ depend_tree["rrecs-pkg"][package].append(rrec)
+ if resolve:
+ self.append_package(taskdata, depend_tree["packages"], rrec)
+ if not package in packages:
+ packages.append(package)
for package in packages:
- if package not in depend_tree["packages"]:
- depend_tree["packages"][package] = {}
- depend_tree["packages"][package]["pn"] = pn
- depend_tree["packages"][package]["filename"] = fn
- depend_tree["packages"][package]["version"] = version
+ self.append_package(taskdata, depend_tree["packages"], package)
return depend_tree
@@ -735,7 +771,7 @@ class BBCooker:
return pkg_list
- def generateTargetsTree(self, klass=None, pkgs=[]):
+ def generateTargetsTree(self, klass=None, pkgs=[], resolve=False):
"""
Generate a dependency tree of buildable targets
Generate an event with the result
@@ -750,7 +786,7 @@ class BBCooker:
pkgs = pkgs + extra_pkgs
# generate a dependency tree for all our packages
- tree = self.generatePkgDepTreeData(pkgs, 'build')
+ tree = self.generatePkgDepTreeData(pkgs, 'build', resolve)
bb.event.fire(bb.event.TargetsTreeGenerated(tree), self.configuration.data)
def buildWorldTargetList(self):
OpenPOWER on IntegriCloud