From 3a53f14cce68db1e3fac8260984bcf7851d9672d Mon Sep 17 00:00:00 2001
From: John <j@jde.nz>
Date: Mon, 26 May 2025 13:15:03 +1200
Subject: [PATCH] Dockerfile

---
 Dockerfile | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)
 create mode 100644 Dockerfile

diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..28ef83c
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,96 @@
+# 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
+
+########################################
+# 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) #
+#############################
+ARG HTTPLIB_VERSION=v0.15.4
+RUN wget -q https://raw.githubusercontent.com/yhirose/cpp-httplib/${HTTPLIB_VERSION}/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
+
+# 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/sh"]