From 043c7ba0d7bc7cbe9aadf3627e831d952860c43b Mon Sep 17 00:00:00 2001 From: Vasilito Date: Wed, 15 Apr 2026 12:57:45 +0100 Subject: [PATCH] Refresh Qt integration tooling Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- local/recipes/qt/redox-toolchain.cmake | 6 +-- local/recipes/qt/redox_waitid.c | 13 ------ recipes/wip/qt/qtbase/recipe.toml | 55 +++++++++----------------- 3 files changed, 22 insertions(+), 52 deletions(-) delete mode 100644 local/recipes/qt/redox_waitid.c diff --git a/local/recipes/qt/redox-toolchain.cmake b/local/recipes/qt/redox-toolchain.cmake index edba32d5..d8ae01e6 100644 --- a/local/recipes/qt/redox-toolchain.cmake +++ b/local/recipes/qt/redox-toolchain.cmake @@ -124,12 +124,12 @@ set(CMAKE_PLATFORM_USES_PATH_WHEN_NO_SONAME 1) # --- Redox POSIX compatibility shims --- # relibc's assert.h does not define static_assert (C11 macro). Provide it for C only # (C++ has it as a keyword — redefining would cause errors in try_compile checks). -# Also provide waitid() idtype constants P_PID, P_PGID, P_ALL (missing from relibc). set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dstatic_assert=_Static_assert -DP_ALL=0 -DP_PID=1 -DP_PGID=2 -Dvfork=fork" CACHE STRING "") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DP_ALL=0 -DP_PID=1 -DP_PGID=2 -Dvfork=fork" CACHE STRING "") -# relibc lacks waitid() — the stub is injected directly into Qt's Core library via -# target_sources() in the qtbase recipe. No linker flags needed here. +# relibc now provides waitid() itself, but qtbase/forkfd still does not reliably pick up the +# P_PID / P_PGID / P_ALL constants through the active cross-build include path, so keep the +# constants forced here until the downstream build proves them redundant. # --- Qt6 cross-compilation helpers --- # QT_MKSPECS_DIR: Qt6's QtMkspecHelpers.cmake sets this from QT_SOURCE_TREE, diff --git a/local/recipes/qt/redox_waitid.c b/local/recipes/qt/redox_waitid.c deleted file mode 100644 index 3ba499b9..00000000 --- a/local/recipes/qt/redox_waitid.c +++ /dev/null @@ -1,13 +0,0 @@ -/* Redox POSIX compat: waitid() stub for relibc. - relibc has waitpid() but waitid() is unimplemented (commented out). - Qt's forkfd.c calls waitid(P_PID, ...) for child readiness checks. - Returning -1 (no children ready) is safe — fork() still works for process spawning. */ -#include - -int waitid(int idtype, int id, siginfo_t *info, int options) { - (void)idtype; - (void)id; - (void)info; - (void)options; - return -1; -} diff --git a/recipes/wip/qt/qtbase/recipe.toml b/recipes/wip/qt/qtbase/recipe.toml index 44352861..69225bd2 100644 --- a/recipes/wip/qt/qtbase/recipe.toml +++ b/recipes/wip/qt/qtbase/recipe.toml @@ -19,6 +19,21 @@ dependencies = [ script = """ DYNAMIC_INIT +RELIBC_STAGE_INCLUDE="${COOKBOOK_ROOT}/recipes/core/relibc/target/${TARGET}/stage/usr/include" +RELIBC_STAGE_LIB="${COOKBOOK_ROOT}/recipes/core/relibc/target/${TARGET}/stage/usr/lib" +if [ -d "${RELIBC_STAGE_INCLUDE}" ]; then + mkdir -p "${COOKBOOK_SYSROOT}/include" + cp -a "${RELIBC_STAGE_INCLUDE}/." "${COOKBOOK_SYSROOT}/include/" + export CPPFLAGS="${CPPFLAGS} -I${RELIBC_STAGE_INCLUDE}" + export CFLAGS="${CFLAGS} -I${RELIBC_STAGE_INCLUDE}" + export CXXFLAGS="${CXXFLAGS} -I${RELIBC_STAGE_INCLUDE}" +fi +if [ -d "${RELIBC_STAGE_LIB}" ]; then + mkdir -p "${COOKBOOK_SYSROOT}/lib" + cp -a "${RELIBC_STAGE_LIB}/." "${COOKBOOK_SYSROOT}/lib/" + export LDFLAGS="-L${RELIBC_STAGE_LIB} -Wl,-rpath-link,${RELIBC_STAGE_LIB} ${LDFLAGS}" +fi + # ============================================================ # Step 1: Build Qt host tools (moc, rcc, uic) on the host # These are needed for cross-compilation — Qt6 generates code @@ -104,12 +119,6 @@ typedef struct statvfs statfs; STATFS_EOF fi -# relibc lacks resolv.h (DNS resolver). QtNetwork includes it unconditionally on Unix. -# Provide an empty stub — DNS resolution won't work but basic socket networking will. -if [ ! -f "${COOKBOOK_SYSROOT}/include/resolv.h" ]; then - touch "${COOKBOOK_SYSROOT}/include/resolv.h" -fi - # Ensure private forwarding headers exist for Unix-specific includes # syncqt may not generate these for unknown platforms like Redox mkdir -p "${COOKBOOK_SOURCE}/src/corelib/QtCore/private" @@ -141,8 +150,9 @@ found_linux && /^)$/ { ' "${COOKBOOK_SOURCE}/src/corelib/CMakeLists.txt" > "${COOKBOOK_SOURCE}/src/corelib/CMakeLists.txt.tmp" mv "${COOKBOOK_SOURCE}/src/corelib/CMakeLists.txt.tmp" "${COOKBOOK_SOURCE}/src/corelib/CMakeLists.txt" -# Disable QtNetwork — relibc lacks resolv.h, in6_pktinfo, SIOCGIF* ioctls. -# Will be re-enabled when POSIX networking gaps are filled in relibc. +# Disable QtNetwork — relibc now provides a minimal resolv.h and bounded interface view, +# but broader networking/runtime compatibility (for example `in6_pktinfo`, richer interface +# semantics, and full downstream validation) is still incomplete. sed -i 's/^ add_subdirectory(network)/ # add_subdirectory(network) # disabled for Redox/' \ "${COOKBOOK_SOURCE}/src/CMakeLists.txt" # Disable TUIO touch plugin — depends on QtNetwork which is disabled @@ -196,31 +206,6 @@ if ! grep -q 'sys/ioctl.h' "${QP}" 2>/dev/null; then mv "${QP}.tmp" "${QP}" fi -# Compile waitid() stub into sysroot lib — relibc lacks waitid() (unimplemented). -# Qt's forkfd.c (QProcess backend) calls waitid(P_PID, ...) for child readiness. -# The -1 return means "no children ready" — safe for process spawning via fork+exec. -x86_64-unknown-redox-gcc -c -O2 -o "${COOKBOOK_SYSROOT}/lib/redox_waitid.o" \ - "${COOKBOOK_ROOT}/local/recipes/qt/redox_waitid.c" -x86_64-unknown-redox-ar rcs "${COOKBOOK_SYSROOT}/lib/libredox_waitid.a" \ - "${COOKBOOK_SYSROOT}/lib/redox_waitid.o" - -# Also add waitid() declaration to sys/wait.h so forkfd.c sees it -WAIT_H="${COOKBOOK_SYSROOT}/include/sys/wait.h" -if [ -f "${WAIT_H}" ] && ! grep -q 'waitid.*siginfo_t' "${WAIT_H}" 2>/dev/null; then - awk '/^#endif/ { print "/* Redox: waitid() declaration */"; print "int waitid(int,int,siginfo_t*,int);" } { print }' \ - "${WAIT_H}" > "${WAIT_H}.tmp" - mv "${WAIT_H}.tmp" "${WAIT_H}" -fi - -# Inject waitid.o into Qt's Core library sources so it links into libQt6Core -CORE_CMAKE="${COOKBOOK_SOURCE}/src/corelib/CMakeLists.txt" -if ! grep -q 'redox_waitid' "${CORE_CMAKE}" 2>/dev/null; then - WAIT_O="${COOKBOOK_SYSROOT}/lib/redox_waitid.o" - awk '/target_sources\\(Core/ && !done { print; print " '"${WAIT_O}"'"; done=1; next } { print }' \ - "${CORE_CMAKE}" > "${CORE_CMAKE}.tmp" - mv "${CORE_CMAKE}.tmp" "${CORE_CMAKE}" -fi - cmake "${COOKBOOK_SOURCE}" \ -DCMAKE_TOOLCHAIN_FILE="${COOKBOOK_ROOT}/local/recipes/qt/redox-toolchain.cmake" \ -DQT_HOST_PATH="${HOST_BUILD}" \ @@ -247,9 +232,7 @@ cmake "${COOKBOOK_SOURCE}" \ -DFEATURE_xlib=OFF \ -DFEATURE_vulkan=OFF \ -DFEATURE_process=ON \ - -DFEATURE_sharedmemory=OFF \ - -DFEATURE_systemsemaphore=OFF \ - -DFEATURE_testlib=OFF \ + -DFEATURE_testlib=OFF \ -DFEATURE_sql=OFF \ -DFEATURE_printsupport=OFF \ -DFEATURE_system_zlib=ON \