# openmvs.Dockerfile
# 2025-10-23
# by Gernot Walzl

# This Dockerfile builds OpenMVS.
# Homepage: https://cdcseacave.github.io/
# Usage: docker build -o=output -f openmvs.Dockerfile .

ARG UBUNTU_VERSION=24.04
ARG NVIDIA_CUDA_VERSION=12.9.1

FROM nvidia/cuda:${NVIDIA_CUDA_VERSION}-devel-ubuntu${UBUNTU_VERSION} AS build

ARG VCGLIB_VERSION=2025.07
ARG OPENMVS_VERSION=2.3.0

ARG DEBIAN_FRONTEND=noninteractive

# https://github.com/cdcseacave/openMVS/wiki/Building
RUN apt-get update && \
    apt-get install -y \
        wget \
        build-essential \
        cmake \
        libeigen3-dev \
        libopencv-dev \
        libceres-dev \
        libcgal-dev \
        libboost-iostreams-dev \
        libboost-program-options-dev \
        libboost-serialization-dev

RUN wget -O vcglib-${VCGLIB_VERSION}.tar.gz \
        https://github.com/cnr-isti-vclab/vcglib/archive/refs/tags/${VCGLIB_VERSION}.tar.gz && \
    tar xvf vcglib-${VCGLIB_VERSION}.tar.gz

RUN wget -O openMVS-${OPENMVS_VERSION}.tar.gz \
        https://github.com/cdcseacave/openMVS/archive/refs/tags/v${OPENMVS_VERSION}.tar.gz && \
    tar xvf openMVS-${OPENMVS_VERSION}.tar.gz
RUN cd openMVS-${OPENMVS_VERSION} && \
    mkdir make && \
    cd make && \
    cmake .. \
        -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_CUDA_ARCHITECTURES=all-major \
        -DCUDA_CUDA_LIBRARY=/usr/local/cuda/lib64/stubs/libcuda.so \
        -DVCG_ROOT=/vcglib-${VCGLIB_VERSION} \
        -DOpenMVS_ENABLE_TESTS=OFF \
        -DOpenMVS_USE_PYTHON=OFF && \
    make install/strip DESTDIR=/openMVS-install

FROM scratch
COPY --from=build /openMVS-install/ /

# The following required shared objects are not available on Debian 13.
# Most of the dependencies are caused by libopencv_imgcodecs.
COPY --from=build \
    /usr/lib/libarmadillo.so.12 \
    /usr/lib/x86_64-linux-gnu/libgdal.so.34 \
    /usr/lib/x86_64-linux-gnu/libhdf5_serial.so.103 \
    /usr/lib/x86_64-linux-gnu/libhdf5_serial_hl.so.100 \
    /usr/lib/x86_64-linux-gnu/libjpeg.so.8 \
    /usr/lib/x86_64-linux-gnu/libmysqlclient.so.21 \
    /usr/lib/x86_64-linux-gnu/libnetcdf.so.19 \
    /usr/lib/x86_64-linux-gnu/libopencv_calib3d.so.406 \
    /usr/lib/x86_64-linux-gnu/libopencv_core.so.406 \
    /usr/lib/x86_64-linux-gnu/libopencv_features2d.so.406 \
    /usr/lib/x86_64-linux-gnu/libopencv_flann.so.406 \
    /usr/lib/x86_64-linux-gnu/libopencv_imgcodecs.so.406 \
    /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.406 \
    /usr/lib/x86_64-linux-gnu/libpoppler.so.134 \
    /usr/lib/x86_64-linux-gnu/libsuperlu.so.6 \
    /usr/local/lib/x86_64-linux-gnu/

# Remaining dependencies for Debian 13 can be installed via apt:
# sudo apt-get install \
#   libboost-iostreams1.83.0 \
#   libboost-program-options1.83.0 \
#   libboost-serialization1.83.0 \
#   libceres4t64 \
#   libarpack2t64 \
#   libblosc1 \
#   libfreexl1 \
#   libfyba0t64 \
#   libgdcm3.0t64 \
#   libgeos-c1t64 \
#   libgeotiff5 \
#   libhdf4-0-alt \
#   libkmlbase1t64 \
#   libkmldom1t64 \
#   libkmlengine1t64 \
#   libodbcinst2 \
#   libogdi4.1 \
#   libspatialite8t64 \
#   nvidia-cuda-toolkit
