ARG IMAGE_TAG FROM gitea.jde.nz/public/dropshell-build-base:latest AS builder ARG PROJECT ARG CMAKE_BUILD_TYPE=Debug # Set working directory WORKDIR /app SHELL ["/bin/bash", "-c"] # Create cache directories RUN mkdir -p /ccache # Set up ccache ENV CCACHE_DIR=/ccache ENV CCACHE_COMPILERCHECK=content ENV CCACHE_MAXSIZE=2G # Copy only build files first (for better layer caching) #COPY CMakeLists.txt cmake_prebuild.sh ./ #COPY src/version.hpp.in src/ # Run prebuild script early (this rarely changes) #RUN bash cmake_prebuild.sh # Copy source files (this invalidates cache when source changes) COPY src/ src/ COPY CMakeLists.txt ./ # Configure project (this step is cached unless CMakeLists.txt changes) RUN --mount=type=cache,target=/ccache \ --mount=type=cache,target=/build \ mkdir -p /build && \ cmake -G Ninja -S /app -B /build \ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=mold -static -g" \ -DCMAKE_CXX_FLAGS="-g -fno-omit-frame-pointer" \ -DCMAKE_C_FLAGS="-g -fno-omit-frame-pointer" \ -DPROJECT_NAME="${PROJECT}" \ -DCMAKE_STRIP=OFF \ ${CMAKE_TOOLCHAIN_FILE:+-DCMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN_FILE} # Build project (ccache will help here when only some files change) RUN --mount=type=cache,target=/ccache \ --mount=type=cache,target=/build \ cmake --build /build # Copy the built executable to a regular directory for the final stage RUN --mount=type=cache,target=/build \ mkdir -p /output && \ if [ -f "/build/${PROJECT}" ]; then \ echo "Found executable at /build/${PROJECT}" && \ cp "/build/${PROJECT}" "/output/${PROJECT}"; \ else \ echo "Executable not found at /build/${PROJECT}, searching..." && \ find /build -type f -executable -name "*${PROJECT}*" -exec cp {} /output/${PROJECT} \; || \ find /build -type f -executable -exec cp {} /output/${PROJECT} \; || \ (echo "Error: Could not find executable for ${PROJECT}" && ls -la /build && exit 1); \ fi # if we're a release build, then run upx on the binary. RUN if [ "${CMAKE_BUILD_TYPE}" = "Release" ]; then \ upx /output/${PROJECT}; \ fi # Final stage that only contains the binary FROM scratch AS project ARG PROJECT # Copy the actual binary from the regular directory COPY --from=builder /output/${PROJECT} /${PROJECT}