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