From ab9ccae80fda6600d83d976c91190a7dc424c0b6 Mon Sep 17 00:00:00 2001 From: vasilito Date: Wed, 5 Aug 2026 00:52:14 +0300 Subject: [PATCH] xcb-util-image: build for Redox; search recipe sysroot for autoconf macros Three separate defects, one per class: 1. script.rs passed autoreconf only -I${COOKBOOK_HOST_SYSROOT}/share/aclocal, so macros installed by a DEPENDENCY into the per-recipe sysroot were invisible. util-macros was built and declared as a dependency, yet configure still said configure.ac:10: error: must install xorg-macros 1.16.0 or later Now also searches ${COOKBOOK_SYSROOT}/usr/share/aclocal and exports ACLOCAL_PATH. Fixed generically -- every autotools recipe benefits. 2. Upstream builds test/test_xcb_image_shm unconditionally (Makefile.am:15 SUBDIRS = image test) and it needs SysV shared memory, which Redox lacks. The library itself does not: configure only probes sys/shm.h and adapts. So dropping test/ removes a test binary, not functionality. 3. libxcb is a STATIC archive here, so its libXau/libXdmcp dependencies do not propagate to consumers as a shared library's DT_NEEDED would: xcb_auth.c: undefined reference to `XauGetBestAuthByAddr' Named them via LIBS, not LDFLAGS: autoconf emits LDFLAGS BEFORE the objects and LIBS AFTER, and a static archive only satisfies symbols referenced by objects preceding it. With -lXau in LDFLAGS the link still failed while libXau.a sat in the sysroot. Same ordering rule as -lgcc in redox-toolchain.cmake and -licudata in plasma-workspace -- third occurrence. Verified: cook xcb-util-image - successful, libxcb-image.a staged. --- recipes/x11/xcb-util-image/recipe.toml | 25 +++++++++++++++++++++++++ src/cook/script.rs | 11 ++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/recipes/x11/xcb-util-image/recipe.toml b/recipes/x11/xcb-util-image/recipe.toml index 93ce6b43ea..3003da494a 100644 --- a/recipes/x11/xcb-util-image/recipe.toml +++ b/recipes/x11/xcb-util-image/recipe.toml @@ -6,6 +6,14 @@ version = "0.4.1" tar = "https://www.x.org/releases/individual/lib/xcb-util-image-0.4.1.tar.xz" blake3 = "c8a0652f7c215bd312d9f238aed2ba6a122f087b623dafbbac4456f5351df603" script = """ +# Drop the test/ subdirectory before regenerating. Upstream builds +# test/test_xcb_image_shm unconditionally (Makefile.am:15 SUBDIRS = image test), +# and it uses SysV shared memory, which Redox does not provide: +# make[2]: *** [Makefile:655: test_xcb_image_shm] Error 1 +# The LIBRARY itself (image/) has no such dependency -- configure only probes +# sys/shm.h with AC_CHECK_HEADERS and adapts. So this removes a test binary, +# not functionality: xcb-util-image still builds and installs in full. +sed -i 's/^SUBDIRS = image test$/SUBDIRS = image/' Makefile.am autotools_recursive_regenerate """ @@ -13,10 +21,27 @@ autotools_recursive_regenerate dependencies = [ # XORG_MACROS_VERSION() in configure.ac -- autoreconf fails without it. "util-macros", + # libxcb here is STATIC, so its own dependencies do not propagate to + # consumers the way a shared library's DT_NEEDED would. Without these the + # link fails on libXau/libXdmcp symbols pulled in by xcb_auth.c: + # undefined reference to `XauGetBestAuthByAddr' + "libxau", + "libxdmcp", "xcb-util", ] template = "custom" script = """ DYNAMIC_INIT + +# Name libXau/libXdmcp explicitly: pkg-config's non-static --libs for xcb omits +# them (they are Libs.private), but our libxcb is a static archive so they are +# genuinely required at link time. +# +# LIBS, not LDFLAGS. autoconf emits LDFLAGS BEFORE the objects and LIBS AFTER, +# and a static archive only satisfies symbols referenced by objects that precede +# it -- with -lXau in LDFLAGS the link still failed on XauGetBestAuthByAddr even +# though libXau.a was present in the sysroot. Same ordering rule as the -lgcc +# entry in redox-toolchain.cmake and -licudata in plasma-workspace. +export LIBS="${LIBS:-} -lXau -lXdmcp" cookbook_configure """ diff --git a/src/cook/script.rs b/src/cook/script.rs index a4f562dff4..9e8f1577b2 100644 --- a/src/cook/script.rs +++ b/src/cook/script.rs @@ -55,7 +55,16 @@ COOKBOOK_AUTORECONF="autoreconf" autotools_recursive_regenerate() { for f in $(find . -name configure.ac -o -name configure.in -type f | sort); do echo "* autotools regen in '$(dirname $f)'..." - ( cd "$(dirname "$f")" && "${COOKBOOK_AUTORECONF}" -fvi "$@" -I${COOKBOOK_HOST_SYSROOT}/share/aclocal ) + # Search the RECIPE sysroot as well as the host one. Autoconf macros + # installed by a dependency (util-macros ships xorg-macros.m4) land in + # the consumer's own sysroot, not the shared host sysroot, so passing + # only COOKBOOK_HOST_SYSROOT made them invisible: + # configure.ac:10: error: must install xorg-macros 1.16.0 or later + # even with util-macros built and listed as a dependency (xcb-util-image). + ( cd "$(dirname "$f")" && ACLOCAL_PATH="${COOKBOOK_SYSROOT}/usr/share/aclocal:${COOKBOOK_SYSROOT}/share/aclocal:${ACLOCAL_PATH:-}" \ + "${COOKBOOK_AUTORECONF}" -fvi "$@" \ + -I${COOKBOOK_SYSROOT}/usr/share/aclocal \ + -I${COOKBOOK_HOST_SYSROOT}/share/aclocal ) done }