1
0
mirror of https://git.yoctoproject.org/poky synced 2026-05-30 00:20:08 +00:00

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>
This commit is contained in:
Dongxiao Xu
2012-02-23 21:47:14 +08:00
committed by Richard Purdie
parent 85fa989df7
commit de77b9752a
2 changed files with 56 additions and 13 deletions
+9 -2
View File
@@ -242,14 +242,21 @@ class CommandsAsync:
included in the package list. included in the package list.
If pkg_list provided use that list (plus any extras brought in by If pkg_list provided use that list (plus any extras brought in by
klass) rather than generating a tree for all packages. 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] 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] pkg_list = params[1]
else: else:
pkg_list = [] pkg_list = []
command.cooker.generateTargetsTree(klass, pkg_list) command.cooker.generateTargetsTree(klass, pkg_list, resolve)
command.finishAsyncCommand() command.finishAsyncCommand()
generateTargetsTree.needcache = True generateTargetsTree.needcache = True
+45 -9
View File
@@ -429,7 +429,20 @@ class BBCooker:
return depend_tree 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. Create a dependency tree of pkgs_to_build, returning the data.
""" """
@@ -446,6 +459,7 @@ class BBCooker:
depend_tree["rdepends-pn"] = {} depend_tree["rdepends-pn"] = {}
depend_tree["packages"] = {} depend_tree["packages"] = {}
depend_tree["rdepends-pkg"] = {} depend_tree["rdepends-pkg"] = {}
depend_tree["rrecs-pkg"] = {}
for task in xrange(len(tasks_fnid)): for task in xrange(len(tasks_fnid)):
fnid = tasks_fnid[task] fnid = tasks_fnid[task]
@@ -456,6 +470,8 @@ class BBCooker:
lic = self.status.license[fn] lic = self.status.license[fn]
section = self.status.section[fn] section = self.status.section[fn]
description = self.status.description[fn] description = self.status.description[fn]
rdepends = self.status.rundeps[fn]
rrecs = self.status.runrecs[fn]
if pn not in depend_tree["pn"]: if pn not in depend_tree["pn"]:
depend_tree["pn"][pn] = {} depend_tree["pn"][pn] = {}
depend_tree["pn"][pn]["filename"] = fn depend_tree["pn"][pn]["filename"] = fn
@@ -464,6 +480,7 @@ class BBCooker:
depend_tree["pn"][pn]["license"] = lic depend_tree["pn"][pn]["license"] = lic
depend_tree["pn"][pn]["section"] = section depend_tree["pn"][pn]["section"] = section
depend_tree["pn"][pn]["description"] = description depend_tree["pn"][pn]["description"] = description
depend_tree["pn"][pn]["packages"] = rdepends.keys()
if fnid not in seen_fnids: if fnid not in seen_fnids:
seen_fnids.append(fnid) seen_fnids.append(fnid)
@@ -471,25 +488,44 @@ class BBCooker:
depend_tree["depends"][pn] = [] depend_tree["depends"][pn] = []
for dep in taskdata.depids[fnid]: for dep in taskdata.depids[fnid]:
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["depends"][pn].append(taskdata.build_names_index[dep])
depend_tree["rdepends-pn"][pn] = [] depend_tree["rdepends-pn"][pn] = []
for rdep in taskdata.rdepids[fnid]: for rdep in taskdata.rdepids[fnid]:
depend_tree["rdepends-pn"][pn].append(taskdata.run_names_index[rdep]) depend_tree["rdepends-pn"][pn].append(taskdata.run_names_index[rdep])
rdepends = self.status.rundeps[fn]
for package in rdepends: for package in rdepends:
depend_tree["rdepends-pkg"][package] = [] depend_tree["rdepends-pkg"][package] = []
for rdepend in rdepends[package]: for rdepend in rdepends[package]:
depend_tree["rdepends-pkg"][package].append(rdepend) depend_tree["rdepends-pkg"][package].append(rdepend)
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) packages.append(package)
for package in packages: for package in packages:
if package not in depend_tree["packages"]: self.append_package(taskdata, depend_tree["packages"], package)
depend_tree["packages"][package] = {}
depend_tree["packages"][package]["pn"] = pn
depend_tree["packages"][package]["filename"] = fn
depend_tree["packages"][package]["version"] = version
return depend_tree return depend_tree
@@ -735,7 +771,7 @@ class BBCooker:
return pkg_list 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 a dependency tree of buildable targets
Generate an event with the result Generate an event with the result
@@ -750,7 +786,7 @@ class BBCooker:
pkgs = pkgs + extra_pkgs pkgs = pkgs + extra_pkgs
# generate a dependency tree for all our packages # 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) bb.event.fire(bb.event.TargetsTreeGenerated(tree), self.configuration.data)
def buildWorldTargetList(self): def buildWorldTargetList(self):