ARG BASE=nvidia/cuda:11.1.1-devel-ubuntu20.04
FROM $BASE

RUN apt-get update && apt-get install -y \
        bc \
        git \
        wget \
        ccache \
        python3 \
        libelf-dev \
        g++-multilib \
        && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

ARG NPROC=8

RUN KEYDUMP_URL=https://cloud.cees.ornl.gov/download && \
    KEYDUMP_FILE=keydump && \
    wget --quiet ${KEYDUMP_URL}/${KEYDUMP_FILE} && \
    wget --quiet ${KEYDUMP_URL}/${KEYDUMP_FILE}.sig && \
    gpg --import ${KEYDUMP_FILE} && \
    gpg --verify ${KEYDUMP_FILE}.sig ${KEYDUMP_FILE} && \
    rm ${KEYDUMP_FILE}*

ARG CMAKE_VERSION=3.27.7
ENV CMAKE_DIR=/opt/cmake
RUN CMAKE_URL=https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION} && \
    CMAKE_SCRIPT=cmake-${CMAKE_VERSION}-Linux-x86_64.sh && \
    CMAKE_SHA256=cmake-${CMAKE_VERSION}-SHA-256.txt && \
    wget --quiet ${CMAKE_URL}/${CMAKE_SHA256} && \
    wget --quiet ${CMAKE_URL}/${CMAKE_SHA256}.asc && \
    wget --quiet ${CMAKE_URL}/${CMAKE_SCRIPT} && \
    gpg --verify ${CMAKE_SHA256}.asc ${CMAKE_SHA256} && \
    grep -i ${CMAKE_SCRIPT} ${CMAKE_SHA256} | sed -e s/linux/Linux/ | sha256sum --check && \
    mkdir -p ${CMAKE_DIR} && \
    sh ${CMAKE_SCRIPT} --skip-license --prefix=${CMAKE_DIR} && \
    rm ${CMAKE_SCRIPT}
ENV PATH=${CMAKE_DIR}/bin:$PATH

ARG LLVM_VERSION=llvmorg-17.0.3
ENV LLVM_DIR=/opt/llvm
RUN LLVM_URL=https://github.com/llvm/llvm-project/archive &&\
    LLVM_ARCHIVE=${LLVM_VERSION}.tar.gz &&\
    SCRATCH_DIR=/scratch && mkdir -p ${SCRATCH_DIR} && cd ${SCRATCH_DIR} && \
    wget --quiet ${LLVM_URL}/${LLVM_ARCHIVE} && \
    mkdir llvm-project && \
    tar -xf ${LLVM_ARCHIVE} -C llvm-project --strip-components=1 && \
    cd llvm-project && \
    mkdir build && cd build && \
    cmake \
      -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_INSTALL_PREFIX=$LLVM_DIR \
      -DCMAKE_C_COMPILER=gcc \
      -DCMAKE_CXX_COMPILER=g++ \
      -DLLVM_ENABLE_PROJECTS="clang" \
      -DLLVM_ENABLE_RUNTIMES="openmp" \
      -DCLANG_OPENMP_NVPTX_DEFAULT_ARCH=sm_70 \
      -DLIBOMPTARGET_NVPTX_COMPUTE_CAPABILITIES=70 \
    ../llvm && \
    make -j${NPROC} && \
    make install && \
    rm -rf ${SCRATCH_DIR}
ENV PATH=${LLVM_DIR}/bin:$PATH
ENV LD_LIBRARY_PATH=${LLVM_DIR}/lib:$LD_LIBRARY_PATH
