#!/bin/sh # Cross-compile Xlibre (X11Libre/xserver) + xf86-input-libinput + xf86-video-fbdev # optimized for Qualcomm MSM8905/MSM8909 (ARMv7 Cortex-A7 + NEON-VFPv4, 240x320 KMS/SPI) set -eu BASE_DIR="$(cd "$(dirname "$0")/.." && pwd)" ROOTFS_DIR="${ROOTFS_DIR:-$BASE_DIR/rootfs}" if [ -e "$ROOTFS_DIR" ]; then ROOTFS_DIR="$(realpath "$ROOTFS_DIR")" fi exec docker run --rm --network=host \ -e HOST_UID="$(id -u)" \ -e HOST_GID="$(id -g)" \ -e FORCE_REBUILD="${FORCE_REBUILD:-0}" \ -v "$BASE_DIR:/bananarchy" \ -v "$ROOTFS_DIR:/target-rootfs" \ alpine:3.24 sh -eu -c ' cat > /etc/apk/repositories </dev/null XLIBRE_SRC="/bananarchy/src/xlibre" if [ ! -f "$XLIBRE_SRC/meson.build" ]; then echo "[1b/5] Cloning X11Libre/xserver and applying Bananarchy MSM8905 SPI DRM patch..." XLIBRE_SRC="/tmp/xlibre-src" rm -rf "$XLIBRE_SRC" git clone --depth 1 https://github.com/X11Libre/xserver.git "$XLIBRE_SRC" patch -d "$XLIBRE_SRC" -p1 < /bananarchy/patches/xlibre/0001-xlibre-msm8905-spi-drm-and-shared-vt.patch fi echo "[2/5] Preparing armv7 sysroot for Xlibre + DDX drivers..." SYSROOT="/tmp/armv7-sysroot" mkdir -p "$SYSROOT/etc/apk/keys" cp /etc/apk/repositories "$SYSROOT/etc/apk/repositories" cp /etc/apk/keys/* "$SYSROOT/etc/apk/keys/" apk --root "$SYSROOT" --initdb --arch armv7 add --no-scripts \ alpine-baselayout \ musl-dev \ linux-headers \ xorgproto \ xtrans \ font-util-dev \ pixman-dev \ libx11-dev \ libxext-dev \ libxfont2-dev \ libxkbfile-dev \ libxshmfence-dev \ libxdmcp-dev \ libxau-dev \ libxcvt-dev \ libdrm-dev \ mesa-dev \ eudev-dev \ dbus-dev \ libpciaccess-dev \ openssl-dev \ libinput-dev \ mtdev-dev >/dev/null OPT_CFLAGS="-O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -fno-plt -fomit-frame-pointer" cat > /tmp/armv7-cross.ini </dev/null; then echo "[3/5] Configuring and compiling Xlibre (X11Libre/xserver) for armv7..." rm -rf /tmp/build-xlibre meson setup /tmp/build-xlibre "$XLIBRE_SRC" \ --cross-file=/tmp/armv7-cross.ini \ --prefix=/usr \ --libdir=lib \ --libexecdir=libexec \ --sysconfdir=/etc \ --localstatedir=/var \ --buildtype=release \ -Dxorg=true \ -Dxorg-sdk=true \ -Dglamor=false \ -Dglx=false \ -Ddri1=false \ -Ddri2=true \ -Ddri3=true \ -Ddrm=true \ -Dgbm=true \ -Dudev=true \ -Dudev_kms=true \ -Dsystemd_logind=true \ -Dseatd_libseat=false \ -Dsuid_wrapper=false \ -Dpciaccess=true \ -Dvgahw=false \ -Dint10=false \ -Ddga=false \ -Dxv=false \ -Dxvmc=false \ -Dxephyr=false \ -Dxnest=false \ -Dxvfb=false \ -Dxfake=false \ -Dxfbdev=false \ -Dxmodesetting=false \ -Dxf86-input-inputtest=false \ -Dxf86-input-null=false \ -Dlegacy_nvidia_340x=false \ -Dlegacy_nvidia_padding=false \ -Ddocs=false \ -Ddevel-docs=false \ -Dtests=false \ -Dlibunwind=false \ -Dsha1=libcrypto \ -Dinput_thread=true \ -Ddefault_font_path=/usr/share/fonts/misc,/usr/share/fonts/TTF,/usr/share/fonts/OTF \ -Dxkb_dir=/usr/share/X11/xkb \ -Dxkb_output_dir=/tmp \ -Dxkb_bin_dir=/usr/bin \ -Dlog_dir=/tmp ninja -C /tmp/build-xlibre -j"$(nproc)" rm -rf /bananarchy/prebuilt/xlibre mkdir -p /bananarchy/prebuilt/xlibre DESTDIR="/bananarchy/prebuilt/xlibre" ninja -C /tmp/build-xlibre install elif ! grep -q "Failed to allocate cursor BOs" "/bananarchy/prebuilt/xlibre$ABI_MOD_DIR/drivers/modesetting_drv.so" 2>/dev/null; then echo "[3/5] Rebuilding patched modesetting_drv.so in Xlibre..." rm -rf /tmp/build-xlibre meson setup /tmp/build-xlibre "$XLIBRE_SRC" \ --cross-file=/tmp/armv7-cross.ini \ --prefix=/usr \ --libdir=lib \ --libexecdir=libexec \ --sysconfdir=/etc \ --localstatedir=/var \ --buildtype=release \ -Dxorg=true \ -Dxorg-sdk=true \ -Dglamor=false \ -Dglx=false \ -Ddri1=false \ -Ddri2=true \ -Ddri3=true \ -Ddrm=true \ -Dgbm=true \ -Dudev=true \ -Dudev_kms=true \ -Dsystemd_logind=true \ -Dseatd_libseat=false \ -Dsuid_wrapper=false \ -Dpciaccess=true \ -Dvgahw=false \ -Dint10=false \ -Ddga=false \ -Dxv=false \ -Dxvmc=false \ -Dxephyr=false \ -Dxnest=false \ -Dxvfb=false \ -Dxfake=false \ -Dxfbdev=false \ -Dxmodesetting=false \ -Dxf86-input-inputtest=false \ -Dxf86-input-null=false \ -Dlegacy_nvidia_340x=false \ -Dlegacy_nvidia_padding=false \ -Ddocs=false \ -Ddevel-docs=false \ -Dtests=false \ -Dlibunwind=false \ -Dsha1=libcrypto \ -Dinput_thread=true \ -Dxkb_dir=/usr/share/X11/xkb \ -Dxkb_output_dir=/tmp \ -Dxkb_bin_dir=/usr/bin \ -Dlog_dir=/tmp ninja -C /tmp/build-xlibre -j"$(nproc)" hw/xfree86/drivers/video/modesetting/modesetting_drv.so cp -f /tmp/build-xlibre/hw/xfree86/drivers/video/modesetting/modesetting_drv.so "/bananarchy/prebuilt/xlibre$ABI_MOD_DIR/drivers/modesetting_drv.so" else echo "[3/5] Reusing compiled Xlibre in /bananarchy/prebuilt/xlibre..." fi if [ -d /bananarchy/prebuilt/xlibre/tmp/armv7-sysroot/usr ]; then cp -a /bananarchy/prebuilt/xlibre/tmp/armv7-sysroot/usr/. /bananarchy/prebuilt/xlibre/usr/ rm -rf /bananarchy/prebuilt/xlibre/tmp fi cp -a /bananarchy/prebuilt/xlibre/usr/. "$SYSROOT/usr/" echo "[4/5] Compiling X11Libre/xf86-input-libinput and xf86-video-fbdev against Xlibre SDK..." ABI_MOD_DIR="/usr/lib/xorg/modules/xlibre-25" if [ ! -f "/bananarchy/prebuilt/xlibre$ABI_MOD_DIR/input/libinput_drv.so" ]; then rm -rf /tmp/build-libinput meson setup /tmp/build-libinput /bananarchy/src/xf86-input-libinput \ --cross-file=/tmp/armv7-cross.ini \ --prefix=/usr \ --libdir=lib \ --sysconfdir=/etc \ --buildtype=release \ -Dxorg-module-dir="$ABI_MOD_DIR/input" \ -Dsdkdir=/usr/include/xorg \ -Dxorg-conf-dir=/usr/share/X11/xorg.conf.d ninja -C /tmp/build-libinput -j"$(nproc)" DESTDIR="/bananarchy/prebuilt/xlibre" ninja -C /tmp/build-libinput install fi mkdir -p "/bananarchy/prebuilt/xlibre$ABI_MOD_DIR/drivers" /tmp/fbdev-inc cat > /tmp/fbdev-inc/config.h </dev/null || true ls -lh /bananarchy/prebuilt/xlibre/usr/bin/Xorg "/bananarchy/prebuilt/xlibre$ABI_MOD_DIR/drivers/"*.so "/bananarchy/prebuilt/xlibre$ABI_MOD_DIR/input/"*.so '