diff options
| author | Richard Purdie <richard@openedhand.com> | 2007-01-08 23:53:01 +0000 | 
|---|---|---|
| committer | Richard Purdie <richard@openedhand.com> | 2007-01-08 23:53:01 +0000 | 
| commit | f5665d5bfcfb13d01da9e4c7d5046453e80f7baf (patch) | |
| tree | b8908549afaf3006bf3763419711090ac999c2a4 /bitbake/lib | |
| parent | aec95de5f7dca2afa3a4a0bdb0d4d553c13f680d (diff) | |
| download | openembedded-core-f5665d5bfcfb13d01da9e4c7d5046453e80f7baf.tar.gz openembedded-core-f5665d5bfcfb13d01da9e4c7d5046453e80f7baf.tar.bz2 openembedded-core-f5665d5bfcfb13d01da9e4c7d5046453e80f7baf.zip | |
bitbake: Sync with upstream. 
 * File licence headers were sanitised causing most of the diff. 
 * cooker.py was created from bin/bitbake. 
 * cvs fetcher port option was added
 * The -f force option was fixed to work correctly
 * Multiple entries in rrecrdeps are now handled correctly
   (allows adding do_deploy to image depends)
 
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@1129 311d38ba-8fff-0310-9ca6-ca027cbcb966
Diffstat (limited to 'bitbake/lib')
29 files changed, 1281 insertions, 571 deletions
| diff --git a/bitbake/lib/bb/COW.py b/bitbake/lib/bb/COW.py index 826d435f98..e5063d60a8 100644 --- a/bitbake/lib/bb/COW.py +++ b/bitbake/lib/bb/COW.py @@ -1,12 +1,27 @@  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- -""" -This is a copy on write dictionary and set which abuses classes to try and be nice and fast. - -Please Note:  - Be careful when using mutable types (ie Dict and Lists) - operations involving these are SLOW. - Assign a file to __warn__ to get warnings about slow operations. -""" +# +# This is a copy on write dictionary and set which abuses classes to try and be nice and fast. +# +# Copyright (C) 2006 Tim Amsell  +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +#Please Note:  +# Be careful when using mutable types (ie Dict and Lists) - operations involving these are SLOW. +# Assign a file to __warn__ to get warnings about slow operations. +#  from inspect import getmro diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py index 61eb5f3db8..a11af84b12 100644 --- a/bitbake/lib/bb/__init__.py +++ b/bitbake/lib/bb/__init__.py @@ -1,27 +1,25 @@ -#!/usr/bin/python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- -""" -BitBake Build System Python Library - -Copyright (C) 2003  Holger Schurig -Copyright (C) 2003, 2004  Chris Larson - -Based on Gentoo's portage.py. - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA. -""" +# +# BitBake Build System Python Library +# +# Copyright (C) 2003  Holger Schurig +# Copyright (C) 2003, 2004  Chris Larson +# +# Based on Gentoo's portage.py. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.  __version__ = "1.7.4" diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py index 942bdc1a39..bf6b612f32 100644 --- a/bitbake/lib/bb/build.py +++ b/bitbake/lib/bb/build.py @@ -1,29 +1,29 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- -""" -BitBake 'Build' implementation - -Core code for function execution and task handling in the -BitBake build tools. - -Copyright (C) 2003, 2004  Chris Larson - -Based on Gentoo's portage.py. - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with - -Based on functions from the base bb module, Copyright 2003 Holger Schurig -""" +# +# BitBake 'Build' implementation +# +# Core code for function execution and task handling in the +# BitBake build tools. +# +# Copyright (C) 2003, 2004  Chris Larson +# +# Based on Gentoo's portage.py. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +#Based on functions from the base bb module, Copyright 2003 Holger Schurig  from bb import data, fetch, event, mkdirhier, utils  import bb, os @@ -219,14 +219,18 @@ def exec_func_shell(func, d):          bb.msg.error(bb.msg.domain.Build, "function %s failed" % func)          if data.getVar("BBINCLUDELOGS", d):              bb.msg.error(bb.msg.domain.Build, "log data follows (%s)" % logfile) -            f = open(logfile, "r") -            while True: -                l = f.readline() -                if l == '': -                    break -                l = l.rstrip() -                print '| %s' % l -            f.close() +            number_of_lines = data.getVar("BBINCLUDELOGS_LINES", d) +            if number_of_lines: +                os.system('tail -n%s %s' % (number_of_lines, logfile)) +            else: +                f = open(logfile, "r") +                while True: +                    l = f.readline() +                    if l == '': +                        break +                    l = l.rstrip() +                    print '| %s' % l +                f.close()          else:              bb.msg.error(bb.msg.domain.Build, "see log in %s" % logfile)          raise FuncFailed( logfile ) @@ -252,9 +256,8 @@ def exec_task(task, d):          raise EventException("Missing node in task graph", InvalidTask(task, d))      # check whether this task needs executing.. -    if not data.getVarFlag(task, 'force', d): -        if stamp_is_current(task, d): -            return 1 +    if stamp_is_current(task, d): +        return 1      # follow digraph path up, then execute our way back down      def execute(graph, item): @@ -291,59 +294,43 @@ def exec_task(task, d):      # make stamp, or cause event and raise exception      if not data.getVarFlag(task, 'nostamp', d): -        mkstamp(task, d) +        make_stamp(task, d) -def stamp_is_current_cache(dataCache, file_name, task, checkdeps = 1): +def extract_stamp_data(d, fn):      """ -    Check status of a given task's stamp.  -    Returns 0 if it is not current and needs updating. -    Same as stamp_is_current but works against the dataCache instead of d +    Extracts stamp data from d which is either a data dictonary (fn unset)  +    or a dataCache entry (fn set).       """ -    task_graph = dataCache.task_queues[file_name] - -    if not dataCache.stamp[file_name]: -        return 0 - -    stampfile = "%s.%s" % (dataCache.stamp[file_name], task) -    if not os.access(stampfile, os.F_OK): -        return 0 - -    if checkdeps == 0: -        return 1 - -    import stat -    tasktime = os.stat(stampfile)[stat.ST_MTIME] - -    _deps = [] -    def checkStamp(graph, task): -        # check for existance -        if 'nostamp' in dataCache.task_deps[file_name] and task in dataCache.task_deps[file_name]['nostamp']: -            return 1 - -        if not stamp_is_current_cache(dataCache, file_name, task, 0): -            return 0 - -        depfile = "%s.%s" % (dataCache.stamp[file_name], task) -        deptime = os.stat(depfile)[stat.ST_MTIME] -        if deptime > tasktime: -            return 0 -        return 1 +    if fn: +        return (d.task_queues[fn], d.stamp[fn], d.task_deps[fn]) +    task_graph = data.getVar('_task_graph', d) +    if not task_graph: +        task_graph = bb.digraph() +        data.setVar('_task_graph', task_graph, d) +    return (task_graph, data.getVar('STAMP', d, 1), None) -    return task_graph.walkdown(task, checkStamp) +def extract_stamp(d, fn): +    """ +    Extracts stamp format which is either a data dictonary (fn unset)  +    or a dataCache entry (fn set).  +    """ +    if fn: +        return d.stamp[fn] +    return data.getVar('STAMP', d, 1) -def stamp_is_current(task, d, checkdeps = 1): +def stamp_is_current(task, d, file_name = None, checkdeps = 1):      """      Check status of a given task's stamp.       Returns 0 if it is not current and needs updating. +    (d can be a data dict or dataCache)      """ -    task_graph = data.getVar('_task_graph', d) -    if not task_graph: -        task_graph = bb.digraph() -        data.setVar('_task_graph', task_graph, d) -    stamp = data.getVar('STAMP', d) -    if not stamp: + +    (task_graph, stampfn, taskdep) = extract_stamp_data(d, file_name) + +    if not stampfn:          return 0 -    stampfile = "%s.%s" % (data.expand(stamp, d), task) + +    stampfile = "%s.%s" % (stampfn, task)      if not os.access(stampfile, os.F_OK):          return 0 @@ -356,13 +343,17 @@ def stamp_is_current(task, d, checkdeps = 1):      _deps = []      def checkStamp(graph, task):          # check for existance -        if data.getVarFlag(task, 'nostamp', d): -            return 1 +        if file_name: +            if 'nostamp' in taskdep and task in taskdep['nostamp']: +                return 1 +        else: +            if data.getVarFlag(task, 'nostamp', d): +                return 1 -        if not stamp_is_current(task, d, 0): +        if not stamp_is_current(task, d, file_name, 0						):              return 0 -        depfile = "%s.%s" % (data.expand(stamp, d), task) +        depfile = "%s.%s" % (stampfn, task)          deptime = os.stat(depfile)[stat.ST_MTIME]          if deptime > tasktime:              return 0 @@ -370,24 +361,40 @@ def stamp_is_current(task, d, checkdeps = 1):      return task_graph.walkdown(task, checkStamp) - -def md5_is_current(task): -    """Check if a md5 file for a given task is current""" - - -def mkstamp(task, d): -    """Creates/updates a stamp for a given task""" -    stamp = data.getVar('STAMP', d) +def stamp_internal(task, d, file_name): +    """ +    Internal stamp helper function +    Removes any stamp for the given task +    Makes sure the stamp directory exists +    Returns the stamp path+filename +    """ +    stamp = extract_stamp(d, file_name)      if not stamp:          return -    stamp = "%s.%s" % (data.expand(stamp, d), task) +    stamp = "%s.%s" % (stamp, task)      mkdirhier(os.path.dirname(stamp))      # Remove the file and recreate to force timestamp      # change on broken NFS filesystems      if os.access(stamp, os.F_OK):          os.remove(stamp) -    f = open(stamp, "w") -    f.close() +    return stamp + +def make_stamp(task, d, file_name = None): +    """ +    Creates/updates a stamp for a given task +    (d can be a data dict or dataCache) +    """ +    stamp = stamp_internal(task, d, file_name) +    if stamp: +        f = open(stamp, "w") +        f.close() + +def del_stamp(task, d, file_name = None): +    """ +    Removes a stamp for a given task +    (d can be a data dict or dataCache) +    """ +    stamp_internal(task, d, file_name)  def add_task(task, deps, d):      task_graph = data.getVar('_task_graph', d) diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py index 05c42518a7..934d230e6a 100644 --- a/bitbake/lib/bb/cache.py +++ b/bitbake/lib/bb/cache.py @@ -1,10 +1,9 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- -""" -BitBake 'Event' implementation - -Caching of bitbake variables before task execution +# +# BitBake 'Event' implementation +# +# Caching of bitbake variables before task execution  # Copyright (C) 2006        Richard Purdie @@ -14,21 +13,20 @@ Caching of bitbake variables before task execution  # Copyright (C) 2003 - 2005 Michael 'Mickey' Lauer  # Copyright (C) 2005        Holger Hans Peter Freyther  # Copyright (C) 2005        ROAD GmbH +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA.  - -"""  import os, re  import bb.data diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py new file mode 100644 index 0000000000..8a9c588633 --- /dev/null +++ b/bitbake/lib/bb/cooker.py @@ -0,0 +1,665 @@ +#!/usr/bin/env python +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# Copyright (C) 2003, 2004  Chris Larson +# Copyright (C) 2003, 2004  Phil Blundell +# Copyright (C) 2003 - 2005 Michael 'Mickey' Lauer +# Copyright (C) 2005        Holger Hans Peter Freyther +# Copyright (C) 2005        ROAD GmbH +# Copyright (C) 2006        Richard Purdie +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import sys, os, getopt, glob, copy, os.path, re, time +import bb +from bb import utils, data, parse, event, cache, providers, taskdata, runqueue +from sets import Set +import itertools + +parsespin = itertools.cycle( r'|/-\\' ) + +#============================================================================# +# BBStatistics +#============================================================================# +class BBStatistics: +    """ +    Manage build statistics for one run +    """ +    def __init__(self ): +        self.attempt = 0 +        self.success = 0 +        self.fail = 0 +        self.deps = 0 + +    def show( self ): +        print "Build statistics:" +        print "  Attempted builds: %d" % self.attempt +        if self.fail: +            print "  Failed builds: %d" % self.fail +        if self.deps: +            print "  Dependencies not satisfied: %d" % self.deps +        if self.fail or self.deps: return 1 +        else: return 0 + +#============================================================================# +# BBCooker +#============================================================================# +class BBCooker: +    """ +    Manages one bitbake build run +    """ + +    Statistics = BBStatistics           # make it visible from the shell + +    def __init__( self ): +        self.build_cache_fail = [] +        self.build_cache = [] +        self.stats = BBStatistics() +        self.status = None + +        self.cache = None +        self.bb_cache = None + +    def tryBuildPackage(self, fn, item, task, the_data, build_depends): +        """ +        Build one task of a package, optionally build following task depends +        """ +        bb.event.fire(bb.event.PkgStarted(item, the_data)) +        try: +            self.stats.attempt += 1 +            if not build_depends: +                bb.data.setVarFlag('do_%s' % task, 'dontrundeps', 1, the_data) +            if not self.configuration.dry_run: +                bb.build.exec_task('do_%s' % task, the_data) +            bb.event.fire(bb.event.PkgSucceeded(item, the_data)) +            self.build_cache.append(fn) +            return True +        except bb.build.FuncFailed: +            self.stats.fail += 1 +            bb.msg.error(bb.msg.domain.Build, "task stack execution failed") +            bb.event.fire(bb.event.PkgFailed(item, the_data)) +            self.build_cache_fail.append(fn) +            raise +        except bb.build.EventException, e: +            self.stats.fail += 1 +            event = e.args[1] +            bb.msg.error(bb.msg.domain.Build, "%s event exception, aborting" % bb.event.getName(event)) +            bb.event.fire(bb.event.PkgFailed(item, the_data)) +            self.build_cache_fail.append(fn) +            raise + +    def tryBuild( self, fn, build_depends): +        """ +        Build a provider and its dependencies.  +        build_depends is a list of previous build dependencies (not runtime) +        If build_depends is empty, we're dealing with a runtime depends +        """ + +        the_data = self.bb_cache.loadDataFull(fn, self.configuration.data) + +        item = self.status.pkg_fn[fn] + +        if bb.build.stamp_is_current('do_%s' % self.configuration.cmd, the_data): +            self.build_cache.append(fn) +            return True + +        return self.tryBuildPackage(fn, item, self.configuration.cmd, the_data, build_depends) + +    def showVersions( self ): +        pkg_pn = self.status.pkg_pn +        preferred_versions = {} +        latest_versions = {} + +        # Sort by priority +        for pn in pkg_pn.keys(): +            (last_ver,last_file,pref_ver,pref_file) = bb.providers.findBestProvider(pn, self.configuration.data, self.status) +            preferred_versions[pn] = (pref_ver, pref_file) +            latest_versions[pn] = (last_ver, last_file) + +        pkg_list = pkg_pn.keys() +        pkg_list.sort() + +        for p in pkg_list: +            pref = preferred_versions[p] +            latest = latest_versions[p] + +            if pref != latest: +                prefstr = pref[0][0] + "-" + pref[0][1] +            else: +                prefstr = "" + +            print "%-30s %20s %20s" % (p, latest[0][0] + "-" + latest[0][1], +                                        prefstr) + + +    def showEnvironment( self ): +        """Show the outer or per-package environment""" +        if self.configuration.buildfile: +            self.cb = None +            self.bb_cache = bb.cache.init(self) +            try: +                self.configuration.data = self.bb_cache.loadDataFull(self.configuration.buildfile, self.configuration.data) +            except IOError, e: +                bb.msg.fatal(bb.msg.domain.Parsing, "Unable to read %s: %s" % ( self.configuration.buildfile, e )) +            except Exception, e: +                bb.msg.fatal(bb.msg.domain.Parsing, "%s" % e) +        # emit variables and shell functions +        try: +            data.update_data( self.configuration.data ) +            data.emit_env(sys.__stdout__, self.configuration.data, True) +        except Exception, e: +            bb.msg.fatal(bb.msg.domain.Parsing, "%s" % e) +        # emit the metadata which isnt valid shell +        data.expandKeys( self.configuration.data )	 +        for e in self.configuration.data.keys(): +            if data.getVarFlag( e, 'python', self.configuration.data ): +                sys.__stdout__.write("\npython %s () {\n%s}\n" % (e, data.getVar(e, self.configuration.data, 1))) + +    def generateDotGraph( self, pkgs_to_build, ignore_deps ): +        """ +        Generate a task dependency graph.  + +        pkgs_to_build A list of packages that needs to be built +        ignore_deps   A list of names where processing of dependencies +                      should be stopped. e.g. dependencies that get +        """ + +        for dep in ignore_deps: +            self.status.ignored_dependencies.add(dep) + +        localdata = data.createCopy(self.configuration.data) +        bb.data.update_data(localdata) +        bb.data.expandKeys(localdata) +        taskdata = bb.taskdata.TaskData(self.configuration.abort) + +        runlist = [] +        try: +            for k in pkgs_to_build: +                taskdata.add_provider(localdata, self.status, k) +                runlist.append([k, "do_%s" % self.configuration.cmd]) +            taskdata.add_unresolved(localdata, self.status) +        except bb.providers.NoProvider: +            sys.exit(1) +        rq = bb.runqueue.RunQueue() +        rq.prepare_runqueue(self, self.configuration.data, self.status, taskdata, runlist) + +        seen_fnids = []   +        depends_file = file('depends.dot', 'w' ) +        tdepends_file = file('task-depends.dot', 'w' ) +        print >> depends_file, "digraph depends {" +        print >> tdepends_file, "digraph depends {" +        rq.prio_map.reverse() +        for task1 in range(len(rq.runq_fnid)): +            task = rq.prio_map[task1] +            taskname = rq.runq_task[task] +            fnid = rq.runq_fnid[task] +            fn = taskdata.fn_index[fnid] +            pn = self.status.pkg_fn[fn] +            version  = self.bb_cache.getVar('PV', fn, True ) + '-' + self.bb_cache.getVar('PR', fn, True) +            print >> tdepends_file, '"%s.%s" [label="%s %s\\n%s\\n%s"]' % (pn, taskname, pn, taskname, version, fn) +            for dep in rq.runq_depends[task]: +                depfn = taskdata.fn_index[rq.runq_fnid[dep]] +                deppn = self.status.pkg_fn[depfn] +                print >> tdepends_file, '"%s.%s" -> "%s.%s"' % (pn, rq.runq_task[task], deppn, rq.runq_task[dep]) +            if fnid not in seen_fnids: +                seen_fnids.append(fnid) +                packages = [] +                print >> depends_file, '"%s" [label="%s %s\\n%s"]' % (pn, pn, version, fn)		 +                for depend in self.status.deps[fn]: +                    print >> depends_file, '"%s" -> "%s"' % (pn, depend) +                rdepends = self.status.rundeps[fn] +                for package in rdepends: +                    for rdepend in rdepends[package]: +                        print >> depends_file, '"%s" -> "%s" [style=dashed]' % (package, rdepend) +                    packages.append(package) +                rrecs = self.status.runrecs[fn] +                for package in rrecs: +                    for rdepend in rrecs[package]: +                        print >> depends_file, '"%s" -> "%s" [style=dashed]' % (package, rdepend) +                    if not package in packages: +                        packages.append(package) +                for package in packages: +                    if package != pn: +                        print >> depends_file, '"%s" [label="%s(%s) %s\\n%s"]' % (package, package, pn, version, fn) +                        for depend in self.status.deps[fn]: +                            print >> depends_file, '"%s" -> "%s"' % (package, depend) +                # Prints a flattened form of the above where subpackages of a package are merged into the main pn +                #print >> depends_file, '"%s" [label="%s %s\\n%s\\n%s"]' % (pn, pn, taskname, version, fn) +                #for rdep in taskdata.rdepids[fnid]: +                #    print >> depends_file, '"%s" -> "%s" [style=dashed]' % (pn, taskdata.run_names_index[rdep]) +                #for dep in taskdata.depids[fnid]: +                #    print >> depends_file, '"%s" -> "%s"' % (pn, taskdata.build_names_index[dep]) +        print >> depends_file,  "}" +        print >> tdepends_file,  "}" +        bb.msg.note(1, bb.msg.domain.Collection, "Dependencies saved to 'depends.dot'") +        bb.msg.note(1, bb.msg.domain.Collection, "Task dependencies saved to 'task-depends.dot'") + +    def buildDepgraph( self ): +        all_depends = self.status.all_depends +        pn_provides = self.status.pn_provides + +        localdata = data.createCopy(self.configuration.data) +        bb.data.update_data(localdata) +        bb.data.expandKeys(localdata) + +        def calc_bbfile_priority(filename): +            for (regex, pri) in self.status.bbfile_config_priorities: +                if regex.match(filename): +                    return pri +            return 0 + +        # Handle PREFERRED_PROVIDERS +        for p in (bb.data.getVar('PREFERRED_PROVIDERS', localdata, 1) or "").split(): +            (providee, provider) = p.split(':') +            if providee in self.status.preferred and self.status.preferred[providee] != provider: +                bb.msg.error(bb.msg.domain.Provider, "conflicting preferences for %s: both %s and %s specified" % (providee, provider, self.status.preferred[providee])) +            self.status.preferred[providee] = provider + +        # Calculate priorities for each file +        for p in self.status.pkg_fn.keys(): +            self.status.bbfile_priority[p] = calc_bbfile_priority(p) + +    def buildWorldTargetList(self): +        """ +         Build package list for "bitbake world" +        """ +        all_depends = self.status.all_depends +        pn_provides = self.status.pn_provides +        bb.msg.debug(1, bb.msg.domain.Parsing, "collating packages for \"world\"") +        for f in self.status.possible_world: +            terminal = True +            pn = self.status.pkg_fn[f] + +            for p in pn_provides[pn]: +                if p.startswith('virtual/'): +                    bb.msg.debug(2, bb.msg.domain.Parsing, "World build skipping %s due to %s provider starting with virtual/" % (f, p)) +                    terminal = False +                    break +                for pf in self.status.providers[p]: +                    if self.status.pkg_fn[pf] != pn: +                        bb.msg.debug(2, bb.msg.domain.Parsing, "World build skipping %s due to both us and %s providing %s" % (f, pf, p)) +                        terminal = False +                        break +            if terminal: +                self.status.world_target.add(pn) + +            # drop reference count now +            self.status.possible_world = None +            self.status.all_depends    = None + +    def myProgressCallback( self, x, y, f, from_cache ): +        """Update any tty with the progress change""" +        if os.isatty(sys.stdout.fileno()): +            sys.stdout.write("\rNOTE: Handling BitBake files: %s (%04d/%04d) [%2d %%]" % ( parsespin.next(), x, y, x*100/y ) ) +            sys.stdout.flush() +        else: +            if x == 1: +                sys.stdout.write("Parsing .bb files, please wait...") +                sys.stdout.flush() +            if x == y: +                sys.stdout.write("done.") +                sys.stdout.flush() + +    def interactiveMode( self ): +        """Drop off into a shell""" +        try: +            from bb import shell +        except ImportError, details: +            bb.msg.fatal(bb.msg.domain.Parsing, "Sorry, shell not available (%s)" % details ) +        else: +            bb.data.update_data( self.configuration.data ) +            bb.data.expandKeys( self.configuration.data ) +            shell.start( self ) +            sys.exit( 0 ) + +    def parseConfigurationFile( self, afile ): +        try: +            self.configuration.data = bb.parse.handle( afile, self.configuration.data ) + +            # Add the handlers we inherited by INHERIT +            # we need to do this manually as it is not guranteed +            # we will pick up these classes... as we only INHERIT +            # on .inc and .bb files but not on .conf +            data = bb.data.createCopy( self.configuration.data ) +            inherits  = ["base"] + (bb.data.getVar('INHERIT', data, True ) or "").split() +            for inherit in inherits: +                data = bb.parse.handle( os.path.join('classes', '%s.bbclass' % inherit ), data, True ) + +            # FIXME: This assumes that we included at least one .inc file +            for var in bb.data.keys(data): +                if bb.data.getVarFlag(var, 'handler', data): +                    bb.event.register(var,bb.data.getVar(var, data)) + +        except IOError: +            bb.msg.fatal(bb.msg.domain.Parsing, "Unable to open %s" % afile ) +        except bb.parse.ParseError, details: +            bb.msg.fatal(bb.msg.domain.Parsing, "Unable to parse %s (%s)" % (afile, details) ) + +    def handleCollections( self, collections ): +        """Handle collections""" +        if collections: +            collection_list = collections.split() +            for c in collection_list: +                regex = bb.data.getVar("BBFILE_PATTERN_%s" % c, self.configuration.data, 1) +                if regex == None: +                    bb.msg.error(bb.msg.domain.Parsing, "BBFILE_PATTERN_%s not defined" % c) +                    continue +                priority = bb.data.getVar("BBFILE_PRIORITY_%s" % c, self.configuration.data, 1) +                if priority == None: +                    bb.msg.error(bb.msg.domain.Parsing, "BBFILE_PRIORITY_%s not defined" % c) +                    continue +                try: +                    cre = re.compile(regex) +                except re.error: +                    bb.msg.error(bb.msg.domain.Parsing, "BBFILE_PATTERN_%s \"%s\" is not a valid regular expression" % (c, regex)) +                    continue +                try: +                    pri = int(priority) +                    self.status.bbfile_config_priorities.append((cre, pri)) +                except ValueError: +                    bb.msg.error(bb.msg.domain.Parsing, "invalid value for BBFILE_PRIORITY_%s: \"%s\"" % (c, priority)) + + +    def cook(self, configuration): +        """ +        We are building stuff here. We do the building +        from here. By default we try to execute task +        build. +        """ + +        self.configuration = configuration + +        if self.configuration.verbose: +            bb.msg.set_verbose(True) + +        if self.configuration.debug: +            bb.msg.set_debug_level(self.configuration.debug) +        else: +            bb.msg.set_debug_level(0) + +        if self.configuration.debug_domains: +            bb.msg.set_debug_domains(self.configuration.debug_domains) + +        self.configuration.data = bb.data.init() + +        for f in self.configuration.file: +            self.parseConfigurationFile( f ) + +        self.parseConfigurationFile( os.path.join( "conf", "bitbake.conf" ) ) + +        if not self.configuration.cmd: +            self.configuration.cmd = bb.data.getVar("BB_DEFAULT_TASK", self.configuration.data) or "build" + +        # +        # Special updated configuration we use for firing events +        # +        self.configuration.event_data = bb.data.createCopy(self.configuration.data) +        bb.data.update_data(self.configuration.event_data) + +        if self.configuration.show_environment: +            self.showEnvironment() +            sys.exit( 0 ) + +        # inject custom variables +        if not bb.data.getVar("BUILDNAME", self.configuration.data): +            bb.data.setVar("BUILDNAME", os.popen('date +%Y%m%d%H%M').readline().strip(), self.configuration.data) +        bb.data.setVar("BUILDSTART", time.strftime('%m/%d/%Y %H:%M:%S',time.gmtime()),self.configuration.data) + +        buildname = bb.data.getVar("BUILDNAME", self.configuration.data) + +        if self.configuration.interactive: +            self.interactiveMode() + +        if self.configuration.buildfile is not None: +            bf = os.path.abspath( self.configuration.buildfile ) +            try: +                os.stat(bf) +            except OSError: +                (filelist, masked) = self.collect_bbfiles() +                regexp = re.compile(self.configuration.buildfile) +                matches = [] +                for f in filelist: +                    if regexp.search(f) and os.path.isfile(f): +                        bf = f +                        matches.append(f) +                if len(matches) != 1: +                    bb.msg.error(bb.msg.domain.Parsing, "Unable to match %s (%s matches found):" % (self.configuration.buildfile, len(matches))) +                    for f in matches: +                        bb.msg.error(bb.msg.domain.Parsing, "    %s" % f) +                    sys.exit(1) +                bf = matches[0]		     + +            bbfile_data = bb.parse.handle(bf, self.configuration.data) + +            # Remove stamp for target if force mode active +            if self.configuration.force: +                bb.msg.note(2, bb.msg.domain.RunQueue, "Remove stamp %s, %s" % (self.configuration.cmd, bf)) +                bb.build.del_stamp('do_%s' % self.configuration.cmd, bbfile_data) + +            item = bb.data.getVar('PN', bbfile_data, 1) +            try: +                self.tryBuildPackage(bf, item, self.configuration.cmd, bbfile_data, True) +            except bb.build.EventException: +                bb.msg.error(bb.msg.domain.Build,  "Build of '%s' failed" % item ) + +            sys.exit( self.stats.show() ) + +        # initialise the parsing status now we know we will need deps +        self.status = bb.cache.CacheData() + +        ignore = bb.data.getVar("ASSUME_PROVIDED", self.configuration.data, 1) or "" +        self.status.ignored_dependencies = Set( ignore.split() ) + +        self.handleCollections( bb.data.getVar("BBFILE_COLLECTIONS", self.configuration.data, 1) ) + +        pkgs_to_build = self.configuration.pkgs_to_build + +        bbpkgs = bb.data.getVar('BBPKGS', self.configuration.data, 1) +        if bbpkgs: +            pkgs_to_build.extend(bbpkgs.split()) +        if len(pkgs_to_build) == 0 and not self.configuration.show_versions \ +                             and not self.configuration.show_environment: +                print "Nothing to do.  Use 'bitbake world' to build everything, or run 'bitbake --help'" +                print "for usage information." +                sys.exit(0) + +        # Import Psyco if available and not disabled +        if not self.configuration.disable_psyco: +            try: +                import psyco +            except ImportError: +                bb.msg.note(1, bb.msg.domain.Collection, "Psyco JIT Compiler (http://psyco.sf.net) not available. Install it to increase performance.") +            else: +                psyco.bind( self.parse_bbfiles ) +        else: +            bb.msg.note(1, bb.msg.domain.Collection, "You have disabled Psyco. This decreases performance.") + +        try: +            bb.msg.debug(1, bb.msg.domain.Collection, "collecting .bb files") +            (filelist, masked) = self.collect_bbfiles() +            self.parse_bbfiles(filelist, masked, self.myProgressCallback) +            bb.msg.debug(1, bb.msg.domain.Collection, "parsing complete") +            print +            if self.configuration.parse_only: +                bb.msg.note(1, bb.msg.domain.Collection, "Requested parsing .bb files only.  Exiting.") +                return + + +            self.buildDepgraph() + +            if self.configuration.show_versions: +                self.showVersions() +                sys.exit( 0 ) +            if 'world' in pkgs_to_build: +                self.buildWorldTargetList() +                pkgs_to_build.remove('world') +                for t in self.status.world_target: +                    pkgs_to_build.append(t) + +            if self.configuration.dot_graph: +                self.generateDotGraph( pkgs_to_build, self.configuration.ignored_dot_deps ) +                sys.exit( 0 ) + +            bb.event.fire(bb.event.BuildStarted(buildname, pkgs_to_build, self.configuration.event_data)) + +            localdata = data.createCopy(self.configuration.data) +            bb.data.update_data(localdata) +            bb.data.expandKeys(localdata) + +            taskdata = bb.taskdata.TaskData(self.configuration.abort) + +            runlist = [] +            try: +                for k in pkgs_to_build: +                    taskdata.add_provider(localdata, self.status, k) +                    runlist.append([k, "do_%s" % self.configuration.cmd]) +                taskdata.add_unresolved(localdata, self.status) +            except bb.providers.NoProvider: +                sys.exit(1) + +            rq = bb.runqueue.RunQueue() +            rq.prepare_runqueue(self, self.configuration.data, self.status, taskdata, runlist) +            try: +                failures = rq.execute_runqueue(self, self.configuration.data, self.status, taskdata, runlist) +            except runqueue.TaskFailure, fnids: +                for fnid in fnids: +                    bb.msg.error(bb.msg.domain.Build, "'%s' failed" % taskdata.fn_index[fnid]) +                sys.exit(1) +            bb.event.fire(bb.event.BuildCompleted(buildname, pkgs_to_build, self.configuration.event_data, failures)) + +            sys.exit( self.stats.show() ) + +        except KeyboardInterrupt: +            bb.msg.note(1, bb.msg.domain.Collection, "KeyboardInterrupt - Build not completed.") +            sys.exit(1) + +    def get_bbfiles( self, path = os.getcwd() ): +        """Get list of default .bb files by reading out the current directory""" +        contents = os.listdir(path) +        bbfiles = [] +        for f in contents: +            (root, ext) = os.path.splitext(f) +            if ext == ".bb": +                bbfiles.append(os.path.abspath(os.path.join(os.getcwd(),f))) +        return bbfiles + +    def find_bbfiles( self, path ): +        """Find all the .bb files in a directory (uses find)""" +        findcmd = 'find ' + path + ' -name *.bb | grep -v SCCS/' +        try: +            finddata = os.popen(findcmd) +        except OSError: +            return [] +        return finddata.readlines() + +    def collect_bbfiles( self ): +        """Collect all available .bb build files""" +        parsed, cached, skipped, masked = 0, 0, 0, 0 +        self.bb_cache = bb.cache.init(self) + +        files = (data.getVar( "BBFILES", self.configuration.data, 1 ) or "").split() +        data.setVar("BBFILES", " ".join(files), self.configuration.data) + +        if not len(files): +            files = self.get_bbfiles() + +        if not len(files): +            bb.msg.error(bb.msg.domain.Collection, "no files to build.") + +        newfiles = [] +        for f in files: +            if os.path.isdir(f): +                dirfiles = self.find_bbfiles(f) +                if dirfiles: +                    newfiles += dirfiles +                    continue +            newfiles += glob.glob(f) or [ f ] + +        bbmask = bb.data.getVar('BBMASK', self.configuration.data, 1) + +        if not bbmask: +            return (newfiles, 0) + +        try: +            bbmask_compiled = re.compile(bbmask) +        except sre_constants.error: +            bb.msg.fatal(bb.msg.domain.Collection, "BBMASK is not a valid regular expression.") + +        finalfiles = [] +        for i in xrange( len( newfiles ) ): +            f = newfiles[i] +            if bbmask and bbmask_compiled.search(f): +                bb.msg.debug(1, bb.msg.domain.Collection, "skipping masked file %s" % f) +                masked += 1 +                continue +            finalfiles.append(f) + +        return (finalfiles, masked) + +    def parse_bbfiles(self, filelist, masked, progressCallback = None): +        parsed, cached, skipped = 0, 0, 0 +        for i in xrange( len( filelist ) ): +            f = filelist[i] + +            bb.msg.debug(1, bb.msg.domain.Collection, "parsing %s" % f) + +            # read a file's metadata +            try: +                fromCache, skip = self.bb_cache.loadData(f, self.configuration.data) +                if skip: +                    skipped += 1 +                    bb.msg.debug(2, bb.msg.domain.Collection, "skipping %s" % f) +                    self.bb_cache.skip(f) +                    continue +                elif fromCache: cached += 1 +                else: parsed += 1 +                deps = None + +                # Disabled by RP as was no longer functional +                # allow metadata files to add items to BBFILES +                #data.update_data(self.pkgdata[f]) +                #addbbfiles = self.bb_cache.getVar('BBFILES', f, False) or None +                #if addbbfiles: +                #    for aof in addbbfiles.split(): +                #        if not files.count(aof): +                #            if not os.path.isabs(aof): +                #                aof = os.path.join(os.path.dirname(f),aof) +                #            files.append(aof) + +                self.bb_cache.handle_data(f, self.status) + +                # now inform the caller +                if progressCallback is not None: +                    progressCallback( i + 1, len( filelist ), f, fromCache ) + +            except IOError, e: +                self.bb_cache.remove(f) +                bb.msg.error(bb.msg.domain.Collection, "opening %s: %s" % (f, e)) +                pass +            except KeyboardInterrupt: +                self.bb_cache.sync() +                raise +            except Exception, e: +                self.bb_cache.remove(f) +                bb.msg.error(bb.msg.domain.Collection, "%s while parsing %s" % (e, f)) +            except: +                self.bb_cache.remove(f) +                raise + +        if progressCallback is not None: +            print "\r" # need newline after Handling Bitbake files message +            bb.msg.note(1, bb.msg.domain.Collection, "Parsing finished. %d cached, %d parsed, %d skipped, %d masked." % ( cached, parsed, skipped, masked )) + +        self.bb_cache.sync() diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py index 9f7e4be4c8..14f1d896d7 100644 --- a/bitbake/lib/bb/data.py +++ b/bitbake/lib/bb/data.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  """ @@ -18,26 +17,26 @@ to have faster update_data and expandKeys operations.  This is a treade-off between speed and memory again but  the speed is more critical here. - -Copyright (C) 2003, 2004  Chris Larson -Copyright (C) 2005        Holger Hans Peter Freyther - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA.  - -Based on functions from the base bb module, Copyright 2003 Holger Schurig  """ +# Copyright (C) 2003, 2004  Chris Larson +# Copyright (C) 2005        Holger Hans Peter Freyther +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +#Based on functions from the base bb module, Copyright 2003 Holger Schurig +  import sys, os, re, time, types  if sys.argv[0][-5:] == "pydoc":      path = os.path.dirname(os.path.dirname(sys.argv[1])) diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py index d63fdde3ef..ef1e9dda07 100644 --- a/bitbake/lib/bb/data_smart.py +++ b/bitbake/lib/bb/data_smart.py @@ -6,28 +6,28 @@ BitBake Smart Dictionary Implementation  Functions for interacting with the data structure used by the  BitBake build tools. -Copyright (C) 2003, 2004  Chris Larson -Copyright (C) 2004, 2005  Seb Frankengul -Copyright (C) 2005, 2006  Holger Hans Peter Freyther -Copyright (C) 2005        Uli Luckas -Copyright (C) 2005        ROAD GmbH - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA.  - -Based on functions from the base bb module, Copyright 2003 Holger Schurig  """ +# Copyright (C) 2003, 2004  Chris Larson +# Copyright (C) 2004, 2005  Seb Frankengul +# Copyright (C) 2005, 2006  Holger Hans Peter Freyther +# Copyright (C) 2005        Uli Luckas +# Copyright (C) 2005        ROAD GmbH +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# Based on functions from the base bb module, Copyright 2003 Holger Schurig +  import copy, os, re, sys, time, types  import bb  from bb   import utils, methodpool diff --git a/bitbake/lib/bb/event.py b/bitbake/lib/bb/event.py index b1d12177c4..f1da98fd45 100644 --- a/bitbake/lib/bb/event.py +++ b/bitbake/lib/bb/event.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  """ @@ -6,23 +5,23 @@ BitBake 'Event' implementation  Classes and functions for manipulating 'events' in the  BitBake build tools. - -Copyright (C) 2003, 2004  Chris Larson - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA.   """ +# Copyright (C) 2003, 2004  Chris Larson +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +  import os, re  import bb.data  import bb.utils diff --git a/bitbake/lib/bb/fetch/__init__.py b/bitbake/lib/bb/fetch/__init__.py index 3521ece76b..31a4adccb1 100644 --- a/bitbake/lib/bb/fetch/__init__.py +++ b/bitbake/lib/bb/fetch/__init__.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  """ @@ -6,25 +5,25 @@ BitBake 'Fetch' implementations  Classes for obtaining upstream sources for the  BitBake build tools. - -Copyright (C) 2003, 2004  Chris Larson - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA.  - -Based on functions from the base bb module, Copyright 2003 Holger Schurig  """ +# Copyright (C) 2003, 2004  Chris Larson +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Based on functions from the base bb module, Copyright 2003 Holger Schurig +  import os, re  import bb  from   bb import data diff --git a/bitbake/lib/bb/fetch/cvs.py b/bitbake/lib/bb/fetch/cvs.py index 3bdac177eb..bd3317166c 100644 --- a/bitbake/lib/bb/fetch/cvs.py +++ b/bitbake/lib/bb/fetch/cvs.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  """ @@ -7,24 +6,26 @@ BitBake 'Fetch' implementations  Classes for obtaining upstream sources for the  BitBake build tools. -Copyright (C) 2003, 2004  Chris Larson - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA.  - -Based on functions from the base bb module, Copyright 2003 Holger Schurig  """ +# Copyright (C) 2003, 2004  Chris Larson +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +#Based on functions from the base bb module, Copyright 2003 Holger Schurig +# +  import os, re  import bb  from   bb import data @@ -81,6 +82,10 @@ class Cvs(Fetch):          if "localdir" in ud.parm:              localdir = ud.parm["localdir"] +        cvs_port = "" +        if "port" in ud.parm: +            cvs_port = ud.parm["port"] +          cvs_rsh = None          if method == "ext":              if "rsh" in ud.parm: @@ -92,7 +97,7 @@ class Cvs(Fetch):              cvsroot = ":" + method + ":" + ud.user              if ud.pswd:                  cvsroot += ":" + ud.pswd -            cvsroot += "@" + ud.host + ":" + ud.path +            cvsroot += "@" + ud.host + ":" + cvs_port + ud.path          options = []          if ud.date: diff --git a/bitbake/lib/bb/fetch/git.py b/bitbake/lib/bb/fetch/git.py index bb517c9928..c0cd27df09 100644 --- a/bitbake/lib/bb/fetch/git.py +++ b/bitbake/lib/bb/fetch/git.py @@ -1,25 +1,25 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  """  BitBake 'Fetch' git implementation -Copyright (C) 2005 Richard Purdie - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA.   """ +#Copyright (C) 2005 Richard Purdie +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +  import os, re  import bb  from   bb    import data diff --git a/bitbake/lib/bb/fetch/local.py b/bitbake/lib/bb/fetch/local.py index 5224976704..9be8f1ce4b 100644 --- a/bitbake/lib/bb/fetch/local.py +++ b/bitbake/lib/bb/fetch/local.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  """ @@ -7,24 +6,25 @@ BitBake 'Fetch' implementations  Classes for obtaining upstream sources for the  BitBake build tools. -Copyright (C) 2003, 2004  Chris Larson - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA.  - -Based on functions from the base bb module, Copyright 2003 Holger Schurig  """ +# Copyright (C) 2003, 2004  Chris Larson +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Based on functions from the base bb module, Copyright 2003 Holger Schurig +  import os, re  import bb  from   bb import data diff --git a/bitbake/lib/bb/fetch/perforce.py b/bitbake/lib/bb/fetch/perforce.py index 88acf69951..125eb99aa6 100644 --- a/bitbake/lib/bb/fetch/perforce.py +++ b/bitbake/lib/bb/fetch/perforce.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  """ @@ -7,24 +6,25 @@ BitBake 'Fetch' implementations  Classes for obtaining upstream sources for the  BitBake build tools. -Copyright (C) 2003, 2004  Chris Larson - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA. - -Based on functions from the base bb module, Copyright 2003 Holger Schurig  """ +# Copyright (C) 2003, 2004  Chris Larson +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Based on functions from the base bb module, Copyright 2003 Holger Schurig +  import os, re  import bb  from   bb import data diff --git a/bitbake/lib/bb/fetch/ssh.py b/bitbake/lib/bb/fetch/ssh.py index e5f69e33e7..81a9892dcc 100644 --- a/bitbake/lib/bb/fetch/ssh.py +++ b/bitbake/lib/bb/fetch/ssh.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  ''' @@ -11,29 +10,32 @@ IETF secsh internet draft:      Currently does not support the sftp parameters, as this uses scp      Also does not support the 'fingerprint' connection parameter. -Copyright (C) 2006  OpenedHand Ltd. - -Based in part on svk.py: -    Copyright (C) 2006 Holger Hans Peter Freyther -    Based on svn.py: -        Copyright (C) 2003, 2004  Chris Larson -        Based on functions from the base bb module: -            Copyright 2003 Holger Schurig - - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. +''' -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# Copyright (C) 2006  OpenedHand Ltd. +# +# +# Based in part on svk.py: +#    Copyright (C) 2006 Holger Hans Peter Freyther +#    Based on svn.py: +#        Copyright (C) 2003, 2004  Chris Larson +#        Based on functions from the base bb module: +#            Copyright 2003 Holger Schurig +# +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA. -'''  import re, os  import bb  from   bb import data diff --git a/bitbake/lib/bb/fetch/svk.py b/bitbake/lib/bb/fetch/svk.py index 29270ab3d8..d863ccb6e0 100644 --- a/bitbake/lib/bb/fetch/svk.py +++ b/bitbake/lib/bb/fetch/svk.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  """ @@ -6,33 +5,26 @@ BitBake 'Fetch' implementations  This implementation is for svk. It is based on the svn implementation -Copyright (C) 2006 Holger Hans Peter Freyther - -GPL and MIT licensed - - - -Classes for obtaining upstream sources for the -BitBake build tools. - -Copyright (C) 2003, 2004  Chris Larson - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA.  - -Based on functions from the base bb module, Copyright 2003 Holger Schurig  """ +# Copyright (C) 2006 Holger Hans Peter Freyther +# Copyright (C) 2003, 2004  Chris Larson +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Based on functions from the base bb module, Copyright 2003 Holger Schurig +  import os, re  import bb  from   bb import data diff --git a/bitbake/lib/bb/fetch/svn.py b/bitbake/lib/bb/fetch/svn.py index ebd5bebab7..21be1412a6 100644 --- a/bitbake/lib/bb/fetch/svn.py +++ b/bitbake/lib/bb/fetch/svn.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  """ @@ -6,29 +5,29 @@ BitBake 'Fetch' implementations  This implementation is for svn. It is based on the cvs implementation. -Copyright (C) 2004 Marcin Juszkiewicz - -Classes for obtaining upstream sources for the -BitBake build tools. - -Copyright (C) 2003, 2004  Chris Larson - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA.  - -Based on functions from the base bb module, Copyright 2003 Holger Schurig  """ +# Copyright (C) 2004 Marcin Juszkiewicz +# +#   Classes for obtaining upstream sources for the +#   BitBake build tools. +#   Copyright (C) 2003, 2004  Chris Larson +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Based on functions from the base bb module, Copyright 2003 Holger Schurig +  import os, re  import sys  import bb diff --git a/bitbake/lib/bb/fetch/wget.py b/bitbake/lib/bb/fetch/wget.py index 9c9c1675a1..2d590ad0b2 100644 --- a/bitbake/lib/bb/fetch/wget.py +++ b/bitbake/lib/bb/fetch/wget.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  """ @@ -7,24 +6,25 @@ BitBake 'Fetch' implementations  Classes for obtaining upstream sources for the  BitBake build tools. -Copyright (C) 2003, 2004  Chris Larson - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA.  - -Based on functions from the base bb module, Copyright 2003 Holger Schurig  """ +# Copyright (C) 2003, 2004  Chris Larson +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Based on functions from the base bb module, Copyright 2003 Holger Schurig +  import os, re  import bb  from   bb import data diff --git a/bitbake/lib/bb/manifest.py b/bitbake/lib/bb/manifest.py index 30bb454724..4e4b7d98ec 100644 --- a/bitbake/lib/bb/manifest.py +++ b/bitbake/lib/bb/manifest.py @@ -3,18 +3,18 @@  #  # Copyright (C) 2003, 2004  Chris Larson  #  -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. -#  -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -#  -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 59 Temple -# Place, Suite 330, Boston, MA 02111-1307 USA.  +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.  import os, sys  import bb, bb.data diff --git a/bitbake/lib/bb/methodpool.py b/bitbake/lib/bb/methodpool.py index f0565ce790..f43c4a0580 100644 --- a/bitbake/lib/bb/methodpool.py +++ b/bitbake/lib/bb/methodpool.py @@ -3,34 +3,19 @@  #  #  # Copyright (C)       2006 Holger Hans Peter Freyther -# All rights reserved.  # -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation.  # -#   Redistributions of source code must retain the above copyright notice, -#   this list of conditions and the following disclaimer. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details.  # -#   Redistributions in binary form must reproduce the above copyright -#   notice, this list of conditions and the following disclaimer in the -#   documentation and/or other materials provided with the distribution. -# -#   Neither the name Holger Hans Peter Freyther nor the names of its -#   contributors may be used to endorse or promote products derived -#   from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.  """ diff --git a/bitbake/lib/bb/msg.py b/bitbake/lib/bb/msg.py index 473851cc72..bd7729731a 100644 --- a/bitbake/lib/bb/msg.py +++ b/bitbake/lib/bb/msg.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  """ @@ -6,23 +5,23 @@ BitBake 'msg' implementation  Message handling infrastructure for bitbake -# Copyright (C) 2006        Richard Purdie - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA. -  """ +# Copyright (C) 2006        Richard Purdie +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +  import sys, os, re, bb  from bb import utils diff --git a/bitbake/lib/bb/parse/__init__.py b/bitbake/lib/bb/parse/__init__.py index 70fdba03b4..3c9ba8e6da 100644 --- a/bitbake/lib/bb/parse/__init__.py +++ b/bitbake/lib/bb/parse/__init__.py @@ -3,24 +3,26 @@ BitBake Parsers  File parsers for the BitBake build tools. -Copyright (C) 2003, 2004  Chris Larson -Copyright (C) 2003, 2004  Phil Blundell - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +""" -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA. -Based on functions from the base bb module, Copyright 2003 Holger Schurig -""" +# Copyright (C) 2003, 2004  Chris Larson +# Copyright (C) 2003, 2004  Phil Blundell +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Based on functions from the base bb module, Copyright 2003 Holger Schurig  __all__ = [ 'ParseError', 'SkipPackage', 'cached_mtime', 'mark_dependency',              'supports', 'handle', 'init' ] diff --git a/bitbake/lib/bb/parse/parse_py/BBHandler.py b/bitbake/lib/bb/parse/parse_py/BBHandler.py index 42b0369428..2c39316325 100644 --- a/bitbake/lib/bb/parse/parse_py/BBHandler.py +++ b/bitbake/lib/bb/parse/parse_py/BBHandler.py @@ -1,25 +1,29 @@  #!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- -"""class for handling .bb files +""" +   class for handling .bb files     Reads a .bb file and obtains its metadata -   Copyright (C) 2003, 2004  Chris Larson -   Copyright (C) 2003, 2004  Phil Blundell -    -   This program is free software; you can redistribute it and/or modify it under -   the terms of the GNU General Public License as published by the Free Software -   Foundation; either version 2 of the License, or (at your option) any later -   version. -    -   This program is distributed in the hope that it will be useful, but WITHOUT -   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -   FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -    -   You should have received a copy of the GNU General Public License along with -   this program; if not, write to the Free Software Foundation, Inc., 59 Temple -   Place, Suite 330, Boston, MA 02111-1307 USA."""  +""" + + +#  Copyright (C) 2003, 2004  Chris Larson +#  Copyright (C) 2003, 2004  Phil Blundell +#    +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.  import re, bb, os, sys, time  import bb.fetch, bb.build, bb.utils diff --git a/bitbake/lib/bb/parse/parse_py/ConfHandler.py b/bitbake/lib/bb/parse/parse_py/ConfHandler.py index 6c0a8cceaf..1ae673079d 100644 --- a/bitbake/lib/bb/parse/parse_py/ConfHandler.py +++ b/bitbake/lib/bb/parse/parse_py/ConfHandler.py @@ -1,25 +1,28 @@  #!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- -"""class for handling configuration data files +""" +   class for handling configuration data files     Reads a .conf file and obtains its metadata -   Copyright (C) 2003, 2004  Chris Larson -   Copyright (C) 2003, 2004  Phil Blundell -    -   This program is free software; you can redistribute it and/or modify it under -   the terms of the GNU General Public License as published by the Free Software -   Foundation; either version 2 of the License, or (at your option) any later -   version. -    -   This program is distributed in the hope that it will be useful, but WITHOUT -   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -   FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -    -   You should have received a copy of the GNU General Public License along with -   this program; if not, write to the Free Software Foundation, Inc., 59 Temple -   Place, Suite 330, Boston, MA 02111-1307 USA."""  +""" + +# Copyright (C) 2003, 2004  Chris Larson +# Copyright (C) 2003, 2004  Phil Blundell +#  +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.  import re, bb.data, os, sys  from bb.parse import ParseError diff --git a/bitbake/lib/bb/parse/parse_py/__init__.py b/bitbake/lib/bb/parse/parse_py/__init__.py index 6a2ce4059d..9e0e00adda 100644 --- a/bitbake/lib/bb/parse/parse_py/__init__.py +++ b/bitbake/lib/bb/parse/parse_py/__init__.py @@ -6,24 +6,25 @@ BitBake Parsers  File parsers for the BitBake build tools. -Copyright (C) 2003, 2004  Chris Larson -Copyright (C) 2003, 2004  Phil Blundell - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA. - -Based on functions from the base bb module, Copyright 2003 Holger Schurig  """ + +# Copyright (C) 2003, 2004  Chris Larson +# Copyright (C) 2003, 2004  Phil Blundell +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Based on functions from the base bb module, Copyright 2003 Holger Schurig  __version__ = '1.0'  __all__ = [ 'ConfHandler', 'BBHandler'] diff --git a/bitbake/lib/bb/providers.py b/bitbake/lib/bb/providers.py index 3cb7cc1f07..fdd6cd10d1 100644 --- a/bitbake/lib/bb/providers.py +++ b/bitbake/lib/bb/providers.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  # @@ -9,18 +8,18 @@  # Copyright (C) 2005        ROAD GmbH  # Copyright (C) 2006        Richard Purdie  # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later -# version. +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation.  # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details.  # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 59 Temple -# Place, Suite 330, Boston, MA 02111-1307 USA. +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.  import os, re  from bb import data, utils diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py index 4da543ffc8..2ef2670da0 100644 --- a/bitbake/lib/bb/runqueue.py +++ b/bitbake/lib/bb/runqueue.py @@ -5,20 +5,23 @@  BitBake 'RunQueue' implementation  Handles preparation and execution of a queue of tasks - -Copyright (C) 2006  Richard Purdie - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License version 2 as published by the Free  -Software Foundation - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with  """ +# Copyright (C) 2006  Richard Purdie +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +  from bb import msg, data, fetch, event, mkdirhier, utils  from sets import Set   import bb, os, sys @@ -48,7 +51,7 @@ class RunQueue:          taskname = self.runq_task[task]          return "%s, %s" % (fn, taskname) -    def prepare_runqueue(self, cfgData, dataCache, taskData, targets): +    def prepare_runqueue(self, cooker, cfgData, dataCache, taskData, targets):          """          Turn a set of taskData into a RunQueue and compute data needed           to optimise the execution order. @@ -104,9 +107,13 @@ class RunQueue:                          depdata = taskData.build_targets[depid][0]                          if depdata:                              dep = taskData.fn_index[depdata] -                            taskid = taskData.gettask_id(dep, taskname) -                            depends.append(taskid) -                            fnid = taskData.tasks_fnid[taskid] +                            # Need to avoid creating new tasks here +                            taskid = taskData.gettask_id(dep, taskname, False) +                            if taskid: +                                depends.append(taskid) +                                fnid = taskData.tasks_fnid[taskid] +                            else: +                                fnid = taskData.getfn_id(dep)                              for nextdepid in taskData.depids[fnid]:                                  if nextdepid not in dep_seen:                                      add_recursive_build(nextdepid) @@ -127,9 +134,13 @@ class RunQueue:                          depdata = taskData.run_targets[rdepid][0]                          if depdata:                              dep = taskData.fn_index[depdata] -                            taskid = taskData.gettask_id(dep, taskname) -                            depends.append(taskid) -                            fnid = taskData.tasks_fnid[taskid] +                            # Need to avoid creating new tasks here +                            taskid = taskData.gettask_id(dep, taskname, False) +                            if taskid: +                                depends.append(taskid) +                                fnid = taskData.tasks_fnid[taskid] +                            else: +                                fnid = taskData.getfn_id(dep)                              for nextdepid in taskData.depids[fnid]:                                  if nextdepid not in dep_seen:                                      add_recursive_build(nextdepid) @@ -143,11 +154,11 @@ class RunQueue:                  if 'recrdeptask' in task_deps and taskData.tasks_name[task] in task_deps['recrdeptask']:                      dep_seen = []                      rdep_seen = [] -                    taskname = task_deps['recrdeptask'][taskData.tasks_name[task]] -                    for depid in taskData.depids[fnid]: -                        add_recursive_build(depid) -                    for rdepid in taskData.rdepids[fnid]: -                        add_recursive_run(rdepid) +                    for taskname in task_deps['recrdeptask'][taskData.tasks_name[task]].split(): +                        for depid in taskData.depids[fnid]: +                            add_recursive_build(depid) +                        for rdepid in taskData.rdepids[fnid]: +                            add_recursive_run(rdepid)                  #Prune self references                  if task in depends: @@ -188,13 +199,21 @@ class RunQueue:          for target in targets:              targetid = taskData.getbuild_id(target[0]) -            if targetid in taskData.failed_deps: -                continue              if targetid not in taskData.build_targets:                  continue              fnid = taskData.build_targets[targetid][0] + +            # Remove stamps for targets if force mode active +            if cooker.configuration.force: +                fn = taskData.fn_index[fnid] +                bb.msg.note(2, bb.msg.domain.RunQueue, "Remove stamp %s, %s" % (target[1], fn)) +                bb.build.del_stamp(target[1], dataCache, fn) + +            if targetid in taskData.failed_deps: +                continue +              if fnid in taskData.failed_fnids:                  continue @@ -338,10 +357,13 @@ class RunQueue:          bb.msg.note(1, bb.msg.domain.RunQueue, "Executing runqueue") +        active_builds = 0 +        tasks_completed = 0 +        tasks_skipped = 0 +          runq_buildable = []          runq_running = []          runq_complete = [] -        active_builds = 0          build_pids = {}          failed_fnids = [] @@ -405,15 +427,15 @@ class RunQueue:                      fn = taskData.fn_index[self.runq_fnid[task]]                      taskname = self.runq_task[task] -                    if bb.build.stamp_is_current_cache(dataCache, fn, taskname): -                        targetid = taskData.gettask_id(fn, taskname) -                        if not (targetid in taskData.external_targets and cooker.configuration.force): -                            bb.msg.debug(2, bb.msg.domain.RunQueue, "Stamp current task %s (%s)" % (task, self.get_user_idstring(task, taskData))) -                            runq_running[task] = 1 -                            task_complete(self, task) -                            continue +                    if bb.build.stamp_is_current(taskname, dataCache, fn): +                        bb.msg.debug(2, bb.msg.domain.RunQueue, "Stamp current task %s (%s)" % (task, self.get_user_idstring(task, taskData))) +                        runq_running[task] = 1 +                        task_complete(self, task) +                        tasks_completed = tasks_completed + 1 +                        tasks_skipped = tasks_skipped + 1 +                        continue -                    bb.msg.debug(1, bb.msg.domain.RunQueue, "Running task %s (%s)" % (task, self.get_user_idstring(task, taskData))) +                    bb.msg.note(1, bb.msg.domain.RunQueue, "Running task %d of %d (ID: %s, %s)" % (tasks_completed + active_builds + 1, len(self.runq_fnid), task, self.get_user_idstring(task, taskData)))                      try:                           pid = os.fork()                       except OSError, e:  @@ -451,6 +473,7 @@ class RunQueue:                          failed_fnids.append(self.runq_fnid[task])                          break                      task_complete(self, task) +                    tasks_completed = tasks_completed + 1                      del build_pids[result[0]]                      continue                  break @@ -486,6 +509,8 @@ class RunQueue:              if runq_complete[task] == 0:                  bb.msg.error(bb.msg.domain.RunQueue, "Task %s never completed!" % task) +        bb.msg.note(1, bb.msg.domain.RunQueue, "Tasks Summary: Attempted %d tasks of which %d didn't need to be rerun and %d failed." % (tasks_completed, tasks_skipped, len(failed_fnids))) +          return failed_fnids      def dump_data(self, taskQueue): diff --git a/bitbake/lib/bb/shell.py b/bitbake/lib/bb/shell.py index cb8e97b715..32a773064b 100644 --- a/bitbake/lib/bb/shell.py +++ b/bitbake/lib/bb/shell.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python  # ex:ts=4:sw=4:sts=4:et  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  ########################################################################## @@ -6,17 +5,18 @@  # Copyright (C) 2005-2006 Michael 'Mickey' Lauer <mickey@Vanille.de>  # Copyright (C) 2005-2006 Vanille Media  # -# This program is free software; you can redistribute it and/or modify it under -# the terms of the GNU General Public License as published by the Free Software -# Foundation; version 2 of the License. +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation.  # -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details.  # -# You should have received a copy of the GNU General Public License along with -# this program; if not, write to the Free Software Foundation, Inc., 59 Temple -# Place, Suite 330, Boston, MA 02111-1307 USA. +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.  #  ##########################################################################  # @@ -171,7 +171,7 @@ class BitBakeShellCommands:              td.add_unresolved(cooker.configuration.data, cooker.status)              rq = runqueue.RunQueue() -            rq.prepare_runqueue(cooker.configuration.data, cooker.status, td, tasks) +            rq.prepare_runqueue(cooker, cooker.configuration.data, cooker.status, td, tasks)              rq.execute_runqueue(cooker, cooker.configuration.data, cooker.status, td, tasks)          except Providers.NoProvider: @@ -255,6 +255,11 @@ class BitBakeShellCommands:          except parse.ParseError:              print "ERROR: Unable to open or parse '%s'" % bf          else: +            # Remove stamp for target if force mode active +            if cooker.configuration.force: +                bb.msg.note(2, bb.msg.domain.RunQueue, "Remove stamp %s, %s" % (cmd, bf)) +                bb.build.del_stamp('do_%s' % cmd, bbfile_data) +              item = data.getVar('PN', bbfile_data, 1)              data.setVar( "_task_cache", [], bbfile_data ) # force              try: diff --git a/bitbake/lib/bb/taskdata.py b/bitbake/lib/bb/taskdata.py index 181bb5e35b..17d6d95530 100644 --- a/bitbake/lib/bb/taskdata.py +++ b/bitbake/lib/bb/taskdata.py @@ -6,19 +6,23 @@ BitBake 'TaskData' implementation  Task data collection and handling -Copyright (C) 2006  Richard Purdie - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License version 2 as published by the Free  -Software Foundation - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with  """ +# Copyright (C) 2006  Richard Purdie +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +  from bb import data, fetch, event, mkdirhier, utils  import bb, os @@ -86,10 +90,11 @@ class TaskData:          return self.fn_index.index(name) -    def gettask_id(self, fn, task): +    def gettask_id(self, fn, task, create = True):          """          Return an ID number for the task matching fn and task. -        If it doesn't exist, create one. +        If it doesn't exist, create one by default. +        Optionally return None instead.          """          fnid = self.getfn_id(fn) @@ -97,6 +102,9 @@ class TaskData:              if task in self.tasks_lookup[fnid]:                  return self.tasks_lookup[fnid][task] +        if not create: +            return None +          self.tasks_name.append(task)          self.tasks_fnid.append(fnid)          self.tasks_tdepends.append([]) @@ -529,6 +537,7 @@ class TaskData:              bb.msg.debug(1, bb.msg.domain.TaskData, "Resolved " + str(added) + " extra dependecies")              if added == 0:                  break +        # self.dump_data()      def dump_data(self):          """ diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index d7383f44b2..411f43a105 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py @@ -2,23 +2,23 @@  # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-  """  BitBake Utility Functions - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA. - -This file is part of the BitBake build tools.  """ +# Copyright (C) 2004 Michael Lauer +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +  digits = "0123456789"  ascii_letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" | 
