FROM nvidia/cuda:13.3.0-devel-rockylinux9 LABEL authors="leonarski_f" ARG OPENSSL_VERSION=3.5.4 ARG QT_VERSION=6.9.1 ARG DBUS_VERSION=1.14.10 ARG NODE_MAJOR=22 ARG EIGEN_VERSION=3.4.0 # HDF5, libtiff and libjpeg-turbo are built by the jungfraujoch CMake itself (FetchContent / # ExternalProject). Eigen is an external find_package(Eigen3 3.4) dependency, installed from source # below (3.4.x is required; Eigen's same-major-version rule rejects 5.x). ARG DIALS_VERSION=3.27.0 ARG DIALS_TARBALL_URL=https://github.com/dials/dials/releases/download/v3.27.0/dials-v3-27-0-linux-x86_64.tar.xz ARG DIALS_PREFIX=/opt # Update base, enable CRB (RHEL/Rocky 9), and install toolchain + Qt deps RUN dnf -y update && \ dnf -y install \ 'dnf-command(config-manager)' && \ dnf config-manager --set-enabled crb && \ dnf -y install --enablerepo=devel \ dnf-plugins-core \ epel-release \ git \ which \ ca-certificates \ wget \ tar \ xz \ make \ cmake \ gcc-toolset-13 \ gcc-toolset-13-gcc \ gcc-toolset-13-gcc-c++ \ gcc-toolset-13-gdb \ rpm-build \ rpmdevtools \ numactl-devel \ redhat-rpm-config \ ninja-build \ python3 \ python3.12 \ perl \ nasm \ pkgconf-pkg-config \ libxcb-devel \ xcb-util-*-devel \ libxcb-devel \ libxkbcommon-devel \ libxkbcommon-x11-devel \ libX11-devel \ libXext-devel \ libXrender-devel \ libXi-devel \ libXrandr-devel \ libXcursor-devel \ libXfixes-devel \ libXinerama-devel \ mesa-libGL-devel \ mesa-libEGL-devel \ expat-devel \ krb5-devel \ zlib-devel \ zlib-static \ zlib-static \ fontconfig-devel \ mesa-dri-drivers \ libdrm-devel \ libglvnd-core-devel \ libglvnd-devel \ glibc-langpack-en \ glibc-locale-source \ freetype-devel && \ dnf clean all && rm -rf /var/cache/dnf 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). Change NODE_MAJOR if you want another major version. RUN curl -fsSL https://rpm.nodesource.com/setup_${NODE_MAJOR}.x | bash - && \ dnf -y install nodejs && \ dnf clean all && rm -rf /var/cache/dnf && \ node --version && npm --version && (corepack enable || true) # Make GCC/G++ 13 the default for builds ENV GCC_TOOLSET_ROOT=/opt/rh/gcc-toolset-13/root ENV PATH=${GCC_TOOLSET_ROOT}/usr/bin:${PATH} ENV CC=${GCC_TOOLSET_ROOT}/usr/bin/gcc ENV CXX=${GCC_TOOLSET_ROOT}/usr/bin/g++ # Static libdbus: link D-Bus into the viewer (Qt6::DBus) instead of pulling libdbus-1.so.3 at runtime. # A distro libdbus-1.so drags in libsystemd (-> libzstd/liblz4/libcap/libgcrypt/libgpg-error) and # libselinux (-> libpcre2). Disabling those integrations makes libdbus-1.a depend on ~libc alone, so # that whole runtime .so tail disappears while the viewer keeps its single-instance / remote-control # D-Bus feature -- it is a pure session-bus client (registers a name + exports an adaptor), so the # daemon-side systemd/selinux features are irrelevant. Static-only install (no .so); the Qt build # finds it through find_package(DBus1) via the -DDBus1_DIR hint (the CMake package config dbus # installs, which imports libdbus-1.a). Built -fPIC (--with-pic) so the archive links into Qt's PIE # tools (qdbusxml2cpp). expat is only a configure-time dep of the dbus daemon; the client libdbus-1 # links neither expat nor systemd. RUN set -eux; \ cd /tmp; \ curl -LO https://dbus.freedesktop.org/releases/dbus/dbus-${DBUS_VERSION}.tar.xz; \ tar -xf dbus-${DBUS_VERSION}.tar.xz; \ cd dbus-${DBUS_VERSION}; \ ./configure --prefix=/opt/dbus-${DBUS_VERSION}-static \ --enable-static --disable-shared --with-pic \ --disable-systemd --without-systemdsystemunitdir \ --disable-selinux --disable-apparmor --disable-libaudit \ --disable-tests --disable-asserts \ --disable-doxygen-docs --disable-xml-docs --disable-ducktype-docs \ CFLAGS="-fPIC"; \ make -j"$(nproc)"; \ make install; \ cd /; rm -rf /tmp/dbus-${DBUS_VERSION} /tmp/dbus-${DBUS_VERSION}.tar.xz # Put the static libdbus pkgconfig ahead of the system one so Qt6::DBus resolves to the .a ENV PKG_CONFIG_PATH=/opt/dbus-${DBUS_VERSION}-static/lib/pkgconfig:${PKG_CONFIG_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.9/${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_dbus_linked=ON \ -DDBus1_DIR=/opt/dbus-${DBUS_VERSION}-static/lib/cmake/DBus1 \ -DQT_FEATURE_xcb=ON \ -DQT_FEATURE_xcb_xlib=OFF \ -DQT_FEATURE_xkbcommon_x11=ON \ -DQT_FEATURE_opengl=ON \ -DQT_FEATURE_opengl_desktop=ON \ -DQT_FEATURE_opengl_dynamic=OFF \ -DQT_FEATURE_vulkan=OFF \ -DQT_FEATURE_glib=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 # Install DIALS using the official binary tarball workflow RUN set -eux; \ cd /tmp; \ curl -fL -o dials.tar.xz "${DIALS_TARBALL_URL}"; \ tar -xJf dials.tar.xz; \ cd dials-installer; \ ./install --prefix="${DIALS_PREFIX}"; \ cd /; \ rm -rf /tmp/dials.tar.xz /tmp/dials-*-linux-x86_64 RUN set -eux; \ mkdir -p /opt/xds; \ cd /tmp; \ curl -fL -o XDS-gfortran_Linux_x86_64.tar.gz https://xds.mr.mpg.de/XDS-gfortran_Linux_x86_64.tar.gz; \ tar -xzf XDS-gfortran_Linux_x86_64.tar.gz; \ cp -a /tmp/XDS-gfortran_Linux_x86_64/. /opt/xds/ RUN set -eux; \ cd /tmp; \ curl -fL -o dectris-neggia-1.2.0.el7.tar.gz \ https://github.com/dectris/neggia/files/6585943/dectris-neggia-1.2.0.el7.tar.gz; \ tar -xzf dectris-neggia-1.2.0.el7.tar.gz; \ find . -name 'dectris-neggia*.so' -print; \ mkdir -p /opt/xds; \ cp -av "$(find . -name 'dectris-neggia*.so' | head -n 1)" /opt/xds/dectris-neggia.so; \ chmod 755 /opt/xds/dectris-neggia.so; \ rm -rf /tmp/dectris-neggia-1.2.0.el7.tar.gz /tmp/* RUN dnf -y install python3-Cython python3-pip python3-devel && dnf clean all RUN set -eux; \ wget --tries=5 --waitretry=5 \ -O /opt/xds/durin-plugin.so \ https://gitea.psi.ch/mx/durin/releases/download/1.0.0/libdurin-plugin.so.1.0.0 # Eigen 3.4 (header-only) -- external find_package(Eigen3 3.4) dependency, installed to /opt/eigen-3.4. RUN set -eux; \ cd /tmp; \ git clone --depth 1 --branch ${EIGEN_VERSION} https://gitlab.com/libeigen/eigen.git; \ cmake -G Ninja -S eigen -B eigen-build -DCMAKE_INSTALL_PREFIX=/opt/eigen-3.4 \ -DEIGEN_BUILD_BLAS=OFF -DEIGEN_BUILD_LAPACK=OFF -DEIGEN_BUILD_DOC=OFF -DBUILD_TESTING=OFF; \ cmake --install eigen-build; \ cd /; rm -rf /tmp/eigen /tmp/eigen-build # Make Qt, the static libdbus, and Eigen discoverable by CMake. The static libdbus prefix is # required here (not only at Qt build time): every Qt6::DBus consumer re-runs find_package(DBus1) # through Qt's exported config, so DBus1Config.cmake must be on CMAKE_PREFIX_PATH for the viewer build. ENV CMAKE_PREFIX_PATH=/opt/qt-${QT_VERSION}-static:/opt/dbus-${DBUS_VERSION}-static:/opt/eigen-3.4 ENV LANG=en_US.UTF-8 ENV LANGUAGE=en_US:en ENV LC_ALL=en_US.UTF-8 # Set workdir for your project WORKDIR /workspace # Default entrypoint: interactive shell CMD ["/bin/bash", "-l"]