summaryrefslogtreecommitdiff
path: root/bitbake-dev/lib/bb/command.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake-dev/lib/bb/command.py')
-rw-r--r--bitbake-dev/lib/bb/command.py211
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