284 lines
10 KiB
Bash
Executable File
284 lines
10 KiB
Bash
Executable File
#!/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 <<EOF
|
|
https://mirror.nura.eco/postmarketos/v26.06
|
|
https://dl-cdn.alpinelinux.org/alpine/edge/main
|
|
https://dl-cdn.alpinelinux.org/alpine/edge/community
|
|
https://dl-cdn.alpinelinux.org/alpine/edge/testing
|
|
EOF
|
|
cp /bananarchy/keys/* /etc/apk/keys/
|
|
|
|
echo "[1/5] Installing host cross-compilation toolchain and meson/ninja..."
|
|
apk add --no-cache \
|
|
build-base \
|
|
git \
|
|
ca-certificates \
|
|
patch \
|
|
gcc-armv7 \
|
|
g++-armv7 \
|
|
binutils-armv7 \
|
|
meson \
|
|
ninja \
|
|
pkgconf \
|
|
python3 >/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 <<EOF
|
|
[binaries]
|
|
c = '\''armv7-alpine-linux-musleabihf-gcc'\''
|
|
cpp = '\''armv7-alpine-linux-musleabihf-g++'\''
|
|
ar = '\''armv7-alpine-linux-musleabihf-ar'\''
|
|
strip = '\''armv7-alpine-linux-musleabihf-strip'\''
|
|
pkg-config = '\''pkgconf'\''
|
|
|
|
[built-in options]
|
|
c_args = ['\''--sysroot=/tmp/armv7-sysroot'\'', '\''-O2'\'', '\''-march=armv7-a'\'', '\''-mtune=cortex-a7'\'', '\''-mfpu=neon-vfpv4'\'', '\''-mfloat-abi=hard'\'', '\''-fno-plt'\'', '\''-fomit-frame-pointer'\'']
|
|
c_link_args = ['\''--sysroot=/tmp/armv7-sysroot'\'', '\''-Wl,-O1,--as-needed'\'']
|
|
|
|
[properties]
|
|
sys_root = '\''/tmp/armv7-sysroot'\''
|
|
pkg_config_libdir = '\''/tmp/armv7-sysroot/usr/lib/pkgconfig:/tmp/armv7-sysroot/usr/share/pkgconfig'\''
|
|
|
|
[host_machine]
|
|
system = '\''linux'\''
|
|
cpu_family = '\''arm'\''
|
|
cpu = '\''armv7l'\''
|
|
endian = '\''little'\''
|
|
EOF
|
|
|
|
ABI_MOD_DIR="/usr/lib/xorg/modules/xlibre-25"
|
|
if [ "${FORCE_REBUILD:-0}" = "1" ] || [ ! -f /bananarchy/prebuilt/xlibre/usr/bin/Xorg ] || ! grep -q "continuing in shared VT mode" /bananarchy/prebuilt/xlibre/usr/bin/Xorg 2>/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 <<EOF
|
|
#include "xorg-server.h"
|
|
#define PACKAGE_VERSION_MAJOR 0
|
|
#define PACKAGE_VERSION_MINOR 5
|
|
#define PACKAGE_VERSION_PATCHLEVEL 0
|
|
EOF
|
|
armv7-alpine-linux-musleabihf-gcc \
|
|
--sysroot="$SYSROOT" \
|
|
$OPT_CFLAGS -shared -fPIC \
|
|
-I/tmp/fbdev-inc \
|
|
-I"$SYSROOT/usr/include/xorg" \
|
|
-I"$SYSROOT/usr/include/pixman-1" \
|
|
-I"$SYSROOT/usr/include/X11/dri" \
|
|
-I"$SYSROOT/usr/include/libdrm" \
|
|
/bananarchy/src/xf86-video-fbdev/src/fbdev.c \
|
|
-o "/bananarchy/prebuilt/xlibre$ABI_MOD_DIR/drivers/fbdev_drv.so"
|
|
|
|
echo "[5/5] Stripping Xlibre binaries and installing into prebuilt, overlay, and rootfs..."
|
|
find /bananarchy/prebuilt/xlibre/usr/bin /bananarchy/prebuilt/xlibre/usr/lib -type f \( -name "Xorg" -o -name "gtf" -o -name "*.so" \) -exec armv7-alpine-linux-musleabihf-strip --strip-unneeded {} +
|
|
|
|
rm -rf /bananarchy/prebuilt/xlibre/usr/share/X11/xorg.conf.d/10-nvidia*.conf \
|
|
/bananarchy/prebuilt/xlibre/etc/X11/xorg.conf.d/10-nvidia*
|
|
|
|
mkdir -p /bananarchy/overlay/rootfs/usr/bin \
|
|
/bananarchy/overlay/rootfs/usr/lib/xorg \
|
|
/bananarchy/overlay/rootfs/usr/share/X11/xorg.conf.d
|
|
cp -a /bananarchy/prebuilt/xlibre/usr/bin/. /bananarchy/overlay/rootfs/usr/bin/
|
|
cp -a /bananarchy/prebuilt/xlibre/usr/lib/xorg/. /bananarchy/overlay/rootfs/usr/lib/xorg/
|
|
cp -a /bananarchy/prebuilt/xlibre/usr/share/X11/xorg.conf.d/. /bananarchy/overlay/rootfs/usr/share/X11/xorg.conf.d/
|
|
|
|
if [ -d /target-rootfs/usr ]; then
|
|
cp -a /bananarchy/overlay/rootfs/usr/bin/Xorg /bananarchy/overlay/rootfs/usr/bin/X /bananarchy/overlay/rootfs/usr/bin/gtf /target-rootfs/usr/bin/
|
|
cp -a /bananarchy/overlay/rootfs/usr/lib/xorg/. /target-rootfs/usr/lib/xorg/
|
|
cp -a /bananarchy/overlay/rootfs/usr/share/X11/xorg.conf.d/. /target-rootfs/usr/share/X11/xorg.conf.d/
|
|
fi
|
|
|
|
chown -R "$HOST_UID:$HOST_GID" /bananarchy/prebuilt/xlibre /bananarchy/overlay/rootfs/usr /target-rootfs/usr/lib/xorg /target-rootfs/usr/share/X11/xorg.conf.d /target-rootfs/usr/bin/Xorg /target-rootfs/usr/bin/X /target-rootfs/usr/bin/gtf 2>/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
|
|
'
|