mirror of
https://github.com/commaai/agnos-builder.git
synced 2026-10-28 00:53:48 +08:00
168 lines
7.4 KiB
Docker
168 lines
7.4 KiB
Docker
# check=error=true
|
|
# SPIKE: AGNOS on Void Linux (glibc, runit, eudev). See userspace/void/.
|
|
|
|
# ################## #
|
|
# ### Package ##### #
|
|
# ### Compilation ## #
|
|
# ################## #
|
|
# The adbd and graphics stages are the same Ubuntu stages as Dockerfile.agnos.
|
|
FROM ubuntu:24.04 AS agnos-compiler
|
|
|
|
RUN apt-get update && apt-get install -yq --no-install-recommends build-essential
|
|
|
|
FROM agnos-compiler AS agnos-compiler-adbd
|
|
RUN apt-get update && apt-get install -yq --no-install-recommends \
|
|
ca-certificates curl clang android-libbase-dev android-libcutils-dev android-liblog-dev \
|
|
android-libboringssl-dev libbrotli-dev libcap-dev liblz4-dev libprotobuf-dev protobuf-compiler \
|
|
libsystemd-dev libzstd-dev
|
|
COPY ./userspace/build_adbd.sh ./userspace/adbd-linux.patch /tmp/agnos/
|
|
RUN /tmp/agnos/build_adbd.sh
|
|
# Void has no Android libs, protobuf 35 instead of 3.21 and no libsystemd:
|
|
# bundle every non-glibc/libstdc++ dependency of adbd from Ubuntu.
|
|
RUN mkdir -p /tmp/agnos/adbd-libs && \
|
|
ldd /tmp/agnos/adbd | awk '$2 == "=>" && $3 ~ /^\// { print $3 }' | \
|
|
grep -vE '/(libc|libm|libdl|libpthread|librt|ld-linux-aarch64|libstdc\+\+|libgcc_s)\.so' | \
|
|
xargs -I{} cp -L {} /tmp/agnos/adbd-libs/ && \
|
|
ls -la /tmp/agnos/adbd-libs
|
|
|
|
FROM agnos-compiler AS agnos-compiler-graphics
|
|
RUN apt-get update && apt-get install -yq --no-install-recommends patchelf
|
|
COPY ./userspace/graphics/ /tmp/agnos/graphics-src/
|
|
RUN mkdir -p /tmp/agnos/graphics && \
|
|
cp /tmp/agnos/graphics-src/libgbm.so /tmp/agnos/graphics/ && \
|
|
cp /tmp/agnos/graphics-src/libeglSubDriverWayland.so.patched /tmp/agnos/graphics/libeglSubDriverWayland.so && \
|
|
cd /tmp/agnos/graphics && \
|
|
gcc -shared -fPIC -Os -s -Wall -Wextra -Werror -Wl,-z,defs -Wl,-z,relro,-z,now \
|
|
-Wl,-soname,libagnos-wayland-stubs.so -o libagnos-wayland-stubs.so /tmp/agnos/graphics-src/stubs.c && \
|
|
gcc -shared -fPIC -Os -s -Wall -Wextra -Werror -Wl,-z,defs -Wl,-z,relro,-z,now \
|
|
-Wl,-soname,libCB.so -o libCB.so /tmp/agnos/graphics-src/opencl_stubs.c && \
|
|
nm -D --defined-only libagnos-wayland-stubs.so | \
|
|
awk '$3 ~ /^agnos_/ { name = $3; sub(/^agnos_/, "", name); print name, $3 }' > /tmp/agnos/graphics-symbols.map && \
|
|
for lib in libgbm.so libeglSubDriverWayland.so; do \
|
|
patchelf --rename-dynamic-symbols /tmp/agnos/graphics-symbols.map \
|
|
--remove-needed libwayland-client.so.0 --remove-needed libwayland-server.so.0 \
|
|
--remove-needed libwayland-egl.so.1 --remove-needed libffi.so.6 \
|
|
--add-needed libagnos-wayland-stubs.so "$lib" || exit 1; \
|
|
done
|
|
|
|
# ################## #
|
|
# ###### Base ###### #
|
|
# ################## #
|
|
FROM scratch AS void-base
|
|
|
|
ARG VOID_ROOTFS
|
|
ADD ${VOID_ROOTFS} /
|
|
|
|
RUN mkdir -p /tmp/agnos
|
|
COPY ./userspace/void/base_setup.sh /tmp/agnos/void/
|
|
RUN /tmp/agnos/void/base_setup.sh
|
|
|
|
COPY ./userspace/void/python_setup.sh /tmp/agnos/void/
|
|
RUN /tmp/agnos/void/python_setup.sh
|
|
|
|
# ################### #
|
|
# ###### AGNOS ###### #
|
|
# ################### #
|
|
FROM void-base AS agnos
|
|
|
|
ARG USERNAME=comma
|
|
|
|
COPY --from=agnos-compiler-adbd /tmp/agnos/adbd /usr/comma/adbd
|
|
COPY --from=agnos-compiler-adbd /tmp/agnos/adbd-libs/ /usr/lib/aarch64-linux-gnu/android/
|
|
COPY --from=agnos-compiler-adbd /tmp/adbd-build/packages/modules/adb/NOTICE /usr/share/doc/adbd/NOTICE
|
|
COPY --from=agnos-compiler-graphics /tmp/agnos/graphics/ /usr/lib/aarch64-linux-gnu/
|
|
|
|
ARG XDG_DATA_HOME="/usr/local"
|
|
|
|
# Install openpilot python packages
|
|
COPY ./userspace/uv /tmp/agnos/uv
|
|
RUN source $XDG_DATA_HOME/venv/bin/activate && \
|
|
cd /tmp/agnos/uv && \
|
|
MAKEFLAGS="-j$(nproc)" UV_NO_CACHE=1 UV_PROJECT_ENVIRONMENT=$XDG_DATA_HOME/venv uv sync --frozen --inexact --compile-bytecode \
|
|
--no-install-package msgq \
|
|
--no-install-package opendbc \
|
|
--no-install-package pandacan \
|
|
--no-install-package rednose \
|
|
--no-install-package teleoprtc \
|
|
--no-install-package tinygrad
|
|
|
|
# Root filesystem overlay. Void merges /usr/sbin into /usr/bin and links
|
|
# /usr/lib64 to /usr/lib: keep those directory symlinks, and skip the overlay's
|
|
# usr/lib64/ld-linux-aarch64.so.1 -> /lib/... link, which would become a self-loop.
|
|
RUN --mount=type=bind,source=userspace/root,target=/tmp/agnos/root \
|
|
set -o pipefail && \
|
|
tar -C /tmp/agnos/root --owner=0 --group=0 --mode=go-w --exclude=./usr/lib64 -cf - . | \
|
|
tar -C / --no-overwrite-dir --keep-directory-symlink -xf - && \
|
|
test -x /usr/bin/rmt_storage && test -f /usr/lib/ld-linux-aarch64.so.1 && test ! -L /usr/lib/ld-linux-aarch64.so.1
|
|
COPY ./userspace/root/home/$USERNAME/.config/ /root/.config
|
|
RUN chown -R $USERNAME: /home/$USERNAME/.config
|
|
|
|
COPY ./output/linux-headers/include/ /usr/include/
|
|
|
|
COPY ./userspace/irsc_util.c /tmp/agnos/
|
|
RUN gcc -O2 -Wall -Wextra -Werror -o /usr/bin/irsc_util /tmp/agnos/irsc_util.c && rm /tmp/agnos/irsc_util.c
|
|
|
|
COPY ./userspace/power_burn/power_burn_max.c /tmp/agnos/
|
|
RUN gcc -O2 -o /home/$USERNAME/power_burn_max /tmp/agnos/power_burn_max.c \
|
|
-lpthread && rm /tmp/agnos/power_burn_max.c \
|
|
&& chown $USERNAME: /home/$USERNAME/power_burn_max
|
|
|
|
# color prompt (install_extras.sh)
|
|
RUN sed -i 's/#force_color_prompt=yes/force_color_prompt=yes/g' /home/$USERNAME/.bashrc || true
|
|
|
|
# Prefer ipv4 over ipv6
|
|
RUN echo "precedence ::ffff:0:0/96 100" >> /etc/gai.conf
|
|
|
|
# trim.sh, minus the Ubuntu library paths (handled in finalize.sh)
|
|
RUN site=/usr/local/venv/lib/python3.12/site-packages && \
|
|
find "$site"/{tinymesa,capnp,zstandard,kiwisolver,fontTools} -type f -name '*.so' \
|
|
-exec llvm-strip --strip-debug {} + && \
|
|
find "$site"/{sympy,numpy,matplotlib,mpmath,setuptools} -type d \( -name tests -o -name test \) \
|
|
-prune -exec rm -rf {} + && \
|
|
rm -f /usr/bin/*lto-dump* /usr/lib/llvm/*/bin/llvm-exegesis /usr/local/bin/llvm-exegesis
|
|
|
|
# Services, Void config fixups, read-only rootfs. Keep this last (runs ldconfig
|
|
# before pointing the GL SONAME links at Adreno).
|
|
COPY ./userspace/void/ /tmp/agnos/void/
|
|
RUN /tmp/agnos/void/finalize.sh && rm -rf /tmp/agnos
|
|
|
|
COPY VERSION /VERSION
|
|
|
|
RUN rm -rf /usr/share/icons/* /home/$USERNAME/.cache /root/.cache /usr/default/home/$USERNAME/.cache /usr/default/var/cache/xbps
|
|
|
|
# ################## #
|
|
# ##### Image ###### #
|
|
# ################## #
|
|
# Same as Dockerfile.agnos, except resolv.conf and ping.
|
|
FROM --platform=$BUILDPLATFORM ubuntu:20.04 AS agnos-image-tools
|
|
RUN apt-get update && \
|
|
apt-get install -yq --no-install-recommends \
|
|
android-sdk-libsparse-utils \
|
|
e2fsprogs \
|
|
libcap2-bin \
|
|
zstd \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
FROM agnos-image-tools AS agnos-image-build
|
|
ARG ROOTFS_IMAGE_SIZE=4500M
|
|
ARG GIT_HASH
|
|
ARG BUILD_DATETIME
|
|
ARG ZSTD
|
|
# No systemd-resolved: NetworkManager writes resolv.conf itself (dns=default).
|
|
# bin/ping is a symlink on Void, so set the capability on the real binary.
|
|
RUN --mount=type=bind,from=agnos,target=/rootfs,rw \
|
|
cd /rootfs && \
|
|
ln -sf /proc/sys/kernel/hostname etc/hostname && \
|
|
printf "127.0.0.1 localhost.localdomain localhost\n127.0.0.1 comma\n" > etc/hosts && \
|
|
ln -sf /run/NetworkManager/resolv.conf etc/resolv.conf && \
|
|
setcap cap_net_raw+ep usr/bin/iputils-ping && \
|
|
printf "%s\n%s\n" "$GIT_HASH" "$BUILD_DATETIME" > BUILD && \
|
|
mkdir /out && \
|
|
mkfs.ext4 -q -d /rootfs /tmp/system.img $ROOTFS_IMAGE_SIZE && \
|
|
img2simg /tmp/system.img /out/system.img && \
|
|
rm /tmp/system.img && \
|
|
if [ -n "$ZSTD" ]; then zstd -q -T0 -9 --rm /out/system.img; fi
|
|
|
|
FROM scratch AS agnos-image
|
|
COPY --from=agnos-image-build /out/ /
|