diff options
Diffstat (limited to 'bitbake-dev/lib/bb/command.py')
| -rw-r--r-- | bitbake-dev/lib/bb/command.py | 211 | 
1 files changed, 211 insertions, 0 deletions
| diff --git a/bitbake-dev/lib/bb/command.py b/bitbake-dev/lib/bb/command.py new file mode 100644 index 0000000000..8384e89e55 --- /dev/null +++ b/bitbake-dev/lib/bb/command.py @@ -0,0 +1,211 @@ +""" +BitBake 'Command' module + +Provide an interface to interact with the bitbake server through 'commands' +""" + +# Copyright (C) 2006-2007  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. + +""" +The bitbake server takes 'commands' from its UI/commandline.  +Commands are either 'online' of 'offline' in nature.  +Offline commands return data to the client in the form of events. +Online commands must only return data through the function return value +and must not trigger events, directly or indirectly. +Commands are queued in a CommandQueue +""" + +import bb + +offline_cmds = {} +online_cmds = {} + +class Command: +    """ +    A queue of 'offline' commands for bitbake +    """ +    def __init__(self, cooker): + +        self.cooker = cooker +        self.cmds_online = CommandsOnline() +        self.cmds_offline = CommandsOffline() + +        # FIXME Add lock for this +        self.currentOfflineCommand = None + +        for attr in CommandsOnline.__dict__: +            command = attr[:].lower() +            method = getattr(CommandsOnline, attr) +            online_cmds[command] = (method) + +        for attr in CommandsOffline.__dict__: +            command = attr[:].lower() +            method = getattr(CommandsOffline, attr) +            offline_cmds[command] = (method) + +    def runCommand(self, commandline): +        try: +            command = commandline.pop(0) +            if command in CommandsOnline.__dict__: +                # Can run online commands straight away             +                return getattr(CommandsOnline, command)(self.cmds_online, self, commandline) +            if self.currentOfflineCommand is not None: +                return "Busy (%s in progress)" % self.currentOfflineCommand[0] +            if command not in CommandsOffline.__dict__: +                return "No such command" +            self.currentOfflineCommand = (command, commandline) +            return True +        except: +            import traceback +            return traceback.format_exc() + +    def runOfflineCommand(self): +        try: +            if self.currentOfflineCommand is not None: +                (command, options) = self.currentOfflineCommand +                getattr(CommandsOffline, command)(self.cmds_offline, self, options) +        except: +            import traceback +            self.finishOfflineCommand(traceback.format_exc()) + +    def finishOfflineCommand(self, error = None): +        if error: +            bb.event.fire(bb.command.CookerCommandFailed(self.cooker.configuration.event_data, error)) +        else: +            bb.event.fire(bb.command.CookerCommandCompleted(self.cooker.configuration.event_data)) +        self.currentOfflineCommand = None + + +class CommandsOnline: +    """ +    A class of online commands +    These should run quickly so as not to hurt interactive performance. +    These must not influence any running offline command. +    """ + +    def stateShutdown(self, command, params): +        """ +        Trigger cooker 'shutdown' mode +        """ +        command.cooker.cookerAction = bb.cooker.cookerShutdown + +    def stateStop(self, command, params): +        """ +        Stop the cooker +        """ +        command.cooker.cookerAction = bb.cooker.cookerStop + +    def getCmdLineAction(self, command, params): +        """ +        Get any command parsed from the commandline +        """ +        return command.cooker.commandlineAction + +    def readVariable(self, command, params): +        """ +        Read the value of a variable from configuration.data +        """ +        varname = params[0] +        expand = True +        if len(params) > 1: +            expand = params[1] + +        return bb.data.getVar(varname, command.cooker.configuration.data, expand) + +class CommandsOffline: +    """ +    A class of offline commands +    These functions communicate via generated events. +    Any function that requires metadata parsing should be here. +    """ + +    def buildFile(self, command, params): +        """ +        Build a single specified .bb file +        """ +        bfile = params[0] +        task = params[1] + +        command.cooker.buildFile(bfile, task) + +    def buildTargets(self, command, params): +        """ +        Build a set of targets +        """ +        pkgs_to_build = params[0] + +        command.cooker.buildTargets(pkgs_to_build) + +    def generateDepTreeEvent(self, command, params): +        """ +        Generate an event containing the dependency information +        """ +        pkgs_to_build = params[0] + +        command.cooker.generateDepTreeEvent(pkgs_to_build) +        command.finishOfflineCommand() + +    def generateDotGraph(self, command, params): +        """ +        Dump dependency information to disk as .dot files +        """ +        pkgs_to_build = params[0] + +        command.cooker.generateDotGraphFiles(pkgs_to_build) +        command.finishOfflineCommand() + +    def showVersions(self, command, params): +        """ +        Show the currently selected versions +        """ +        command.cooker.showVersions() +        command.finishOfflineCommand() + +    def showEnvironment(self, command, params): +        """ +        Print the environment +        """ +        bfile = params[0] +        pkg = params[1] + +        command.cooker.showEnvironment(bfile, pkg) +        command.finishOfflineCommand() + +    def parseFiles(self, command, params): +        """ +        Parse the .bb files +        """ +        command.cooker.updateCache() +        command.finishOfflineCommand() + +# +# Events +# +class CookerCommandCompleted(bb.event.Event): +    """ +    Cooker command completed +    """ +    def  __init__(self, data): +        bb.event.Event.__init__(self, data) + + +class CookerCommandFailed(bb.event.Event): +    """ +    Cooker command completed +    """ +    def  __init__(self, data, error): +        bb.event.Event.__init__(self, data) +        self.error = error | 
