ARG LLVM_VERSION=22.1.0
# FIXME: Use "${LLVM_VERSION%%.*}" instead of "LLVM_VERSION_MAJOR" once we update runners to Ubuntu-26.04 with Buildah >= 1.37
ARG LLVM_VERSION_MAJOR=22

FROM docker.io/library/ubuntu:24.04@sha256:c4a8d5503dfb2a3eb8ab5f807da5bc69a85730fb49b5cfca2330194ebcc41c7b AS llvm-downloader
ARG LLVM_VERSION
ARG LLVM_VERSION_MAJOR

RUN apt-get update && \
    apt-get install -y wget xz-utils && \
    wget -O llvm.tar.xz https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/LLVM-${LLVM_VERSION}-Linux-X64.tar.xz && \
    mkdir -p /llvm-extract && \
    tar -xvJf llvm.tar.xz -C /llvm-extract \
        # Only unpack these tools to save space on Github runner.
        LLVM-${LLVM_VERSION}-Linux-X64/bin/clang-${LLVM_VERSION_MAJOR} \
        LLVM-${LLVM_VERSION}-Linux-X64/lib/clang/${LLVM_VERSION_MAJOR}/include \
        LLVM-${LLVM_VERSION}-Linux-X64/bin/clang-tidy \
        LLVM-${LLVM_VERSION}-Linux-X64/bin/clang-format \
        LLVM-${LLVM_VERSION}-Linux-X64/bin/git-clang-format && \
    rm llvm.tar.xz

FROM docker.io/library/ubuntu:24.04@sha256:c4a8d5503dfb2a3eb8ab5f807da5bc69a85730fb49b5cfca2330194ebcc41c7b AS minimal
# Create a new user with id 1001 as that is the user id that
# Github Actions uses to perform the checkout action.
RUN useradd gha -u 1001 -m -s /bin/bash


FROM minimal AS base
ENV LLVM_SYSROOT=/opt/llvm
ENV PATH=${LLVM_SYSROOT}/bin:${PATH}

# Need nodejs for some of the GitHub actions.
# Need git for git-clang-format.
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y \
    git \
    nodejs \
    sudo \
    # These are needed by the premerge pipeline.
    # Pip is used to install dependent python packages.
    python3-pip \
    python-is-python3 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN adduser gha sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
# Don't set USER gha right away because we still need to install packages
# as root in 'ci-container-code-format' and 'ci-container-code-lint' containers


FROM base AS ci-container-build-tools
ARG LLVM_VERSION
ARG LLVM_VERSION_MAJOR

COPY --from=llvm-downloader /llvm-extract/LLVM-${LLVM_VERSION}-Linux-X64/bin/clang-${LLVM_VERSION_MAJOR} \
                            ${LLVM_SYSROOT}/bin/
COPY --from=llvm-downloader /llvm-extract/LLVM-${LLVM_VERSION}-Linux-X64/lib/clang/${LLVM_VERSION_MAJOR}/include \
                            ${LLVM_SYSROOT}/lib/clang/${LLVM_VERSION_MAJOR}/include
RUN ln -s ${LLVM_SYSROOT}/bin/clang-${LLVM_VERSION_MAJOR} ${LLVM_SYSROOT}/bin/clang && \
    ln -s ${LLVM_SYSROOT}/bin/clang ${LLVM_SYSROOT}/bin/clang++

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y \
    cmake \
    ninja-build && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

ENV CC=${LLVM_SYSROOT}/bin/clang
ENV CXX=${LLVM_SYSROOT}/bin/clang++


FROM base AS ci-container-code-format
ARG LLVM_VERSION

COPY --from=llvm-downloader /llvm-extract/LLVM-${LLVM_VERSION}-Linux-X64/bin/clang-format \
                            /llvm-extract/LLVM-${LLVM_VERSION}-Linux-X64/bin/git-clang-format \
                            ${LLVM_SYSROOT}/bin/


# Install dependencies for 'pr-code-format.yml' job
COPY llvm/utils/git/requirements_formatting.txt requirements_formatting.txt
RUN pip install --require-hashes -r requirements_formatting.txt --break-system-packages && \
    rm requirements_formatting.txt
USER gha
WORKDIR /home/gha


FROM ci-container-build-tools AS ci-container-code-lint
ARG LLVM_VERSION
ARG LLVM_VERSION_MAJOR

COPY --from=llvm-downloader /llvm-extract/LLVM-${LLVM_VERSION}-Linux-X64/bin/clang-tidy \
                            ${LLVM_SYSROOT}/bin/
COPY clang-tools-extra/clang-tidy/tool/clang-tidy-diff.py ${LLVM_SYSROOT}/bin/clang-tidy-diff.py

# Install dependencies for 'pr-code-lint.yml' job
COPY llvm/utils/git/requirements_linting.txt requirements_linting.txt
RUN pip install --require-hashes -r requirements_linting.txt --break-system-packages && \
    rm requirements_linting.txt
USER gha
WORKDIR /home/gha


FROM ci-container-build-tools as ci-container-abi-tests

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y \
    abi-compliance-checker \
    abi-dumper \
    autoconf \
    parallel \
    pkg-config \
    universal-ctags && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

FROM minimal AS ci-container-github-automation

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y \
    python3-git \
    python3-github && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

USER gha

ADD github-automation.py /usr/local/bin/

FROM docker.io/library/ubuntu:24.04@sha256:c4a8d5503dfb2a3eb8ab5f807da5bc69a85730fb49b5cfca2330194ebcc41c7b AS ids-builder
ARG LLVM_VERSION_MAJOR

RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y wget gpg python3 python3-pip git cmake

RUN wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | gpg --dearmor -o /etc/apt/keyrings/llvm.gpg && \
    echo "deb [signed-by=/etc/apt/keyrings/llvm.gpg] http://apt.llvm.org/noble/ llvm-toolchain-noble-${LLVM_VERSION_MAJOR} main" | tee /etc/apt/sources.list.d/llvm.list && \
    apt-get update && \
    apt-get install -y clang-${LLVM_VERSION_MAJOR} lld-${LLVM_VERSION_MAJOR} ninja-build libclang-${LLVM_VERSION_MAJOR}-dev

COPY llvm/utils/git/requirements_formatting.txt requirements_formatting.txt
RUN pip install --require-hashes -r requirements_formatting.txt --break-system-packages && \
    rm requirements_formatting.txt

RUN git clone https://github.com/compnerd/ids && cd ids && \
    git checkout 6d9b77c89107743159fccaea109e8feb81959844

RUN cd ids && \
    cmake -B ./build \
      -S .\
      -D CMAKE_BUILD_TYPE=Release \
      -D CMAKE_C_COMPILER=clang-${LLVM_VERSION_MAJOR} \
      -D CMAKE_CXX_COMPILER=clang++-${LLVM_VERSION_MAJOR} \
      -D CMAKE_EXE_LINKER_FLAGS=-fuse-ld=lld \
      -D LLVM_DIR=/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/cmake/llvm/ \
      -D Clang_DIR=/usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/cmake/clang/ \
      -D FILECHECK_EXECUTABLE=$(which FileCheck-${LLVM_VERSION_MAJOR}) \
      -D LIT_EXECUTABLE=$(which lit) \
      -G Ninja && \
    ninja -C ./build

FROM ci-container-build-tools AS ci-container-ids-checks
ARG LLVM_VERSION_MAJOR

COPY llvm/utils/git/requirements.txt requirements.txt
RUN pip install --require-hashes -r requirements.txt --break-system-packages && \
    rm requirements.txt

RUN apt-get update && \
    apt-get install -y libz3-4 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

COPY --from=ids-builder /ids/build/bin/idt \
                        /usr/bin/idt
# Copy over the LLVM SO since getting ids to statically link against the distro
# provided libLLVM is difficult for now.
# TODO(boomanaiden154): Get static linking working and remove this.
COPY --from=ids-builder /usr/lib/llvm-${LLVM_VERSION_MAJOR}/lib/libLLVM.so.${LLVM_VERSION_MAJOR}.1 \
                        /usr/lib/libLLVM.so.${LLVM_VERSION_MAJOR}.1
