blob: 08c89f2a0c841f4f620417c6c718b90f7767fe08 [file] [log] [blame]
import buildbot
from buildbot.steps.source import SVN
from buildbot.steps.shell import Configure, WarningCountingShellCommand
from buildbot.steps.shell import ShellCommand, SetProperty
from buildbot.process.properties import WithProperties
from zorg.buildbot.commands.LitTestCommand import LitTestCommand
from Util import getConfigArgs
def getLLVMGCCBuildFactory(jobs='%(jobs)s', update=True, clean=True,
gxxincludedir=None,
triple=None, build=None, host=None, target=None,
useTwoStage=True, stage1_config='Release+Asserts',
stage2_config='Release+Asserts', make='make',
extra_configure_args=[], extra_languages=None,
verbose=False, env = {}, defaultBranch='trunk',
timeout=20, package_dst=None):
if build or host or target:
if not build or not host or not target:
raise ValueError,"Must specify all of 'build', 'host', 'target' if used."
if triple:
raise ValueError,"Cannot specify 'triple' and 'build', 'host', 'target' options."
elif triple:
build = host = target = triple
# Prepare environmental variables. Set here all env we want everywhere.
merged_env = {
'TERM' : 'dumb' # Make sure Clang doesn't use color escape sequences.
}
if env is not None:
merged_env.update(env) # Overwrite pre-set items with the given ones, so user can set anything.
f = buildbot.process.factory.BuildFactory()
# Determine the build directory.
f.addStep(buildbot.steps.shell.SetProperty(name="get_builddir",
command=["pwd"],
property = "builddir",
description = "set build dir",
workdir = ".",
env = merged_env))
# Get the sources.
if update:
f.addStep(SVN(name='svn-llvm',
mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm/',
defaultBranch = defaultBranch,
workdir = "llvm.src"))
f.addStep(SVN(name='svn-llvm-gcc',
mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm-gcc-4.2/',
defaultBranch = defaultBranch,
workdir = "llvm-gcc.src"))
# Clean up llvm (stage 1).
if clean:
f.addStep(ShellCommand(name="rm-llvm.obj.stage1",
command=["rm", "-rf", "llvm.obj"],
haltOnFailure = True,
description = ["rm build dir",
"llvm",
"(stage 1)"],
workdir = ".",
env = merged_env))
# Configure llvm (stage 1).
base_llvm_configure_args = [WithProperties("%(builddir)s/llvm.src/configure")]
if build:
base_llvm_configure_args.append('--build=' + build)
base_llvm_configure_args.append('--host=' + host)
base_llvm_configure_args.append('--target=' + target)
stage_configure_args = getConfigArgs(stage1_config)
f.addStep(Configure(name='configure.llvm.stage1',
command=base_llvm_configure_args +
stage_configure_args +
["--without-llvmgcc",
"--without-llvmgxx"],
description = [ "configure",
"llvm",
"(stage 1)",
stage1_config ],
workdir = "llvm.obj",
env = merged_env))
# Build llvm (stage 1).
base_llvm_make_args = ['nice', '-n', '10',
make, WithProperties("-j%s" % jobs)]
if verbose:
base_llvm_make_args.append('VERBOSE=1')
f.addStep(WarningCountingShellCommand(name = "compile.llvm.stage1",
command = base_llvm_make_args,
haltOnFailure = True,
description = ["compile",
"llvm",
"(stage 1)",
stage1_config],
workdir = "llvm.obj",
env = merged_env,
timeout = timeout * 60))
# Run LLVM tests (stage 1).
f.addStep(LitTestCommand(name = 'test.llvm.stage1',
command = [make, "check-lit", "VERBOSE=1"],
description = ["testing", "llvm"],
descriptionDone = ["test", "llvm"],
workdir = 'llvm.obj',
env = merged_env))
# Clean up llvm-gcc.
if clean:
f.addStep(ShellCommand(name="rm-llvm-gcc.obj.stage1",
command=["rm", "-rf", "llvm-gcc.obj"],
haltOnFailure = True,
description = ["rm build dir",
"llvm-gcc"],
workdir = ".",
env = merged_env))
# Configure llvm-gcc.
base_llvmgcc_configure_args = ["../llvm-gcc.src/configure"]
llvmgcc_languages = "--enable-languages=c,c++"
if extra_languages:
llvmgcc_languages = llvmgcc_languages + "," + extra_languages
base_llvmgcc_configure_args.append(llvmgcc_languages)
if gxxincludedir:
base_llvmgcc_configure_args.append('--with-gxx-include-dir=' + gxxincludedir)
base_llvmgcc_configure_args.extend(extra_configure_args)
if build:
base_llvmgcc_configure_args.append('--build=' + build)
base_llvmgcc_configure_args.append('--host=' + host)
base_llvmgcc_configure_args.append('--target=' + target)
f.addStep(Configure(name='configure.llvm-gcc.stage1',
command=(base_llvmgcc_configure_args +
["--program-prefix=llvm-",
WithProperties("--prefix=%(builddir)s/llvm-gcc.install"),
WithProperties("--enable-llvm=%(builddir)s/llvm.obj")]),
haltOnFailure = True,
description = ["configure",
"llvm-gcc",
"(stage 1)"],
workdir = "llvm-gcc.obj",
env = merged_env))
# Build llvm-gcc.
f.addStep(WarningCountingShellCommand(name="compile.llvm-gcc.stage1",
command=['nice', '-n', '10',
make, WithProperties("-j%s" % jobs)],
haltOnFailure = True,
description = ["compile",
"llvm-gcc"],
workdir = "llvm-gcc.obj",
env = merged_env,
timeout = timeout * 60))
# Clean up llvm-gcc install.
if clean:
f.addStep(ShellCommand(name="rm-llvm-gcc.install.stage1",
command=["rm", "-rf", "llvm-gcc.install"],
haltOnFailure = True,
description = ["rm install dir",
"llvm-gcc"],
workdir = ".",
env = merged_env))
# Install llvm-gcc.
f.addStep(WarningCountingShellCommand(name="install.llvm-gcc.stage1",
command=['nice', '-n', '10',
make, 'install'],
haltOnFailure = True,
description = ["install",
"llvm-gcc"],
workdir = "llvm-gcc.obj",
env = merged_env))
# We are done if not doing a two-stage build.
if not useTwoStage:
return f
# Clean up llvm (stage 2).
if clean:
f.addStep(ShellCommand(name="rm-llvm.obj.stage2",
command=["rm", "-rf", "llvm.obj.2"],
haltOnFailure = True,
description = ["rm build dir",
"llvm",
"(stage 2)"],
workdir = ".",
env = merged_env))
# Configure llvm (stage 2).
stage_configure_args = getConfigArgs(stage2_config)
local_env = dict(merged_env)
local_env['CC'] = WithProperties("%(builddir)s/llvm-gcc.install/bin/llvm-gcc")
local_env['CXX'] = WithProperties("%(builddir)s/llvm-gcc.install/bin/llvm-g++")
f.addStep(Configure(name="configure.llvm.stage2",
command=base_llvm_configure_args +
stage_configure_args +
[WithProperties("--with-llvmgcc=%(builddir)s/llvm-gcc.install/bin/llvm-gcc"),
WithProperties("--with-llvmgxx=%(builddir)s/llvm-gcc.install/bin/llvm-g++")],
haltOnFailure = True,
description = ["configure",
"llvm",
"(stage 2)",
stage2_config],
workdir = "llvm.obj.2",
env = local_env))
# Build LLVM (stage 2).
f.addStep(WarningCountingShellCommand(name = "compile.llvm.stage2",
command = base_llvm_make_args,
haltOnFailure = True,
description = ["compile",
"llvm",
"(stage 2)",
stage2_config],
workdir = "llvm.obj.2",
env = merged_env,
timeout = timeout * 60))
# Run LLVM tests (stage 2).
f.addStep(LitTestCommand(name = 'test.llvm.stage2',
command = [make, "check-lit", "VERBOSE=1"],
description = ["testing", "llvm", "(stage 2)"],
descriptionDone = ["test", "llvm", "(stage 2)"],
workdir = 'llvm.obj.2',
env = merged_env))
# Clean up llvm-gcc (stage 2).
if clean:
f.addStep(ShellCommand(name="rm-llvm-gcc.obj.stage2",
command=["rm", "-rf", "llvm-gcc.obj.2"],
haltOnFailure = True,
description = ["rm build dir",
"llvm-gcc",
"(stage 2)"],
workdir = ".",
env = merged_env))
# Configure llvm-gcc (stage 2).
local_env = dict(merged_env)
local_env['CC'] = WithProperties("%(builddir)s/llvm-gcc.install/bin/llvm-gcc")
local_env['CXX'] = WithProperties("%(builddir)s/llvm-gcc.install/bin/llvm-g++")
f.addStep(Configure(name = 'configure.llvm-gcc.stage2',
command=base_llvmgcc_configure_args + [
"--program-prefix=llvm.2-",
WithProperties("--prefix=%(builddir)s/llvm-gcc.install.2"),
WithProperties("--enable-llvm=%(builddir)s/llvm.obj.2")],
haltOnFailure = True,
description = ["configure",
"llvm-gcc",
"(stage 2)"],
workdir = "llvm-gcc.obj.2",
env = local_env))
# Build llvm-gcc (stage 2).
f.addStep(WarningCountingShellCommand(name="compile.llvm-gcc.stage2",
command=['nice', '-n', '10',
make, WithProperties("-j%s" % jobs)],
haltOnFailure = True,
description = ["compile",
"llvm-gcc",
"(stage 2)"],
workdir = "llvm-gcc.obj.2",
env = merged_env,
timeout = timeout * 60))
# Clean up llvm-gcc install (stage 2).
if clean:
f.addStep(ShellCommand(name="rm-llvm-gcc.install.stage2",
command=["rm", "-rf", "llvm-gcc.install.2"],
haltOnFailure = True,
description = ["rm install dir",
"llvm-gcc",
"(stage 2)"],
workdir = ".",
env = merged_env))
# Install llvm-gcc.
f.addStep(WarningCountingShellCommand(name="install.llvm-gcc.stage2",
command = ['nice', '-n', '10',
make, 'install'],
haltOnFailure = True,
description = ["install",
"llvm-gcc",
"(stage 2)"],
workdir = "llvm-gcc.obj.2",
env = merged_env))
if package_dst:
addPackageStep(f, package_dst, obj_path = 'llvm-gcc.install.2', env = merged_env)
return f
import os
def addPackageStep(f, package_dst,
obj_path,
info_string = '%(phase_id)s',
env = {}):
# Package and upload.
name = WithProperties(
os.path.join("%(builddir)s", obj_path,
"llvm-gcc-%s.tar.gz" % info_string))
f.addStep(ShellCommand(name = 'pkg.tar',
description = "tar root",
command = ["tar", "zcvf", name, "./"],
workdir = obj_path,
env = env,
warnOnFailure = True,
flunkOnFailure = False,
haltOnFailure = False))
f.addStep(ShellCommand(name = 'pkg.upload',
description = "upload root",
command = ["scp", name, package_dst],
workdir = ".",
env = env,
warnOnFailure = True,
flunkOnFailure = False,
haltOnFailure = False))