ARG CUDA_VERSION
ARG UBUNTU_VERSION
FROM nvidia/cuda:${CUDA_VERSION}-devel-ubuntu${UBUNTU_VERSION}
LABEL maintainer="AliceVision Team alicevision-team@googlegroups.com"

# use CUDA_VERSION to select the image version to use
# see https://hub.docker.com/r/nvidia/cuda/
#
# AV_VERSION=2.2.8.develop
# CUDA_VERSION=11.0
# UBUNTU_VERSION=20.04
# docker build \
#    --build-arg CUDA_VERSION=${CUDA_VERSION} \
#    --build-arg UBUNTU_VERSION${UBUNTU_VERSION} \
#    --tag alicevision/alicevision-deps:${AV_VERSION}-ubuntu${UBUNTU_VERSION}-cuda${CUDA_TAG} \
#     -f Dockerfile_ubuntu_deps .

# OS/Version (FILE): cat /etc/issue.net
# Cuda version (ENV): $CUDA_VERSION

# Install all compilation tools
# The Kitware repo provides a recent cmake
RUN . ./etc/os-release && \
    apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
        ca-certificates \
        wget \
        software-properties-common && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
        build-essential \
        git \
        unzip \
        yasm \
        pkg-config \
        libtool \
        libssl-dev \
        nasm \
        automake \
        cmake \
        clang-format \
        libxerces-c-dev \
        gcc-12 \
        g++-12 \
        cpp-12 \
        gfortran-12 \
        libpcre2-dev \
        bison && \
    update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 --slave /usr/bin/g++ g++ /usr/bin/g++-12 --slave /usr/bin/gcov gcov /usr/bin/gcov-12  --slave /usr/bin/gfortran gfortran /usr/bin/gfortran-12

RUN add-apt-repository ppa:deadsnakes/ppa && apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends python3.11 python3.11-dev python3.11-distutils curl && \
    curl -sS https://bootstrap.pypa.io/get-pip.py | python3.11

# Install numpy
RUN python3.11 -m pip install numpy==1.*

ENV AV_DEV=/opt/AliceVision_git \
    AV_BUILD=/tmp/AliceVision_build \
    AV_INSTALL=/opt/AliceVision_install \
    PATH="${PATH}:${AV_BUNDLE}"

COPY dl/vlfeat_K80L3.SIFT.tree ${AV_INSTALL}/share/aliceVision/
RUN echo "export ALICEVISION_VOCTREE=${AV_INSTALL}/share/aliceVision/vlfeat_K80L3.SIFT.tree" >> /etc/profile.d/alicevision.sh

COPY dl/sphereDetection_Mask-RCNN.onnx ${AV_INSTALL}/share/aliceVision/
RUN echo "export ALICEVISION_SPHERE_DETECTION_MODEL=${AV_INSTALL}/share/aliceVision/sphereDetection_Mask-RCNN.onnx" >> /etc/profile.d/alicevision.sh

COPY dl/fcn_resnet50.onnx ${AV_INSTALL}/share/aliceVision/
RUN echo "export ALICEVISION_SEMANTIC_SEGMENTATION_MODEL=${AV_INSTALL}/share/aliceVision/fcn_resnet50.onnx" >> /etc/profile.d/alicevision.sh

COPY dl/ColorChartDetectionModel ${AV_INSTALL}/share/aliceVision/ColorChartDetectionModel
RUN echo "export ALICEVISION_COLORCHARTDETECTION_MODEL_FOLDER=${AV_INSTALL}/share/aliceVision/ColorChartDetectionModel" >> /etc/profile.d/alicevision.sh

COPY docker/check-cpu.sh ${AV_DEV}/docker/check-cpu.sh
RUN export CPU_CORES=`${AV_DEV}/docker/check-cpu.sh` && echo "Build multithreading number of cores: ${CPU_CORES}"

COPY CMakeLists.txt ${AV_DEV}/
COPY src/cmake/Dependencies.cmake ${AV_DEV}/src/cmake/

COPY dl/deps ${AV_BUILD}/external/download/

WORKDIR "${AV_BUILD}"
RUN cmake "${AV_DEV}" \
     -DCMAKE_BUILD_TYPE=Release \
     -DALICEVISION_BUILD_DEPENDENCIES:BOOL=ON \
     -DAV_BUILD_ZLIB:BOOL=ON \
     -DAV_BUILD_PYBIND11:BOOL=ON \
     -DAV_BUILD_ALICEVISION:BOOL=OFF \
     -DPython_EXECUTABLE=/usr/bin/python3.11 \
     -DCMAKE_INSTALL_PREFIX="${AV_INSTALL}"

# Symlink lib64 to lib as qtOIIO expects to find OIIO in lib64
RUN mkdir -p "${AV_INSTALL}/lib" && \
    ln -s lib "${AV_INSTALL}/lib64"

# Symlink to Python3 executable in case a call to "python" instead of "python3" is ever made
RUN ln -s /usr/bin/python3.11 /usr/bin/python

RUN test -e /usr/local/cuda/lib64/libcublas.so || ln -s /usr/lib/x86_64-linux-gnu/libcublas.so /usr/local/cuda/lib64/libcublas.so

# RUN make -j ${CPU_CORES} lapack
# RUN make -j ${CPU_CORES} onnxruntime
# RUN make -j ${CPU_CORES} pcl
# RUN make -j ${CPU_CORES} turbojpeg
# RUN make -j ${CPU_CORES} boost
# RUN make -j ${CPU_CORES} openexr
# RUN make -j ${CPU_CORES} tbb
# RUN make -j ${CPU_CORES} assimp
# RUN make -j ${CPU_CORES} geogram
# RUN make -j ${CPU_CORES} eigen
# RUN make -j ${CPU_CORES} opengv
# RUN make -j ${CPU_CORES} suitesparse
# RUN make -j ${CPU_CORES} ceres
# RUN make -j ${CPU_CORES} tiff
# RUN make -j ${CPU_CORES} png
# RUN make -j ${CPU_CORES} libraw
# RUN make -j ${CPU_CORES} openimageio
# RUN make -j ${CPU_CORES} alembic
# RUN make -j ${CPU_CORES} ffmpeg
# RUN make -j ${CPU_CORES} opencv
# RUN make -j ${CPU_CORES} expat
# RUN make -j ${CPU_CORES} SWIG
# RUN make -j ${CPU_CORES} E57Format
# RUN make -j ${CPU_CORES} LEMON
# RUN make -j ${CPU_CORES} opengv
# RUN make -j ${CPU_CORES} OpenMesh
# RUN make -j ${CPU_CORES} flann
# RUN make -j ${CPU_CORES} clp

# RUN make -j ${CPU_CORES} popsift
# RUN make -j ${CPU_CORES} cctag

RUN cmake --build . -j ${CPU_CORES} && \
    mv "${AV_INSTALL}/bin" "${AV_INSTALL}/bin-deps" && \
    rm -rf "${AV_BUILD}"
