[yocto] [PATCH 1/1][Image Creator] Remove unused target tree data for Hob

Joshua Lock josh at linux.intel.com
Tue Jul 19 17:39:09 PDT 2011


On Fri, 2011-07-15 at 11:31 +0800, Ke Liping wrote:
> From: Liping Ke <liping.ke at intel.com>
> 
> Since Hob only needes package dependency information, we can
> create a new version of package information retrieving methods,
> remove task dependency information, so that we can greatly
> reduce data loading time for Hob
> 
> Signed-off-by: Liping Ke <liping.ke at intel.com>
> ---
>  bitbake/lib/bb/cooker.py |   96 +++++++++++++++++++++++++++++++++++++---------
>  1 files changed, 77 insertions(+), 19 deletions(-)
> 
> diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py
> index 8badd2d..26ed2ae 100644
> --- a/bitbake/lib/bb/cooker.py
> +++ b/bitbake/lib/bb/cooker.py
> @@ -296,13 +296,12 @@ class BBCooker:
>              if data.getVarFlag( e, 'python', envdata ):
>                  logger.plain("\npython %s () {\n%s}\n", e, data.getVar(e, envdata, 1))
>  
> -    def prepareTreeData(self, pkgs_to_build, task):
> +    def prepareTreeData(self, pkgs_to_build, task, runqueue=True):
>          """
>          Prepare a runqueue and taskdata object for iteration over pkgs_to_build
>          """
>          # Need files parsed
>          self.updateCache()
> -
>          # If we are told to do the None task then query the default task
>          if (task == None):
>              task = self.configuration.cmd
> @@ -322,12 +321,22 @@ class BBCooker:
>              runlist.append([k, "do_%s" % task])
>          taskdata.add_unresolved(localdata, self.status)

I'd prefer this method end around, not take the runqueue parameter and
just be responsible for updating the cache and returning taskdata

>  
> -        rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist)
> -        rq.rqdata.prepare()
> -
> -        return taskdata, rq
> -
> -    def generateDepTreeData(self, pkgs_to_build, task, more_meta=False):
> +        # For some users, take Hob as example, we only need less dependency data
> +        # mark this kind of user as "less_meta" data requester
> +        if (runqueue):
> +            rq = bb.runqueue.RunQueue(self, self.configuration.data, self.status, taskdata, runlist)
> +            rq.rqdata.prepare()
> +            return taskdata, rq

Runqueue construction could then be rolled into generateTaskDepTreeData

> +        else: 
> +            tasks_fnid = []
> +            if len(taskdata.tasks_name) == 0:
> +            # Nothing to do
> +                return
> +            for task in xrange(len(taskdata.tasks_name)):
> +                tasks_fnid.append(taskdata.tasks_fnid[task])
> +            return taskdata, tasks_fnid

and creation of tasks_fnid could be rolled into generatePkgDepTreeData

> +    
> +    def generateTaskDepTreeData(self, pkgs_to_build, task):
>          """
>          Create a dependency tree of pkgs_to_build, returning the data.
>          When more_meta is set to True include summary, license and group
> @@ -351,18 +360,10 @@ class BBCooker:
>              fn = taskdata.fn_index[fnid]
>              pn = self.status.pkg_fn[fn]
>              version  = "%s:%s-%s" % self.status.pkg_pepvpr[fn]
> -            if more_meta:
> -                summary = self.status.summary[fn]
> -                lic = self.status.license[fn]
> -                section = self.status.section[fn]
>              if pn not in depend_tree["pn"]:
>                  depend_tree["pn"][pn] = {}
>                  depend_tree["pn"][pn]["filename"] = fn
>                  depend_tree["pn"][pn]["version"] = version
> -                if more_meta:
> -                    depend_tree["pn"][pn]["summary"] = summary
> -                    depend_tree["pn"][pn]["license"] = lic
> -                    depend_tree["pn"][pn]["section"] = section

Glad to see these go :-)

>              for dep in rq.rqdata.runq_depends[task]:
>                  depfn = taskdata.fn_index[rq.rqdata.runq_fnid[dep]]
>                  deppn = self.status.pkg_fn[depfn]
> @@ -407,12 +408,69 @@ class BBCooker:
>          return depend_tree
>  
> 
> +    def generatePkgDepTreeData(self, pkgs_to_build, task):
> +        """
> +        Create a dependency tree of pkgs_to_build, returning the data.
> +        When more_meta is set to True include summary, license and group
> +        information in the returned tree.
> +        """
> +        taskdata, tasks_fnid = self.prepareTreeData(pkgs_to_build, task, False)

per above tasks_fnid would be populated here.

> +
> +        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]
> +            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
> +
> +            if fnid not in seen_fnids:
> +                seen_fnids.append(fnid)
> +                packages = []
> +
> +                depend_tree["depends"][pn] = []
> +                for dep in taskdata.depids[fnid]:
> +                    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:
> +                    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
> +
> +        return depend_tree
> +    
>      def generateDepTreeEvent(self, pkgs_to_build, task):
>          """
>          Create a task dependency graph of pkgs_to_build.
>          Generate an event with the result
>          """
> -        depgraph = self.generateDepTreeData(pkgs_to_build, task)
> +        depgraph = self.generateTaskDepTreeData(pkgs_to_build, task)
>          bb.event.fire(bb.event.DepTreeGenerated(depgraph), self.configuration.data)
>  
>      def generateDotGraphFiles(self, pkgs_to_build, task):
> @@ -421,7 +479,7 @@ class BBCooker:
>          Save the result to a set of .dot files.
>          """
>  
> -        depgraph = self.generateDepTreeData(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
>          depends_file = file('pn-depends.dot', 'w' )
> @@ -628,7 +686,7 @@ class BBCooker:
>              pkgs = pkgs + extra_pkgs
>  
>          # generate a dependency tree for all our packages
> -        tree = self.generateDepTreeData(pkgs, 'build', more_meta=True)
> +        tree = self.generatePkgDepTreeData(pkgs, 'build')
>          bb.event.fire(bb.event.TargetsTreeGenerated(tree), self.configuration.data)
>  
>      def buildWorldTargetList(self):

Looking good to me. The revised patch would ideally be sent to
bitbake-devel at lists.openembedded.org

Thanks,
Joshua
-- 
Joshua Lock
        Yocto Project "Johannes factotum"
        Intel Open Source Technology Centre




More information about the yocto mailing list