FROM docker.io/rockylinux/rockylinux:10

RUN dnf install -y epel-release dnf-plugins-core && \
    crb enable && \
    dnf update -y

RUN dnf install -y gcc gcc-c++ cmake make git wget \
                   python3 python3-pip python3-devel \
                   libasan libubsan && \
    dnf clean all

ENV MY_CXX_FLAGS="-O3 -march=x86-64-v3 -fPIC -fvisibility=hidden"

RUN git clone https://github.com/kokkos/kokkos.git && cd kokkos && git checkout 5.0.2 && \
    mkdir build && cd build && \
    cmake .. -DCMAKE_INSTALL_PREFIX=/opt/kokkos \
             -DKokkos_ENABLE_OPENMP=ON \
             -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
             -DCMAKE_CXX_FLAGS="${MY_CXX_FLAGS}" && \
    make -j$(nproc) install && cd ../.. && rm -rf kokkos

RUN git clone https://github.com/kokkos/kokkos-kernels.git && cd kokkos-kernels && git checkout 5.0.2 && \
    mkdir build && cd build && \
    cmake .. -DCMAKE_INSTALL_PREFIX=/opt/kokkos \
             -DKokkos_ROOT=/opt/kokkos \
             -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
             -DCMAKE_CXX_FLAGS="${MY_CXX_FLAGS}" && \
    make -j$(nproc) install && cd ../.. && rm -rf kokkos-kernels

RUN git clone https://github.com/KarypisLab/GKlib.git && cd GKlib && \
    make config shared=1 prefix=/opt/METIS && \
    make -j$(nproc) install && \
    mkdir -p /opt/METIS/lib /opt/METIS/lib64 && \
    cp -r /opt/METIS/lib64/* /opt/METIS/lib/ 2>/dev/null || true && \
    cp -r /opt/METIS/lib/* /opt/METIS/lib64/ 2>/dev/null || true && \
    cd .. && rm -rf GKlib

RUN git clone https://github.com/KarypisLab/METIS.git && cd METIS && \
    make config shared=1 prefix=/opt/METIS gklib_path=/opt/METIS && \
    make -j$(nproc) install && \
    cp -r /opt/METIS/lib64/* /opt/METIS/lib/ 2>/dev/null || true && \
    cp -r /opt/METIS/lib/* /opt/METIS/lib64/ 2>/dev/null || true && \
    cd .. && rm -rf METIS
    
RUN pip3 install "numpy==2.4.2" "scipy==1.17.1" "matplotlib==3.10.8" "pybind11==3.0.2"

WORKDIR /morphdG
COPY . .

RUN rm -rf build build_docker *.so
RUN mkdir build_docker && cd build_docker && \
    PYBIND11_DIR=$(python3 -c "import pybind11; print(pybind11.get_cmake_dir())") && \
    cmake .. -DCMAKE_PREFIX_PATH="/opt/kokkos;/opt/METIS" \
             -Dpybind11_DIR="$PYBIND11_DIR" \
             -DCMAKE_CXX_FLAGS="${MY_CXX_FLAGS}" && \
    make -j$(nproc)

RUN pip3 install .

RUN SITE_PKG=$(pip3 show morphdg | grep Location | awk '{print $2}') && \
    DEST_DIR="$SITE_PKG/morphdg" && \
    echo "Copying to: $DEST_DIR" && \
    cp -v /morphdG/morphdg/*morphdg_core*.so "$DEST_DIR/" || \
    (echo "ERROR: Failed to copy the .so file!" && exit 1)

ENV LD_LIBRARY_PATH="/opt/METIS/lib:/opt/METIS/lib64:/opt/kokkos/lib64:${LD_LIBRARY_PATH}"
ENV OMP_PROC_BIND=spread
ENV OMP_PLACES=threads

RUN ln -sf /usr/bin/python3 /usr/bin/python && \
    ln -sf /usr/bin/pip3 /usr/bin/pip

RUN echo "alias ll='ls -lah --color=auto'" >> /root/.bashrc && \
    echo "alias ls='ls --color=auto'" >> /root/.bashrc && \
    echo "export PS1='\[\e[1;36m\]🚀 morphDG \[\e[1;32m\]\w\[\e[0m\] \$ '" >> /root/.bashrc

WORKDIR /workspace

CMD ["/bin/bash"]





