| #!/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 |