xref: /llvm-project/clang/utils/analyzer/entrypoint.py (revision 852aaf54071ad072335dcac57f544d4da34c875a)
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