FROM --platform=$BUILDPLATFORM alpine:latest AS builder # Add build arguments for platform ARG TARGETPLATFORM ARG BUILDPLATFORM # Install build dependencies RUN apk add --no-cache \ build-base \ cmake \ git \ musl-dev \ curl \ bash \ musl \ g++ \ ninja \ linux-headers # Install cross-compilation tools for ARM64 RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ apk add --no-cache \ crossbuild-essential-arm64 \ gcc-aarch64-linux-gnu \ g++-aarch64-linux-gnu; \ fi # Set working directory WORKDIR /build # Copy source files COPY . . # Configure and build RUN mkdir -p build_static # Set up cross-compilation environment for ARM64 RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ export CC=aarch64-linux-gnu-gcc \ export CXX=aarch64-linux-gnu-g++ \ export CMAKE_TOOLCHAIN_FILE=/build/toolchain.cmake; \ fi # Create toolchain file for ARM64 RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ echo "set(CMAKE_SYSTEM_NAME Linux)" > toolchain.cmake && \ echo "set(CMAKE_SYSTEM_PROCESSOR aarch64)" >> toolchain.cmake && \ echo "set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)" >> toolchain.cmake && \ echo "set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)" >> toolchain.cmake && \ echo "set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)" >> toolchain.cmake && \ echo "set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)" >> toolchain.cmake && \ echo "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)" >> toolchain.cmake; \ fi RUN cmake -G Ninja -B build_static -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_EXE_LINKER_FLAGS="-static" \ -DCMAKE_FIND_LIBRARY_SUFFIXES=".a" \ -DBUILD_SHARED_LIBS=OFF \ ${CMAKE_TOOLCHAIN_FILE:+-DCMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN_FILE} RUN cmake --build build_static # Final stage that only contains the binary FROM scratch AS dropshell COPY --from=builder /build/build_static/dropshell /dropshell