ARG IMAGE_TAG FROM dropshell-build-base:test AS builder ARG PROJECT ARG CMAKE_BUILD_TYPE=Debug # Set working directory WORKDIR /app # Create cache directories RUN mkdir -p /ccache # Set up ccache ENV CCACHE_DIR=/ccache ENV CCACHE_COMPILERCHECK=content ENV CCACHE_MAXSIZE=2G COPY . . # Configure and build with ccache using cache mounts RUN --mount=type=cache,target=/ccache \ --mount=type=cache,target=/build \ mkdir -p /build && \ SSL_LIB=$(find /usr/local -name "libssl.a" | head -1) && \ CRYPTO_LIB=$(find /usr/local -name "libcrypto.a" | head -1) && \ echo "Found SSL: $SSL_LIB, Crypto: $CRYPTO_LIB" && \ 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 \ -DOPENSSL_SSL_LIBRARY="$SSL_LIB" \ -DOPENSSL_CRYPTO_LIBRARY="$CRYPTO_LIB" \ -DOPENSSL_INCLUDE_DIR=/usr/local/include \ ${CMAKE_TOOLCHAIN_FILE:+-DCMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN_FILE} # Build with cache mounts RUN --mount=type=cache,target=/ccache \ --mount=type=cache,target=/build \ cmake --build /build --target run_prebuild_script 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 && \ find /build -type f -executable -name "*${PROJECT}*" -exec cp {} /output/${PROJECT} \; || \ find /build -type f -executable -exec cp {} /output/${PROJECT} \; # 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}