xref: /openbsd-src/gnu/llvm/clang/utils/analyzer/entrypoint.py (revision 12c855180aad702bbcca06e0398d774beeafb155)
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