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