# syntax=docker/dockerfile:1

########################
# Stage 1: build deps  #
########################
FROM alpine:3.19 AS builder

# Enable static builds with musl
ENV CFLAGS="-static -O2" \
    CXXFLAGS="-static -O2" \
    LDFLAGS="-static"

# Base build tools + musl-dev, etc.
RUN apk add --no-cache \
        build-base \
        cmake \
        ninja \
        git \
        wget \
        curl \
        openssl-dev \
        zlib-static \
        zlib-dev \
        linux-headers \
        bash \
        ccache \
        mold

# Configure mold as the default linker
ENV LD=mold

########################################
# nlohmann/json (compiled static .a)   #
########################################
ARG JSON_VERSION=3.11.3
RUN git clone --depth 1 --branch v${JSON_VERSION} https://github.com/nlohmann/json.git /tmp/json && \
    cmake -S /tmp/json -B /tmp/json/build \
          -DJSON_BuildTests=OFF \
          -DJSON_MultipleHeaders=OFF \
          -DBUILD_SHARED_LIBS=OFF && \
    cmake --build /tmp/json/build --config Release && \
    cmake --install /tmp/json/build

#############################
# cpp‑httplib (header‑only) #
#############################
RUN wget -q https://raw.githubusercontent.com/yhirose/cpp-httplib/master/httplib.h \
    -O /usr/local/include/httplib.h

##################################
# libassert (build static .a)    #
##################################
ARG LIBASSERT_VERSION=v2.1.5
RUN git clone --depth 1 --branch ${LIBASSERT_VERSION} https://github.com/jeremy-rifkin/libassert.git /tmp/libassert && \
    cmake -S /tmp/libassert -B /tmp/libassert/build \
          -DLIBASSERT_BUILD_TESTS=OFF \
          -DLIBASSERT_BUILD_EXAMPLES=OFF \
          -DLIBASSERT_BUILD_STATIC=ON && \
    cmake --build /tmp/libassert/build --config Release && \
    cmake --install /tmp/libassert/build

#####################
# zlib (static .a)  #
#####################
ARG ZLIB_VERSION=1.3.1
RUN wget -q https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz && \
    tar xzf zlib-${ZLIB_VERSION}.tar.gz && \
    cd zlib-${ZLIB_VERSION} && \
    ./configure --static && \
    make -j$(nproc) && \
    make install && \
    cd .. && rm -rf zlib-${ZLIB_VERSION}*

##############################
# Reduce size of .a archives #
##############################
RUN strip --strip-unneeded /usr/local/lib/*.a

############################
# Stage 2: final build kit #
############################
FROM alpine:3.19

# Install core toolchain for building apps
RUN apk add --no-cache \
        build-base \
        cmake \
        ninja \
        git \
        openssl-dev \
        zlib-static \
        bash \
        wget \
        curl \
        linux-headers \
        ccache \
        mold

# Configure mold as the default linker
ENV LD=mold

# Copy pre‑built static libs + headers
COPY --from=builder /usr/local /usr/local

ENV CFLAGS="-static -O2" \
    CXXFLAGS="-static -O2" \
    LDFLAGS="-static"

WORKDIR /workspace

ENTRYPOINT ["/bin/bash"]
