[cig-commits] r6977 - cs/buildbot/trunk/buildbot

leif at geodynamics.org leif at geodynamics.org
Fri May 25 17:55:01 PDT 2007


Author: leif
Date: 2007-05-25 17:55:01 -0700 (Fri, 25 May 2007)
New Revision: 6977

Added:
   cs/buildbot/trunk/buildbot/bs.py
Modified:
   cs/buildbot/trunk/buildbot/config.py
   cs/buildbot/trunk/buildbot/lines.py
   cs/buildbot/trunk/buildbot/projects.py
Log:
Added the concept of a BuildSystem, to handle all the various build
systems we have to deal with.  I guess BuildSystem is a bit redundant,
since there is already a BuildFactory, and each build system could
almost be represented by a BuildFactory prototype.  (Here, as I often
do, I found myself implementing singleton classes merely to get
polymorphic plug-in behavior, which got be thinking about the Self
language, but nevermind...)

I forgot to mention that I commented-out most of BuildBot's
pickle/unpickle stuff, because I've written stuff which is
unpickleable.  It seems to work fine without it.


Added: cs/buildbot/trunk/buildbot/bs.py
===================================================================
--- cs/buildbot/trunk/buildbot/bs.py	2007-05-26 00:29:14 UTC (rev 6976)
+++ cs/buildbot/trunk/buildbot/bs.py	2007-05-26 00:55:01 UTC (rev 6977)
@@ -0,0 +1,180 @@
+
+
+from buildbot.process import step
+from buildbot.process.factory import s
+        
+
+class BuildSystem(object): # BuildFactory?
+
+    def buildSteps(self, buildEnv, config, env, workdir, line):
+        raise NotImplementedError()
+
+    def configureArgs(self, buildEnv, config, env, line):
+        args = (
+            buildEnv.getConfigureArgs(self, env, config) +
+            line.configureArgs +
+            line.project.configureArgs[self]
+            )
+        return args
+
+
+class Make(BuildSystem):
+    """simply runs 'make'"""
+
+    def buildSteps(self, buildEnv, config, env, workdir, line):
+        steps = [
+            s(step.Compile,
+              command="make all",
+              haltOnFailure=True),
+            ]
+        return steps
+
+make = Make()
+
+
+class GNUBuildSystem(BuildSystem): # a.k.a. Autotools
+
+
+    def buildSteps(self, buildEnv, config, env, workdir, line):
+        
+        configureArgs = self.configureArgs(buildEnv, config, env, line)
+        
+        steps = [
+            s(step.ShellCommand,
+              description=["autoreconf"],
+              command=["autoreconf", "-i"],
+              workdir=workdir,
+              env=env,
+              haltOnFailure=True,
+              ),
+            s(step.ShellCommand,
+              description=["configure"],
+              command=["./configure"] + configureArgs,
+              workdir=workdir,
+              env=env,
+              haltOnFailure=True,
+              logfiles={"config.log": "config.log"},
+              ),
+
+            # This should do "make distcheck" at some point.
+            # Unfortunately, the egg system breaks "distcheck" because
+            # it writes to 'srcdir'.
+            
+            s(step.Compile,
+              description=["compiling"],
+              descriptionDone=["compile"],
+              command=["make"],
+              workdir=workdir,
+              env=env,
+              ),
+            s(step.Compile,
+              description=["installing"],
+              descriptionDone=["installation"],
+              command=["make", "install"],
+              workdir=workdir,
+              env=env,
+              ),
+            s(step.Compile,
+              description=["testing"],
+              descriptionDone=["tests"],
+              command=["make", "check"],
+              workdir=workdir,
+              env=env,
+              haltOnFailure=False,
+              ),
+            ]
+        
+        return steps
+
+gnu = GNUBuildSystem()
+
+
+class SCons(BuildSystem):
+
+
+    def buildSteps(self, buildEnv, config, env, workdir, line):
+        
+        configureArgs = self.configureArgs(buildEnv, config, env, line)
+        
+        steps = [
+            s(step.ShellCommand,
+              description=["configure"],
+              command=["./configure.py", configureArgs],
+              haltOnFailure=True,
+              ),
+            s(step.ShellCommand,
+              description=["testing"],
+              descriptionDone=["tests"],
+              command=["./scons/scons.py", "test"],
+              ),
+            ]
+        
+        return steps
+
+scons = SCons()
+
+
+class Distutils(BuildSystem):
+
+    def buildSteps(self, buildEnv, config, env, workdir, line):
+        steps = [
+            s(step.Compile,
+              command=["./setup.py", "build"],
+              workdir=workdir,
+              ),
+            ]
+        return steps
+
+distutils = Distutils()
+
+
+class ASEBuildSystem(BuildSystem):
+    """ANL SIDL Environment (ASE) BuildSystem (used by PETSc)"""
+
+    def buildSteps(self, buildEnv, config, env, workdir, line):
+
+        configureArgs = self.configureArgs(buildEnv, config, env, line)
+        
+        steps = [
+            s(step.ShellCommand,
+              description=["configure"],
+              command=["./config/configure.py"] + configureArgs,
+              workdir=workdir,
+              env=env,
+              haltOnFailure=True,
+              logfiles={"configure.log": "configure.log"},
+              ),
+            s(step.Compile,
+              description=["compiling"],
+              descriptionDone=["compile"],
+              command=["make"],
+              workdir=workdir,
+              env=env,
+              ),
+            s(step.Compile,
+              description=["installing"],
+              descriptionDone=["installation"],
+              command=["make", "install"],
+              workdir=workdir,
+              env=env,
+              ),
+            ]
+        
+        return steps
+
+ase = ASEBuildSystem()
+
+
+class DebugBuildSystem(BuildSystem):
+    """for debugging BuildBot"""
+
+    def buildSteps(self, buildEnv, config, env, workdir, line):
+        steps = [
+            s(step.Compile,
+              command=["./setup.py", "build"],
+              workdir=workdir,
+              ),
+            ]
+        return steps
+
+debug = DebugBuildSystem()

Modified: cs/buildbot/trunk/buildbot/config.py
===================================================================
--- cs/buildbot/trunk/buildbot/config.py	2007-05-26 00:29:14 UTC (rev 6976)
+++ cs/buildbot/trunk/buildbot/config.py	2007-05-26 00:55:01 UTC (rev 6977)
@@ -1,12 +1,12 @@
 
 
 class BuildConfig(object):
-    def __init__(self, name, configureArgs, env):
+    def __init__(self, name, env):
         self.name = name
-        self.configureArgs = configureArgs
         self.env = env
+        self.configureArgs = {}
 
-defaultConfigs = [BuildConfig("default", [], {"PYTHON": "python2.3"})]
+defaultConfigs = [BuildConfig("default", {"PYTHON": "python2.3"})]
 
 
 class BuildSlave(object):
@@ -55,13 +55,16 @@
     def configFilename(self, config):
         return self.configName(config).replace(' ', '_')
 
-    def getConfigureArgs(self, env, config):
-        args = [
-            "--prefix=%(PREFIX)s" % env,
-            "LDFLAGS=-L%(PREFIX)s/lib -L%(DEPS_PREFIX)s/lib" % env,
-            "CPPFLAGS=-I%(PREFIX)s/include -I%(DEPS_PREFIX)s/include" % env,
-            ]
-        return args + config.configureArgs
+    def getConfigureArgs(self, bs, env, config):
+        from buildbot.bs import gnu, scons, ase
+        args = {
+            gnu: [
+                "--prefix=%(PREFIX)s" % env,
+                "LDFLAGS=-L%(PREFIX)s/lib -L%(DEPS_PREFIX)s/lib" % env,
+                "CPPFLAGS=-I%(PREFIX)s/include -I%(DEPS_PREFIX)s/include" % env,
+                ]
+            }
+        return args.get(bs, []) + config.configureArgs.get(bs, [])
 
 
 class Config(object):

Modified: cs/buildbot/trunk/buildbot/lines.py
===================================================================
--- cs/buildbot/trunk/buildbot/lines.py	2007-05-26 00:29:14 UTC (rev 6976)
+++ cs/buildbot/trunk/buildbot/lines.py	2007-05-26 00:55:01 UTC (rev 6977)
@@ -11,13 +11,16 @@
     def __init__(self, name, location, project):
         self.name = name
         self.location = location
+        
         ## cPickle.UnpickleableError: Cannot pickle <type 'weakproxy'> objects
-        #self.project = weakref.proxy(project)
-        self.project = project
+        self.project = weakref.proxy(project)
         
         self.configureArgs = []
+        
         self.dependencies = []
         self.scheduler = None
+
+        self._buildSystem = None
         
         return
 
@@ -40,14 +43,7 @@
 
 
     def newBuildFactory(self, buildEnv, config, env):
-        if True:
-            steps = self.debugSteps()
-        else:
-            ## proj-specific
-            #steps.extend(depsSteps(buildEnv, config))
-
-            steps = self.buildSteps(buildEnv, config, env)
-
+        steps = self.buildSteps(buildEnv, config, env)
         return BuildFactory(steps)
 
 
@@ -56,82 +52,35 @@
         return self.location.sourceStep(**kwds)
 
 
+    def buildSystem(self):
+        if self._buildSystem is None:
+            return self.project.defaultBuildSystem
+        return self._buildSystem
+
+
+    def setBuildSystem(self, bs):
+        self._buildSystem = bs
+
+
     def buildSteps(self, buildEnv, config, env):
         from buildbot.process import step
         from buildbot.process.factory import s
 
         workdir = "build"
         
-        configureArgs = buildEnv.getConfigureArgs(env, config) + self.configureArgs
-        
         sourceStep = self.sourceStep(
             workdir = workdir,
             mode = 'copy', # 'clobber', 'copy', 'update'
             )
 
-        steps = [
-            sourceStep,
-            
-            s(step.ShellCommand,
-              description=["autoreconf"],
-              command=["autoreconf", "-i"],
-              workdir=workdir,
-              env=env,
-              haltOnFailure=True,
-              ),
-            s(step.ShellCommand,
-              description=["configure"],
-              command=["./configure"] + configureArgs,
-              workdir=workdir,
-              env=env,
-              haltOnFailure=True,
-              logfiles={"config.log": "config.log"},
-              ),
-            s(step.Compile,
-              description=["compiling"],
-              descriptionDone=["compile"],
-              command=["make"],
-              workdir=workdir,
-              env=env,
-              ),
-            s(step.Compile,
-              description=["installing"],
-              descriptionDone=["installation"],
-              command=["make", "install"],
-              workdir=workdir,
-              env=env,
-              ),
-            s(step.Compile,
-              description=["testing"],
-              descriptionDone=["tests"],
-              command=["make", "check"],
-              workdir=workdir,
-              env=env,
-              haltOnFailure=False,
-              ),
-            ]
-        return steps
-
-
-    def debugSteps(self):
-        from buildbot.process import step
-        from buildbot.process.factory import s
-        
-        workdir = "build"
-        
-        sourceStep = self.sourceStep(
-            workdir = workdir,
-            mode = 'clobber', # 'clobber', 'copy', 'update'
+        buildSystem = self.buildSystem()
+        buildSteps = buildSystem.buildSteps(
+            buildEnv, config, env,
+            workdir, self
             )
 
-        steps = [
-            sourceStep,
+        steps = [sourceStep] + buildSteps
             
-            s(step.Compile,
-              command=["./setup.py", "build"],
-              workdir=workdir,
-              ),
-            ]
         return steps
 
 

Modified: cs/buildbot/trunk/buildbot/projects.py
===================================================================
--- cs/buildbot/trunk/buildbot/projects.py	2007-05-26 00:29:14 UTC (rev 6976)
+++ cs/buildbot/trunk/buildbot/projects.py	2007-05-26 00:55:01 UTC (rev 6977)
@@ -1,6 +1,7 @@
 
 
 from buildbot import util
+from buildbot.bs import gnu
 from buildbot.lines import Trunk, Branch
 
 
@@ -10,15 +11,21 @@
     compare_attrs = ['name', 'url']
 
 
-    def __init__(self, name, url=None, branches=None, owners=None):
+    def __init__(self, name, url=None, branches=None, owners=None, bs=None):
         self.name = name
         self.url = url
         self.branches = branches
         self.owners = owners
+        self.defaultBuildSystem = bs
         
+        self.configureArgs = {}
+
         if self.owners is None:
             self.owners = []
 
+        if self.defaultBuildSystem is None:
+            self.defaultBuildSystem = gnu
+
         return
 
 



More information about the cig-commits mailing list