# syntax=docker/dockerfile:1

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

ARG TARGET_ARCH
RUN case $TARGET_ARCH in \
    "arm64") export TARGET_TRIPLE="aarch64-linux-musl";; \
    "amd64") export TARGET_TRIPLE="x86_64-linux-musl";; \
    *) echo "Unsupported architecture"; exit 1;; \
    esac && \
    export CC="${TARGET_TRIPLE}-gcc" && \
    export CXX="${TARGET_TRIPLE}-g++"


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

# Install build dependencies
RUN echo "https://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && \
    apk update && \
    apk add --no-cache \
        build-base \
        cmake \
        ninja \
        git \
        wget \
        curl \
        openssl-dev \
        zlib-static \
        zlib-dev \
        linux-headers \
        bash \
        ccache \
        mold \
        musl-dev \
        gcc \
        g++ \
        make \
        python3 \
        bison \
        flex \
        texinfo \
        gperf \
        help2man \
        gettext-dev \
        autoconf \
        automake \
        libtool \
        patch \
        gawk \
        xz-dev \
        gcc-cross-embedded

########################################
# 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 echo "https://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && \
    apk update && \
    apk add --no-cache \
        build-base \
        cmake \
        ninja \
        git \
        openssl-dev \
        zlib-static \
        bash \
        wget \
        curl \
        linux-headers \
        ccache \
        mold \
        gcc-cross-embedded

# Configure mold as the default linker
ENV LD=mold

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

# Add toolchain to PATH
ENV PATH="/opt/cross/bin:${PATH}"

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

WORKDIR /workspace

ENTRYPOINT ["/bin/bash"]