[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