getpkg/Dockerfile
2025-05-26 15:32:33 +12:00

164 lines
4.7 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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"
# Create non-root user
RUN adduser -D -u 1000 builder
# 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 \
crosstool-ng
# Create crosstool-ng config
RUN mkdir -p /tmp/ct-ng && \
chown -R builder:builder /tmp/ct-ng && \
cd /tmp/ct-ng && \
su builder -c "ct-ng aarch64-unknown-linux-musl" && \
su builder -c "sed -i 's/CT_MUSL_VERSION=\"1.2.4\"/CT_MUSL_VERSION=\"1.2.4\"/' .config" && \
su builder -c "sed -i 's/CT_GCC_VERSION=\"13.1.0\"/CT_GCC_VERSION=\"13.1.0\"/' .config" && \
su builder -c "sed -i 's/CT_BINUTILS_VERSION=\"2.41\"/CT_BINUTILS_VERSION=\"2.41\"/' .config" && \
su builder -c "sed -i 's/CT_LINUX_VERSION=\"6.1.28\"/CT_LINUX_VERSION=\"6.1.28\"/' .config" && \
su builder -c "sed -i 's/CT_PARALLEL_JOBS=0/CT_PARALLEL_JOBS=$(nproc)/' .config" && \
su builder -c "echo 'CT_EXTRA_CFLAGS_FOR_BUILD=\"-D_FILE_OFFSET_BITS=64\"' >> .config" && \
su builder -c "echo 'CT_EXTRA_CFLAGS_FOR_HOST=\"-D_FILE_OFFSET_BITS=64\"' >> .config"
# Build the toolchain
RUN cd /tmp/ct-ng && \
su builder -c "unset CFLAGS CXXFLAGS LDFLAGS && ct-ng build"
# Install the toolchain
RUN mkdir -p /opt/cross && \
cp -r /tmp/ct-ng/.build/aarch64-unknown-linux-musl/* /opt/cross/ && \
rm -rf /tmp/ct-ng
# Add toolchain to PATH
ENV PATH="/opt/cross/bin:${PATH}"
########################################
# 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
#############################
# cpphttplib (headeronly) #
#############################
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 \
crosstool-ng
# Configure mold as the default linker
ENV LD=mold
# Copy prebuilt static libs + headers and cross-compiler toolchain
COPY --from=builder /usr/local /usr/local
COPY --from=builder /opt/cross /opt/cross
# Add toolchain to PATH
ENV PATH="/opt/cross/bin:${PATH}"
ENV CFLAGS="-static -O2" \
CXXFLAGS="-static -O2" \
LDFLAGS="-static"
WORKDIR /workspace
ENTRYPOINT ["/bin/bash"]