1e010d143SValeriy Savchenkoimport argparse 2e010d143SValeriy Savchenkoimport os 3e30706afSValeriy Savchenkoimport sys 4e010d143SValeriy Savchenko 5e30706afSValeriy Savchenkofrom subprocess import call, check_call, CalledProcessError 611f28782SValeriy Savchenkofrom time import sleep 711f28782SValeriy Savchenkofrom typing import List, Tuple 8e010d143SValeriy Savchenko 9e010d143SValeriy Savchenko 10e010d143SValeriy Savchenkodef main(): 11e010d143SValeriy Savchenko settings, rest = parse_arguments() 12dd3c26a0STobias Hieta cmake_opts = ["-D" + cmd for cmd in settings.D] 1311f28782SValeriy Savchenko if settings.wait: 1411f28782SValeriy Savchenko wait() 15e010d143SValeriy Savchenko if settings.build_llvm or settings.build_llvm_only: 16caeef199SManas build_llvm(cmake_opts) 17e010d143SValeriy Savchenko if settings.build_llvm_only: 18e010d143SValeriy Savchenko return 19e30706afSValeriy Savchenko sys.exit(test(rest)) 20e010d143SValeriy Savchenko 21e010d143SValeriy Savchenko 2211f28782SValeriy Savchenkodef wait(): 2311f28782SValeriy Savchenko # It is an easy on CPU way of keeping the docker container running 2411f28782SValeriy Savchenko # while the user has a terminal session in that container. 2511f28782SValeriy Savchenko while True: 2611f28782SValeriy Savchenko sleep(3600) 2711f28782SValeriy Savchenko 2811f28782SValeriy Savchenko 29e010d143SValeriy Savchenkodef parse_arguments() -> Tuple[argparse.Namespace, List[str]]: 30e010d143SValeriy Savchenko parser = argparse.ArgumentParser() 31dd3c26a0STobias Hieta parser.add_argument("--wait", action="store_true") 32dd3c26a0STobias Hieta parser.add_argument("--build-llvm", action="store_true") 33dd3c26a0STobias Hieta parser.add_argument("--build-llvm-only", action="store_true") 34dd3c26a0STobias Hieta parser.add_argument("-D", action="append", default=[]) 35e010d143SValeriy Savchenko return parser.parse_known_args() 36e010d143SValeriy Savchenko 37e010d143SValeriy Savchenko 38caeef199SManasdef build_llvm(cmake_options): 39dd3c26a0STobias Hieta os.chdir("/build") 40e30706afSValeriy Savchenko try: 41061b5bf9SValeriy Savchenko if is_cmake_needed(): 42caeef199SManas cmake(cmake_options) 43e010d143SValeriy Savchenko ninja() 44e30706afSValeriy Savchenko except CalledProcessError: 45e30706afSValeriy Savchenko print("Build failed!") 46e30706afSValeriy Savchenko sys.exit(1) 47e010d143SValeriy Savchenko 48e010d143SValeriy Savchenko 49061b5bf9SValeriy Savchenkodef is_cmake_needed(): 50061b5bf9SValeriy Savchenko return "build.ninja" not in os.listdir() 51061b5bf9SValeriy Savchenko 52061b5bf9SValeriy Savchenko 53dd3c26a0STobias HietaCMAKE_COMMAND = ( 54dd3c26a0STobias Hieta "cmake -G Ninja -DCMAKE_BUILD_TYPE=Release " 55dd3c26a0STobias Hieta "-DCMAKE_INSTALL_PREFIX=/analyzer -DLLVM_TARGETS_TO_BUILD=X86 " 56dd3c26a0STobias Hieta '-DLLVM_ENABLE_PROJECTS="clang;openmp" -DLLVM_BUILD_RUNTIME=OFF ' 57*852aaf54SAaron Siddhartha Mondal "-DCLANG_ENABLE_ARCMT=OFF " 58e010d143SValeriy Savchenko "-DCLANG_ENABLE_STATIC_ANALYZER=ON" 59dd3c26a0STobias Hieta) 60e010d143SValeriy Savchenko 61e010d143SValeriy Savchenko 62caeef199SManasdef cmake(cmake_options): 63dd3c26a0STobias Hieta check_call( 64dd3c26a0STobias Hieta CMAKE_COMMAND + " ".join(cmake_options) + " /llvm-project/llvm", shell=True 65dd3c26a0STobias Hieta ) 66e010d143SValeriy Savchenko 67e010d143SValeriy Savchenko 68e010d143SValeriy Savchenkodef ninja(): 69e010d143SValeriy Savchenko check_call("ninja install", shell=True) 70e010d143SValeriy Savchenko 71e010d143SValeriy Savchenko 72e30706afSValeriy Savchenkodef test(args: List[str]) -> int: 73e010d143SValeriy Savchenko os.chdir("/projects") 74e30706afSValeriy Savchenko return call("/scripts/SATest.py " + " ".join(args), shell=True) 75e010d143SValeriy Savchenko 76e010d143SValeriy Savchenko 77dd3c26a0STobias Hietaif __name__ == "__main__": 78e010d143SValeriy Savchenko main() 79