1import argparse 2import os 3import sys 4 5from subprocess import call, check_call, CalledProcessError 6from time import sleep 7from typing import List, Tuple 8 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 return 19 sys.exit(test(rest)) 20 21 22def wait(): 23 # It is an easy on CPU way of keeping the docker container running 24 # 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_ARCMT=OFF " 58 "-DCLANG_ENABLE_STATIC_ANALYZER=ON" 59) 60 61 62def cmake(cmake_options): 63 check_call( 64 CMAKE_COMMAND + " ".join(cmake_options) + " /llvm-project/llvm", shell=True 65 ) 66 67 68def ninja(): 69 check_call("ninja install", shell=True) 70 71 72def test(args: List[str]) -> int: 73 os.chdir("/projects") 74 return call("/scripts/SATest.py " + " ".join(args), shell=True) 75 76 77if __name__ == "__main__": 78 main() 79