aboutsummaryrefslogtreecommitdiff
path: root/scripts/buildbot.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/buildbot.py')
-rwxr-xr-xscripts/buildbot.py152
1 files changed, 152 insertions, 0 deletions
diff --git a/scripts/buildbot.py b/scripts/buildbot.py
new file mode 100755
index 000000000000..0c04d9c4be82
--- /dev/null
+++ b/scripts/buildbot.py
@@ -0,0 +1,152 @@
+#!/usr/bin/env python
+
+import argparse
+import os
+import os.path
+import shutil
+import subprocess
+import sys
+
+class BuildError(Exception):
+ def __init__(self,
+ string=None,
+ path=None,
+ inferior_error=None):
+ self.m_string = string
+ self.m_path = path
+ self.m_inferior_error = inferior_error
+ def __str__(self):
+ if self.m_path and self.m_string:
+ return "Build error: %s (referring to %s)" % (self.m_string, self.m_path)
+ if self.m_path:
+ return "Build error (referring to %s)" % (self.m_path)
+ if self.m_string:
+ return "Build error: %s" % (self.m_string)
+ return "Build error"
+
+class LLDBBuildBot:
+ def __init__(self,
+ build_directory_path,
+ log_path,
+ lldb_repository_url="http://llvm.org/svn/llvm-project/lldb/trunk",
+ llvm_repository_url="http://llvm.org/svn/llvm-project/llvm/trunk",
+ clang_repository_url="http://llvm.org/svn/llvm-project/cfe/trunk",
+ revision=None):
+ self.m_build_directory_path = os.path.abspath(build_directory_path)
+ self.m_log_path = os.path.abspath(log_path)
+ self.m_lldb_repository_url = lldb_repository_url
+ self.m_llvm_repository_url = llvm_repository_url
+ self.m_clang_repository_url = clang_repository_url
+ self.m_revision = revision
+ self.m_log_stream = None
+ def Setup(self):
+ if os.path.exists(self.m_build_directory_path):
+ raise BuildError(string="Build directory exists", path=self.m_build_directory_path)
+ if os.path.exists(self.m_log_path):
+ raise BuildError(string="Log file exists", path=self.m_log_path)
+ self.m_log_stream = open(self.m_log_path, 'w')
+ os.mkdir(self.m_build_directory_path)
+ def Checkout(self):
+ os.chdir(self.m_build_directory_path)
+
+ cmdline_prefix = []
+
+ if self.m_revision != None:
+ cmdline_prefix = ["svn", "-r %s" % (self.m_revision), "co"]
+ else:
+ cmdline_prefix = ["svn", "co"]
+
+ returncode = subprocess.call(cmdline_prefix + [self.m_lldb_repository_url, "lldb"],
+ stdout=self.m_log_stream,
+ stderr=self.m_log_stream)
+ if returncode != 0:
+ raise BuildError(string="Couldn't checkout LLDB")
+
+ os.chdir("lldb")
+
+ returncode = subprocess.call(cmdline_prefix + [self.m_llvm_repository_url, "llvm.checkout"],
+ stdout=self.m_log_stream,
+ stderr=self.m_log_stream)
+
+ if returncode != 0:
+ raise BuildError(string="Couldn't checkout LLVM")
+
+ os.symlink("llvm.checkout", "llvm")
+
+ os.chdir("llvm/tools")
+
+ returncode = subprocess.call(cmdline_prefix + [self.m_clang_repository_url, "clang"],
+ stdout=self.m_log_stream,
+ stderr=self.m_log_stream)
+
+ if returncode != 0:
+ raise BuildError(string="Couldn't checkout Clang")
+ def Build(self):
+ os.chdir(self.m_build_directory_path)
+ os.chdir("lldb/llvm")
+
+ returncode = subprocess.call(["./configure", "--disable-optimized", "--enable-assertions", "--enable-targets=x86,x86_64,arm"],
+ stdout=self.m_log_stream,
+ stderr=self.m_log_stream)
+
+ if returncode != 0:
+ raise BuildError(string="Couldn't configure LLVM/Clang")
+
+ returncode = subprocess.call(["make"],
+ stdout=self.m_log_stream,
+ stderr=self.m_log_stream)
+
+ if returncode != 0:
+ raise BuildError(string="Couldn't build LLVM/Clang")
+
+ os.chdir(self.m_build_directory_path)
+ os.chdir("lldb")
+
+ returncode = subprocess.call(["xcodebuild",
+ "-project", "lldb.xcodeproj",
+ "-target", "lldb-tool",
+ "-configuration", "Debug",
+ "-arch", "x86_64",
+ "LLVM_CONFIGURATION=Debug+Asserts",
+ "OBJROOT=build"],
+ stdout=self.m_log_stream,
+ stderr=self.m_log_stream)
+
+ if returncode != 0:
+ raise BuildError(string="Couldn't build LLDB")
+ def Test(self):
+ os.chdir(self.m_build_directory_path)
+ os.chdir("lldb/test")
+
+ returncode = subprocess.call(["./dotest.py", "-t"],
+ stdout=self.m_log_stream,
+ stderr=self.m_log_stream)
+ def Takedown(self):
+ os.chdir("/tmp")
+ self.m_log_stream.close()
+ shutil.rmtree(self.m_build_directory_path)
+ def Run(self):
+ self.Setup()
+ self.Checkout()
+ self.Build()
+ #self.Test()
+ self.Takedown()
+
+def GetArgParser():
+ parser = argparse.ArgumentParser(description="Try to build LLDB/LLVM/Clang and run the full test suite.")
+ parser.add_argument("--build-path", "-b", required=True, help="A (nonexistent) path to put temporary build products into", metavar="path")
+ parser.add_argument("--log-file", "-l", required=True, help="The name of a (nonexistent) log file", metavar="file")
+ parser.add_argument("--revision", "-r", required=False, help="The LLVM revision to use", metavar="N")
+ return parser
+
+parser = GetArgParser()
+arg_dict = vars(parser.parse_args())
+
+build_bot = LLDBBuildBot(build_directory_path=arg_dict["build_path"],
+ log_path=arg_dict["log_file"],
+ revision=arg_dict["revision"])
+
+try:
+ build_bot.Run()
+except BuildError as err:
+ print err