Files
el/ui/examples/native-hello/Dockerfile.pi
T

100 lines
3.9 KiB
Docker

FROM --platform=linux/arm64 ubuntu:22.04
# GTK4 + SDL2 for Raspberry Pi (ARM64 / aarch64)
# Targets Pi 3 / 4 / 5 running 64-bit Raspberry Pi OS or Ubuntu 22.04.
#
# GTK4 requires a desktop environment / Wayland compositor at runtime.
# SDL2 works on bare framebuffer or KMS/DRM without a full desktop.
#
# Usage:
# docker build --platform linux/arm64 \
# -f Dockerfile.pi --tag el-native-pi-arm64 ./build-docker/
# docker create --name pi-extract el-native-pi-arm64
# docker cp pi-extract:/build/native-hello-linux-pi ./build/native-hello-pi-arm64
# docker rm pi-extract
#
# The GTK4 build is the default. SDL2 is available as an alternative
# for headless / bare-metal Pi deployments.
RUN apt-get update && apt-get install -y \
build-essential \
libgtk-4-dev \
libsdl2-dev \
libsdl2-ttf-dev \
libsdl2-image-dev \
pkg-config \
libcurl4-openssl-dev \
binutils \
file \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /build
# All sources arrive in /build
COPY runtime/ runtime/
COPY el_native_vessel.c el_native_vessel.h native_hello.c ./
# ── GTK4 build ────────────────────────────────────────────────────────────────
# Compile el_gtk4.c
RUN gcc -DEL_TARGET_LINUX $(pkg-config --cflags gtk4) \
-std=c11 -I/build/runtime \
-c /build/runtime/el_gtk4.c -o /build/el_gtk4.o && \
echo "el_gtk4.c compiled OK"
# Compile el_seed.c
RUN gcc -DEL_TARGET_LINUX $(pkg-config --cflags gtk4) \
-std=c11 -I/build/runtime \
-c /build/runtime/el_seed.c -o /build/el_seed.o && \
echo "el_seed.c compiled OK"
# Compile el_runtime.c
RUN gcc -std=c11 -I/build/runtime \
-c /build/runtime/el_runtime.c -o /build/el_runtime.o && \
echo "el_runtime.c compiled OK"
# Patch el_runtime.o: localise __-prefixed duplicate symbols (el_seed.o is canonical)
RUN nm /build/el_seed.o | awk '/[0-9a-f]+ T /{print $3}' | sort > /build/.seed_T.txt && \
nm /build/el_runtime.o | awk '/[0-9a-f]+ T /{print $3}' | sort > /build/.rt_T.txt && \
comm -12 /build/.seed_T.txt /build/.rt_T.txt > /build/.dups.txt && \
if [ -s /build/.dups.txt ]; then \
ARGS=$(awk '{printf "--localize-symbol=%s ", $1}' /build/.dups.txt); \
eval "objcopy $ARGS /build/el_runtime.o"; \
echo "Patched $(wc -l < /build/.dups.txt) duplicate symbols in el_runtime.o"; \
fi
# Compile vessel
RUN gcc -DEL_TARGET_LINUX -std=c11 -I/build/runtime \
-include /build/runtime/el_native_target.h \
-c /build/el_native_vessel.c -o /build/el_native_vessel.o && \
echo "vessel compiled OK"
# Compile app
RUN gcc -DEL_TARGET_LINUX -std=c11 -I/build/runtime \
-include /build/runtime/el_native_target.h \
-include /build/el_native_vessel.h \
-c /build/native_hello.c -o /build/native_hello.o && \
echo "app compiled OK"
# Patch el_native_vessel.o: localise shared globals (main + TOKEN_* etc.)
RUN nm /build/native_hello.o | awk '/[0-9a-f]+ [TBb] /{print $3}' | sort > /build/.app_syms.txt && \
nm /build/el_native_vessel.o | awk '/[0-9a-f]+ [TBb] /{print $3}' | sort > /build/.vessel_syms.txt && \
comm -12 /build/.app_syms.txt /build/.vessel_syms.txt > /build/.vessel_dups.txt && \
echo "main" >> /build/.vessel_dups.txt && \
sort -u /build/.vessel_dups.txt -o /build/.vessel_dups.txt && \
ARGS=$(awk '{printf "--localize-symbol=%s ", $1}' /build/.vessel_dups.txt) && \
eval "objcopy $ARGS /build/el_native_vessel.o" && \
echo "Patched $(wc -l < /build/.vessel_dups.txt) symbols in el_native_vessel.o"
# Link (GTK4)
RUN gcc \
/build/native_hello.o \
/build/el_native_vessel.o \
/build/el_gtk4.o \
/build/el_runtime.o \
/build/el_seed.o \
$(pkg-config --libs gtk4) -ldl -lpthread -lcurl -lm \
-o /build/native-hello-linux-pi && \
echo "==> Linked: native-hello-linux-pi (GTK4)" && \
file /build/native-hello-linux-pi