78 lines · python
1import argparse2import os3import sys4 5from subprocess import call, check_call, CalledProcessError6from time import sleep7from typing import List, Tuple8 9 10def main():11 settings, rest = parse_arguments()12 cmake_opts = ["-D" + cmd for cmd in settings.D]13 if settings.wait:14 wait()15 if settings.build_llvm or settings.build_llvm_only:16 build_llvm(cmake_opts)17 if settings.build_llvm_only:18 return19 sys.exit(test(rest))20 21 22def wait():23 # It is an easy on CPU way of keeping the docker container running24 # while the user has a terminal session in that container.25 while True:26 sleep(3600)27 28 29def parse_arguments() -> Tuple[argparse.Namespace, List[str]]:30 parser = argparse.ArgumentParser()31 parser.add_argument("--wait", action="store_true")32 parser.add_argument("--build-llvm", action="store_true")33 parser.add_argument("--build-llvm-only", action="store_true")34 parser.add_argument("-D", action="append", default=[])35 return parser.parse_known_args()36 37 38def build_llvm(cmake_options):39 os.chdir("/build")40 try:41 if is_cmake_needed():42 cmake(cmake_options)43 ninja()44 except CalledProcessError:45 print("Build failed!")46 sys.exit(1)47 48 49def is_cmake_needed():50 return "build.ninja" not in os.listdir()51 52 53CMAKE_COMMAND = (54 "cmake -G Ninja -DCMAKE_BUILD_TYPE=Release "55 "-DCMAKE_INSTALL_PREFIX=/analyzer -DLLVM_TARGETS_TO_BUILD=X86 "56 '-DLLVM_ENABLE_PROJECTS="clang;openmp" -DLLVM_BUILD_RUNTIME=OFF '57 "-DCLANG_ENABLE_STATIC_ANALYZER=ON"58)59 60 61def cmake(cmake_options):62 check_call(63 CMAKE_COMMAND + " ".join(cmake_options) + " /llvm-project/llvm", shell=True64 )65 66 67def ninja():68 check_call("ninja install", shell=True)69 70 71def test(args: List[str]) -> int:72 os.chdir("/projects")73 return call("/scripts/SATest.py " + " ".join(args), shell=True)74 75 76if __name__ == "__main__":77 main()78