summaryrefslogtreecommitdiffstats
path: root/src/engine/SCons/Builder.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/SCons/Builder.py')
-rw-r--r--src/engine/SCons/Builder.py100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/engine/SCons/Builder.py b/src/engine/SCons/Builder.py
new file mode 100644
index 0000000..f1ab100
--- /dev/null
+++ b/src/engine/SCons/Builder.py
@@ -0,0 +1,100 @@
+"""SCons.Builder
+
+XXX
+
+"""
+
+__revision__ = "Builder.py __REVISION__ __DATE__ __DEVELOPER__"
+
+
+
+import os
+import SCons.Node.FS
+import types
+
+
+
+class Builder:
+ """Base class for Builders, objects that create output
+ nodes (files) from input nodes (files).
+ """
+
+ def __init__(self, name = None,
+ action = None,
+ input_suffix = None,
+ output_suffix = None,
+ node_class = SCons.Node.FS.File):
+ self.name = name
+ self.action = Action(action)
+ self.insuffix = input_suffix
+ self.outsuffix = output_suffix
+ self.node_class = node_class
+ if not self.insuffix is None and self.insuffix[0] != '.':
+ self.insuffix = '.' + self.insuffix
+ if not self.outsuffix is None and self.outsuffix[0] != '.':
+ self.outsuffix = '.' + self.outsuffix
+
+ def __cmp__(self, other):
+ return cmp(self.__dict__, other.__dict__)
+
+ def __call__(self, env, target = None, source = None):
+ node = SCons.Node.FS.lookup(self.node_class, target)
+ node.builder_set(self)
+ node.env_set(self)
+ node.sources = source # XXX REACHING INTO ANOTHER OBJECT
+ return node
+
+ def execute(self, **kw):
+ """Execute a builder's action to create an output object.
+ """
+ apply(self.action.execute, (), kw)
+
+
+
+print_actions = 1;
+execute_actions = 1;
+
+
+
+def Action(act):
+ """A factory for action objects."""
+ if type(act) == types.FunctionType:
+ return FunctionAction(act)
+ elif type(act) == types.StringType:
+ return CommandAction(act)
+ else:
+ return None
+
+class ActionBase:
+ """Base class for actions that create output objects.
+
+ We currently expect Actions will only be accessible through
+ Builder objects, so they don't yet merit their own module."""
+ def __cmp__(self, other):
+ return cmp(self.__dict__, other.__dict__)
+
+ def show(self, string):
+ print string
+
+class CommandAction(ActionBase):
+ """Class for command-execution actions."""
+ def __init__(self, string):
+ self.command = string
+
+ def execute(self, **kw):
+ cmd = self.command % kw
+ if print_actions:
+ self.show(cmd)
+ if execute_actions:
+ os.system(cmd)
+
+class FunctionAction(ActionBase):
+ """Class for Python function actions."""
+ def __init__(self, function):
+ self.function = function
+
+ def execute(self, **kw):
+ # if print_actions:
+ # XXX: WHAT SHOULD WE PRINT HERE?
+ if execute_actions:
+ self.function(kw)