# ───────────────────────────────────────────────────────────────────────────── # negative-converter — Multi-Stage Build Image # # Stages: # base — Gemeinsame Tools (cmake, ninja, gcc) # linux-builder — Linux-Build mit OpenCV, LibRaw, Qt6 # windows-builder — Windows Cross-Compilation via MXE + MinGW-w64 # # Verwendung: # docker build --target linux-builder -t negative-converter:linux . # docker build --target windows-builder -t negative-converter:windows . # ───────────────────────────────────────────────────────────────────────────── # Ubuntu 22.04 LTS für Linux-Build FROM ubuntu:22.04 AS base ENV DEBIAN_FRONTEND=noninteractive \ TZ=UTC RUN apt-get update && apt-get install -y --no-install-recommends \ # Build-Tools cmake \ ninja-build \ build-essential \ pkg-config \ git \ # Hilfswerkzeuge wget \ curl \ unzip \ zip \ ca-certificates \ gnupg \ && rm -rf /var/lib/apt/lists/* WORKDIR /project # ───────────────────────────────────────────────────────────────────────────── # Stage: linux-builder # Linux-Build mit OpenCV, LibRaw, Qt6 # ───────────────────────────────────────────────────────────────────────────── FROM base AS linux-builder RUN apt-get update && apt-get install -y --no-install-recommends \ # OpenCV libopencv-dev \ # LibRaw libraw-dev \ # Qt6 qt6-base-dev \ libqt6widgets6 \ libxkbcommon-dev \ # GTest für Tests libgtest-dev \ # OpenGL (Qt-Abhängigkeit) libgl1-mesa-dev \ && rm -rf /var/lib/apt/lists/* COPY . /project # Standard: Release ohne GUI (GUI benötigt X11/Display) RUN cmake -B build -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_GUI=OFF \ -DBUILD_TESTS=ON \ && cmake --build build --parallel "$(nproc)" \ && ctest --test-dir build --output-on-failure ENTRYPOINT ["./build/negative-converter"] CMD ["--batch", "--config", "config.ini"] # ───────────────────────────────────────────────────────────────────────────── # Stage: windows-builder # Windows Cross-Compilation via MXE (MinGW-w64 + statisch gelinkte Deps) # MXE-Pakete sind für Ubuntu 20.04 (focal) gebaut → eigene Base nötig # ───────────────────────────────────────────────────────────────────────────── FROM ubuntu:20.04 AS windows-builder ENV DEBIAN_FRONTEND=noninteractive \ TZ=UTC RUN apt-get update && apt-get install -y --no-install-recommends \ ninja-build \ build-essential \ pkg-config \ curl \ ca-certificates \ gnupg \ apt-transport-https \ && rm -rf /var/lib/apt/lists/* # CMake 3.20+ von Kitware (Ubuntu 20.04 liefert nur 3.16) RUN curl -fsSL https://apt.kitware.com/keys/kitware-archive-latest.asc \ | gpg --dearmor -o /usr/share/keyrings/kitware-archive-keyring.gpg \ && echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ focal main" \ > /etc/apt/sources.list.d/kitware.list \ && apt-get update && apt-get install -y --no-install-recommends cmake \ && rm -rf /var/lib/apt/lists/* WORKDIR /project # MXE Repository einrichten (focal = Ubuntu 20.04) RUN curl -fsSL "https://pkg.mxe.cc/repos/apt/client-conf/mxeapt.gpg" \ | gpg --dearmor -o /usr/share/keyrings/mxeapt.gpg \ && echo "deb [arch=amd64 signed-by=/usr/share/keyrings/mxeapt.gpg] https://pkg.mxe.cc/repos/apt focal main" \ > /etc/apt/sources.list.d/mxeapt.list # MXE-Pakete: OpenCV + LibRaw (statisch, x86_64) # Hinweis: MXE unterstützt kein Qt6 → Windows-Build als CLI ohne GUI # Initial-Download ~1-2 GB, dauert je nach Bandbreite 5-15 Min. RUN apt-get update && apt-get install -y --no-install-recommends \ mxe-x86-64-w64-mingw32.static-cmake \ mxe-x86-64-w64-mingw32.static-opencv \ mxe-x86-64-w64-mingw32.static-libraw \ mxe-x86-64-w64-mingw32.static-cc \ && rm -rf /var/lib/apt/lists/* ENV MXE_PREFIX=/usr/lib/mxe/usr/x86_64-w64-mingw32.static \ PATH="/usr/lib/mxe/usr/bin:${PATH}" COPY . /project # System-cmake (3.20+) mit MXE-Toolchain und TryRunResults RUN cmake -B build-windows -G Ninja \ -DCMAKE_TOOLCHAIN_FILE="${MXE_PREFIX}/share/cmake/mxe-conf.cmake" \ -C /usr/lib/mxe/usr/share/cmake/modules/TryRunResults.cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/project/dist-windows \ -DBUILD_GUI=OFF \ -DBUILD_TESTS=OFF \ && cmake --build build-windows --parallel "$(nproc)" \ && cmake --install build-windows # Ergebnis: /project/dist-windows/bin/negative-converter.exe ENTRYPOINT ["/bin/bash"]