|  | import argparse | 
|  | import os | 
|  | import sys | 
|  |  | 
|  | from subprocess import call, check_call, CalledProcessError | 
|  | from time import sleep | 
|  | from typing import List, Tuple | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | settings, rest = parse_arguments() | 
|  | cmake_opts = ["-D" + cmd for cmd in settings.D] | 
|  | if settings.wait: | 
|  | wait() | 
|  | if settings.build_llvm or settings.build_llvm_only: | 
|  | build_llvm(cmake_opts) | 
|  | if settings.build_llvm_only: | 
|  | return | 
|  | sys.exit(test(rest)) | 
|  |  | 
|  |  | 
|  | def wait(): | 
|  | # It is an easy on CPU way of keeping the docker container running | 
|  | # while the user has a terminal session in that container. | 
|  | while True: | 
|  | sleep(3600) | 
|  |  | 
|  |  | 
|  | def parse_arguments() -> Tuple[argparse.Namespace, List[str]]: | 
|  | parser = argparse.ArgumentParser() | 
|  | parser.add_argument("--wait", action="store_true") | 
|  | parser.add_argument("--build-llvm", action="store_true") | 
|  | parser.add_argument("--build-llvm-only", action="store_true") | 
|  | parser.add_argument("-D", action="append", default=[]) | 
|  | return parser.parse_known_args() | 
|  |  | 
|  |  | 
|  | def build_llvm(cmake_options): | 
|  | os.chdir("/build") | 
|  | try: | 
|  | if is_cmake_needed(): | 
|  | cmake(cmake_options) | 
|  | ninja() | 
|  | except CalledProcessError: | 
|  | print("Build failed!") | 
|  | sys.exit(1) | 
|  |  | 
|  |  | 
|  | def is_cmake_needed(): | 
|  | return "build.ninja" not in os.listdir() | 
|  |  | 
|  |  | 
|  | CMAKE_COMMAND = ( | 
|  | "cmake -G Ninja -DCMAKE_BUILD_TYPE=Release " | 
|  | "-DCMAKE_INSTALL_PREFIX=/analyzer -DLLVM_TARGETS_TO_BUILD=X86 " | 
|  | '-DLLVM_ENABLE_PROJECTS="clang;openmp" -DLLVM_BUILD_RUNTIME=OFF ' | 
|  | "-DLLVM_ENABLE_TERMINFO=OFF -DCLANG_ENABLE_ARCMT=OFF " | 
|  | "-DCLANG_ENABLE_STATIC_ANALYZER=ON" | 
|  | ) | 
|  |  | 
|  |  | 
|  | def cmake(cmake_options): | 
|  | check_call( | 
|  | CMAKE_COMMAND + " ".join(cmake_options) + " /llvm-project/llvm", shell=True | 
|  | ) | 
|  |  | 
|  |  | 
|  | def ninja(): | 
|  | check_call("ninja install", shell=True) | 
|  |  | 
|  |  | 
|  | def test(args: List[str]) -> int: | 
|  | os.chdir("/projects") | 
|  | return call("/scripts/SATest.py " + " ".join(args), shell=True) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | main() |