# Ubuntu 22.04 (Jammy) base with CUDA 13 devel toolchain
FROM nvidia/cuda:13.0.1-devel-ubuntu22.04
LABEL authors="leonarski_f"

ENV DEBIAN_FRONTEND=noninteractive

ARG OPENSSL_VERSION=3.5.4
ARG QT_VERSION=6.10.0
ARG NODE_MAJOR=22
ARG EIGEN_TAG=3.4.0
ARG LIBJPEG_TURBO_VERSION=3.1.2
ARG LIBTIFF_VERSION=v4.7.1
ARG HDF5_TAG="hdf5_1.14.6"

# Update base and install toolchain + Qt dependencies
# Notes:
# - GCC/G++ 13 are installed from jammy-backports
# - XCB/X11/OpenGL/EGL/DBus/fontconfig/freetype/zlib headers installed for building static Qt
RUN set -eux; \
    apt-get update; \
    apt-get install -y --no-install-recommends \
      ca-certificates \
      curl \
      wget \
      git \
      tar \
      xz-utils \
      build-essential \
      cmake \
      ninja-build \
      python3 \
      python3-requests \
      perl \
      pkg-config \
      gdb \
      file \
      nasm \
      dpkg-dev \
      fakeroot \
      libnuma-dev \
      libxcb1-dev \
      libx11-dev \
      libxext-dev \
      libxrender-dev \
      libxi-dev \
      libxrandr-dev \
      libxcursor-dev \
      libxfixes-dev \
      libxinerama-dev \
      libxkbcommon-dev \
      libxkbcommon-x11-dev \
      libx11-xcb-dev \
      libxcb-image0-dev \
      libxcb-icccm4-dev \
      libxcb-keysyms1-dev \
      libxcb-render-util0-dev \
      libxcb-util-dev \
      libxcb-randr0-dev \
      libxcb-xkb-dev \
      libxcb-shm0-dev \
      libxcb-cursor0 \
      libxcb-cursor-dev \
      libxcb-shape0-dev \
      libxcb-sync-dev \
      libxcb-xfixes0-dev \
      libxcb-glx0-dev \
      libgl1-mesa-dev \
      libglx-dev \
      libegl1-mesa-dev \
      libdbus-1-dev \
      zlib1g-dev \
      libglib2.0-dev \
      libfontconfig1-dev \
      libfftw3-dev \
      libeigen3-dev \
      libdrm-dev \
      mesa-utils \
      libassimp-dev \
      libglvnd-dev \
      libfreetype6-dev; \
    apt-get -y install gcc-12 g++-12; \
    apt-get clean; \
    rm -rf /var/lib/apt/lists/*

# Build a static OpenSSL
RUN set -eux; \
    cd /tmp; \
    curl -LO https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz; \
    tar -xf openssl-${OPENSSL_VERSION}.tar.gz; \
    cd openssl-${OPENSSL_VERSION}; \
    ./Configure linux-x86_64 no-shared no-module no-tests --prefix=/opt/openssl-${OPENSSL_VERSION} --libdir=lib; \
    make -j"$(nproc)"; \
    make install_sw; \
    cd /; rm -rf /tmp/openssl-${OPENSSL_VERSION} /tmp/openssl-${OPENSSL_VERSION}.tar.gz

# Expose static OpenSSL to CMake/pkg-config
ENV OPENSSL_ROOT_DIR=/opt/openssl-${OPENSSL_VERSION}
ENV PKG_CONFIG_PATH=${OPENSSL_ROOT_DIR}/lib/pkgconfig:${OPENSSL_ROOT_DIR}/lib64/pkgconfig:${PKG_CONFIG_PATH}

# Install a recent Node.js (NodeSource)
RUN set -eux; \
    curl -fsSL https://deb.nodesource.com/setup_${NODE_MAJOR}.x | bash -; \
    apt-get update; \
    apt-get install -y --no-install-recommends nodejs; \
    apt-get clean; \
    rm -rf /var/lib/apt/lists/*; \
    node --version; npm --version; (corepack enable || true)

RUN set -eux; \
    git clone --depth 1 --branch ${LIBJPEG_TURBO_VERSION} https://github.com/libjpeg-turbo/libjpeg-turbo.git /tmp/libjpeg-turbo-src; \
    mkdir /tmp/libjpeg-turbo-src/build; \
    cd /tmp/libjpeg-turbo-src/build; \
    cmake -G Ninja \
      -DCMAKE_BUILD_TYPE=Release \
      -DENABLE_SHARED=FALSE \
      -DENABLE_STATIC=TRUE \
      -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
      -DCMAKE_INSTALL_PREFIX=/opt/libjpeg-turbo-${LIBJPEG_TURBO_VERSION}-static ..; \
    cmake --build . -j"$(nproc)"; \
    cmake --install .; \
    rm -rf /tmp/libjpeg-turbo-src

RUN set -eux; \
    git clone --depth 1 --branch ${LIBTIFF_VERSION} https://gitlab.com/libtiff/libtiff.git /tmp/libtiff-src; \
    mkdir /tmp/libtiff-src/build.cm; \
    cd /tmp/libtiff-src/build.cm; \
    cmake -G Ninja \
      -DCMAKE_BUILD_TYPE=Release \
      -DBUILD_SHARED_LIBS=OFF \
      -Dtools=OFF \
      -Dtests=OFF \
      -Ddocs=OFF \
      -Dlzma=OFF \
      -Djbig=OFF \
      -Dwebp=OFF \
      -Djpeg=OFF \
      -Dold-jpeg=OFF \
      -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
      -DCMAKE_INSTALL_PREFIX=/opt/libtiff-${LIBTIFF_VERSION}-static \
      ..; \
    cmake --build . -j"$(nproc)"; \
    cmake --install .; \
    rm -rf /tmp/libtiff-src

RUN set -eux; \
    git clone --depth 1 --branch ${HDF5_TAG} https://github.com/HDFGroup/hdf5 /tmp/hdf5-src; \
    cd /tmp/hdf5-src; \
    mkdir build && cd build; \
    cmake -G Ninja \
      -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
      -DHDF5_BUILD_SHARED_LIBS=OFF \
      -DBUILD_TESTING=OFF \
      -DHDF5_BUILD_TOOLS=OFF \
      -DHDF5_BUILD_EXAMPLES=OFF \
      -DHDF5_ENABLE_SZIP_SUPPORT=OFF \
      -DHDF5_ENABLE_SZIP_ENCODING=OFF \
      -DHDF5_BUILD_CPP_LIB=OFF \
      -DHDF5_ENABLE_Z_LIB_SUPPORT=OFF \
      -DCMAKE_INSTALL_PREFIX=/opt/hdf5-${HDF5_TAG}-static ..; \
    cmake --build . -j"$(nproc)"; \
    cmake --install .; \
    rm -rf /tmp/hdf5-src


ENV CMAKE_PREFIX_PATH=/opt/libtiff-${LIBTIFF_VERSION}-static:/opt/libjpeg-turbo-${LIBJPEG_TURBO_VERSION}-static
ENV PKG_CONFIG_PATH=/opt/hdf5-${HDF5_TAG}-static/lib/pkgconfig:/opt/libjpeg-turbo-${LIBJPEG_TURBO_VERSION}-static/lib/pkgconfig:/opt/libtiff-${LIBTIFF_VERSION}-static/lib/pkgconfig:${OPENSSL_ROOT_DIR}/lib/pkgconfig:${OPENSSL_ROOT_DIR}/lib64/pkgconfig

# Use GCC/G++ 12 for builds
ENV CC=/usr/bin/gcc-12
ENV CXX=/usr/bin/g++-12
ENV PATH=/usr/bin:${PATH}

# Build and install static Qt 6.9 with Core, Gui, Widgets, Charts, DBus
ARG QT_PREFIX=/opt/qt-${QT_VERSION}-static
RUN set -eux; \
    cd /tmp; \
    curl -LO https://download.qt.io/official_releases/qt/6.10/${QT_VERSION}/single/qt-everywhere-src-${QT_VERSION}.tar.xz; \
    tar -xf qt-everywhere-src-${QT_VERSION}.tar.xz; \
    mkdir -p qt-everywhere-src-${QT_VERSION}/build && cd qt-everywhere-src-${QT_VERSION}/build; \
    cmake -G Ninja \
      -DQT_BUILD_SUBMODULES="qtbase;qtshadertools;qtdeclarative;qtcharts;qt3d" \
      -DBUILD_SHARED_LIBS=OFF \
      -DQT_BUILD_TESTS=OFF \
      -DQT_BUILD_EXAMPLES=OFF \
      -DQT_FEATURE_dbus=ON \
      -DQT_FEATURE_xcb=ON \
      -DQT_FEATURE_xcb_xlib=ON \
      -DQT_FEATURE_xkbcommon_x11=ON \
      -DQT_FEATURE_wayland_client=ON \
      -DQT_FEATURE_opengl=ON \
      -DQT_FEATURE_opengl_desktop=ON \
      -DQT_FEATURE_opengl_dynamic=OFF \
      -DQT_FEATURE_vulkan=OFF \
      -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_INSTALL_PREFIX=${QT_PREFIX} \
      -DCMAKE_C_COMPILER=${CC} \
      -DCMAKE_CXX_COMPILER=${CXX} \
      -DQT_FEATURE_openssl=ON \
      -DQT_FEATURE_openssl_linked=ON \
      -DOPENSSL_USE_STATIC_LIBS=TRUE \
      ..; \
    cmake --build . -j"$(nproc)"; \
    cmake --install .; \
    cd /; rm -rf /tmp/qt-everywhere-src-${QT_VERSION} /tmp/qt-everywhere-src-${QT_VERSION}.tar.xz

# Make Qt and Eigen discoverable by CMake
ENV CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}:/opt/hdf5-${HDF5_TAG}-static:/opt/qt-${QT_VERSION}-static

# Set workdir for your project
WORKDIR /workspace

# Default entrypoint: interactive shell
CMD ["/bin/bash", "-l"]
