[bitbake-devel] [PATCH 06/10] command.py: add generateTargetsTreePro API
Xu, Dongxiao
dongxiao.xu at intel.com
Wed Dec 14 00:44:49 UTC 2011
> -----Original Message-----
> From: bitbake-devel-bounces at lists.openembedded.org
> [mailto:bitbake-devel-bounces at lists.openembedded.org] On Behalf Of Joshua
> Lock
> Sent: Wednesday, December 14, 2011 12:47 AM
> To: bitbake-devel at lists.openembedded.org
> Subject: Re: [bitbake-devel] [PATCH 06/10] command.py: add
> generateTargetsTreePro API
>
>
>
> On 11/12/11 18:20, Dongxiao Xu wrote:
> > 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 need to replace it with
> > its real providers.
> >
> > Besides, for packages that provided by multiple recipes, we will find
> > their preverred provider.
> >
> > To make the original Hob working, we still keep the
> > generateTargetsTree API.
>
> I assume the 'original Hob' compatability will only be maintained until
> Hobv2 is merged?
>
> Is there anything preventing us from having an optional parameter on
> generateTargetsTree to switch to pro mode rather than duplicating a bunch of
> code and functionality on a temporary basis?
Yes, thanks for your suggestion, I will modify it accordingly.
Thanks,
Dongxiao
>
> something like:
>
> > + def generateTargetsTree(self, command, params):
> > + """
> > + A pro version of generateTargetsTree
> > + """
> > + klass = params[0]
> > + param_len = len(params)
> > + if param_len 2:
> > + pkg_list = params[1]
> > + resolve = params[2]
> > + elif param_len > 1:
> > + pkg_list = params[1]
> > + resolve = false
> > + else:
> > + pkg_list = []
> > + resolve = false
> > +
> > + command.cooker.generateTargetsTree(klass, pkg_list, resolve)
> > + command.finishAsyncCommand()
> > + generateTargetsTreePro.needcache = True
>
>
> Then you can use the resolve boolean to switch the generateBlahBlahBlah
> methods to operate in the old or new way. Method signature would be
> something like:
>
> > + def generateTargetsTree(self, klass=None, pkgs=[], resolve=false):
>
> > + def generatePkgDepTreeDataPro(self, pkgs_to_build, task,
> resolve=false):
>
> Cheers,
> Joshua
>
> >
> > Signed-off-by: Dongxiao Xu <dongxiao.xu at intel.com>
> > ---
> > lib/bb/command.py | 14 +++++++
> > lib/bb/cooker.py | 98
> +++++++++++++++++++++++++++++++++++++++++++++++++++++
> > 2 files changed, 112 insertions(+), 0 deletions(-)
> >
> > diff --git a/lib/bb/command.py b/lib/bb/command.py index
> > 6b4a598..15e7839 100644
> > --- a/lib/bb/command.py
> > +++ b/lib/bb/command.py
> > @@ -238,6 +238,20 @@ class CommandsAsync:
> > command.finishAsyncCommand()
> > generateTargetsTree.needcache = True
> >
> > + def generateTargetsTreePro(self, command, params):
> > + """
> > + A pro version of generateTargetsTree
> > + """
> > + klass = params[0]
> > + if len(params) > 1:
> > + pkg_list = params[1]
> > + else:
> > + pkg_list = []
> > +
> > + command.cooker.generateTargetsTreePro(klass, pkg_list)
> > + command.finishAsyncCommand()
> > + generateTargetsTreePro.needcache = True
> > +
> > def findConfigFiles(self, command, params):
> > """
> > Find config files which provide appropriate values diff --git
> > a/lib/bb/cooker.py b/lib/bb/cooker.py index 666242f..9f05d35 100644
> > --- a/lib/bb/cooker.py
> > +++ b/lib/bb/cooker.py
> > @@ -498,6 +498,85 @@ class BBCooker:
> >
> > return depend_tree
> >
> > + def generatePkgDepTreeDataPro(self, pkgs_to_build, task):
> > + """
> > + Create a dependency tree of pkgs_to_build, returning the data.
> > + """
> > + _, taskdata = self.prepareTreeData(pkgs_to_build, task)
> > + tasks_fnid = []
> > + if len(taskdata.tasks_name) != 0:
> > + for task in xrange(len(taskdata.tasks_name)):
> > + tasks_fnid.append(taskdata.tasks_fnid[task])
> > +
> > + seen_fnids = []
> > + depend_tree = {}
> > + depend_tree["depends"] = {}
> > + depend_tree["pn"] = {}
> > + depend_tree["rdepends-pn"] = {}
> > + depend_tree["packages"] = {}
> > + depend_tree["rdepends-pkg"] = {}
> > +
> > + for task in xrange(len(tasks_fnid)):
> > + fnid = tasks_fnid[task]
> > + fn = taskdata.fn_index[fnid]
> > + pn = self.status.pkg_fn[fn]
> > + version = "%s:%s-%s" % self.status.pkg_pepvpr[fn]
> > + summary = self.status.summary[fn]
> > + lic = self.status.license[fn]
> > + section = self.status.section[fn]
> > + rdepends = self.status.rundeps[fn]
> > + if pn not in depend_tree["pn"]:
> > + depend_tree["pn"][pn] = {}
> > + depend_tree["pn"][pn]["filename"] = fn
> > + depend_tree["pn"][pn]["version"] = version
> > + depend_tree["pn"][pn]["summary"] = summary
> > + depend_tree["pn"][pn]["license"] = lic
> > + depend_tree["pn"][pn]["section"] = section
> > + depend_tree["pn"][pn]["packages"] = rdepends.keys()
> > +
> > + if fnid not in seen_fnids:
> > + seen_fnids.append(fnid)
> > + packages = []
> > +
> > + depend_tree["depends"][pn] = []
> > + for dep in taskdata.depids[fnid]:
> > + item = taskdata.build_names_index[dep]
> > + pn_provider = ""
> > + targetid = taskdata.getbuild_id(item)
> > + if targetid in taskdata.build_targets:
> > + 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)
> > +
> > + depend_tree["rdepends-pn"][pn] = []
> > + for rdep in taskdata.rdepids[fnid]:
> > +
> > + depend_tree["rdepends-pn"][pn].append(taskdata.run_names_index[rdep]
> > + )
> > +
> > + for package in rdepends:
> > + depend_tree["rdepends-pkg"][package] = []
> > + for rdepend in rdepends[package]:
> > +
> depend_tree["rdepends-pkg"][package].append(rdepend)
> > + packages.append(package)
> > +
> > + for package in packages:
> > + if package not in depend_tree["packages"]:
> > + targetid = taskdata.getrun_id(package)
> > + if targetid in taskdata.run_targets:
> > + 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["packages"][package] = {}
> > + depend_tree["packages"][package]["pn"] = pn
> > +
> depend_tree["packages"][package]["filename"] = fn
> > + depend_tree["packages"][package]["version"]
> =
> > + version
> > +
> > + return depend_tree
> > +
> > +
> > def generateDepTreeEvent(self, pkgs_to_build, task):
> > """
> > Create a task dependency graph of pkgs_to_build.
> > @@ -746,6 +825,25 @@ class BBCooker:
> > tree = self.generatePkgDepTreeData(pkgs, 'build')
> > bb.event.fire(bb.event.TargetsTreeGenerated(tree),
> > self.configuration.data)
> >
> > + def generateTargetsTreePro(self, klass=None, pkgs=[]):
> > + """
> > + Generate a dependency tree of buildable targets
> > + Check and add providers for each dependencies
> > + Generate an event with the result
> > + """
> > + # if the caller hasn't specified a pkgs list default to universe
> > + if not len(pkgs):
> > + pkgs = ['universe']
> > + # if inherited_class passed ensure all recipes which inherit the
> > + # specified class are included in pkgs
> > + if klass:
> > + extra_pkgs = self.findInheritsClass(klass)
> > + pkgs = pkgs + extra_pkgs
> > +
> > + # generate a dependency tree for all our packages
> > + tree = self.generatePkgDepTreeDataPro(pkgs, 'build')
> > + bb.event.fire(bb.event.TargetsTreeGenerated(tree),
> > + self.configuration.data)
> > +
> > def buildWorldTargetList(self):
> > """
> > Build package list for "bitbake world"
>
> --
> Joshua Lock
> Yocto Project "Johannes factotum"
> Intel Open Source Technology Centre
>
> _______________________________________________
> bitbake-devel mailing list
> bitbake-devel at lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/bitbake-devel
More information about the bitbake-devel
mailing list