diff --git a/clang/utils/analyzer/Dockerfile b/clang/utils/analyzer/Dockerfile new file mode 100644 --- /dev/null +++ b/clang/utils/analyzer/Dockerfile @@ -0,0 +1,52 @@ +FROM ubuntu:bionic + +RUN apt-get update && apt-get install -y \ + apt-transport-https \ + ca-certificates \ + gnupg \ + software-properties-common \ + wget + +# newer CMake is required by LLVM +RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null +RUN apt-add-repository -y 'deb https://apt.kitware.com/ubuntu/ bionic main' + +# test system dependencies +RUN apt-get update && apt-get install -y \ + git \ + gettext \ + python3 \ + python3-pip \ + cmake \ + ninja-build + +# box2d dependencies +RUN apt-get install -y \ + libx11-dev \ + libxrandr-dev \ + libxinerama-dev \ + libxcursor-dev \ + libxi-dev + +# symengine dependencies +RUN apt-get install -y \ + libgmp10 \ + libgmp-dev + +RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 1 + +VOLUME /analyzer +VOLUME /projects +VOLUME /llvm-project +VOLUME /build +VOLUME /scripts + +ENV PATH="/analyzer/bin:${PATH}" + +ADD entrypoint.py /entrypoint.py + +# Uncomment in case of requirements +# ADD requirements.txt /requirements.txt +# RUN pip3 install -r /requirements.txt + +ENTRYPOINT ["python", "/entrypoint.py"] diff --git a/clang/utils/analyzer/entrypoint.py b/clang/utils/analyzer/entrypoint.py new file mode 100644 --- /dev/null +++ b/clang/utils/analyzer/entrypoint.py @@ -0,0 +1,52 @@ +import argparse +import os + +from typing import List, Tuple + +from subprocess import check_call + + +def main(): + settings, rest = parse_arguments() + if settings.build_llvm or settings.build_llvm_only: + build_llvm() + if settings.build_llvm_only: + return + test(rest) + + +def parse_arguments() -> Tuple[argparse.Namespace, List[str]]: + parser = argparse.ArgumentParser() + parser.add_argument('--build-llvm', action='store_true') + parser.add_argument('--build-llvm-only', action='store_true') + return parser.parse_known_args() + + +def build_llvm() -> None: + os.chdir('/build') + cmake() + ninja() + + +CMAKE_COMMAND = "cmake -G Ninja -DCMAKE_BUILD_TYPE=Release " \ + "-DCMAKE_INSTALL_PREFIX=/analyzer -DLLVM_TARGETS_TO_BUILD=X86 " \ + "-DLLVM_ENABLE_PROJECTS=clang -DLLVM_BUILD_RUNTIME=OFF " \ + "-DLLVM_ENABLE_TERMINFO=OFF -DCLANG_ENABLE_ARCMT=OFF " \ + "-DCLANG_ENABLE_STATIC_ANALYZER=ON" + + +def cmake(): + check_call(CMAKE_COMMAND + ' /llvm-project/llvm', shell=True) + + +def ninja(): + check_call("ninja install", shell=True) + + +def test(args: List[str]): + os.chdir("/projects") + check_call("/scripts/SATest.py " + " ".join(args), shell=True) + + +if __name__ == '__main__': + main()