From 127f2a0eedc1ddf78e97eb57cd14e3a8b703ed53 Mon Sep 17 00:00:00 2001 From: vasilito Date: Sat, 1 Aug 2026 05:02:20 +0300 Subject: [PATCH] qt/qtbase: make cook-time source mutations idempotent (stop vendored-source corruption) Root cause of the recurring line-duplication corruption (duplicate #include , nested #if QT_CONFIG(opengl), duplicate assert.h): several of the recipe's in-place source-munging steps were NOT guarded, so on a committed (vendored) source/ they re-applied every cook and accumulated. Guard the four unguarded ones (qwaylandclientbufferintegration opengl-wrap, qnet_unix ioctl include, corelib CMakeLists REDOX storageinfo block) with grep/marker checks so re-running on an already-patched tree is a no-op. The rest were already guarded or naturally idempotent (text.replace consuming its needle). --- local/recipes/qt/qtbase/recipe.toml | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/local/recipes/qt/qtbase/recipe.toml b/local/recipes/qt/qtbase/recipe.toml index f46b2bf9b3..90b75ed31b 100644 --- a/local/recipes/qt/qtbase/recipe.toml +++ b/local/recipes/qt/qtbase/recipe.toml @@ -285,6 +285,10 @@ done # Patch CMakeLists.txt: Redox uses POSIX statvfs, not Linux statfs. # Exclude qstorageinfo_linux.cpp, include qstorageinfo_unix.cpp instead. +# Idempotency guard: the found_linux block appends a new "CONDITION REDOX" target +# every cook (qstorageinfo_linux.cpp is never removed, so found_linux re-triggers) +# -> duplicate blocks on a vendored source/. Skip if already applied. +if ! grep -q 'qt_internal_extend_target(Core CONDITION REDOX' "${COOKBOOK_SOURCE}/src/corelib/CMakeLists.txt" 2>/dev/null; then awk ' /^qt_internal_extend_target\\(Core CONDITION LINUX AND NOT ANDROID AND NOT VXWORKS/ { sub(/LINUX AND NOT ANDROID AND NOT VXWORKS/, "LINUX AND NOT REDOX AND NOT ANDROID AND NOT VXWORKS") @@ -303,6 +307,7 @@ found_linux && /^)$/ { { print } ' "${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" +fi # Enable QtNetwork — relibc DNS resolver hardened (2026-04-29: use-after-free fix, FD leak fix, # transaction ID validation, RCODE/TC handling, typed error mapping). @@ -318,14 +323,17 @@ from pathlib import Path path = Path(os.environ["COOKBOOK_SOURCE"]) / "src/network/socket/qnet_unix_p.h" text = path.read_text() -text = text.replace( - '''#include +# Idempotency: only add the ioctl include if it is not already present (else a +# vendored source/ accumulates a duplicate "#include " every cook). +if "#include " not in text: + text = text.replace( + '''#include ''', - '''#include + '''#include #include ''', - 1, -) + 1, + ) old = '''#if defined(Q_OS_VXWORKS) # include #else @@ -338,7 +346,7 @@ new = '''#if defined(Q_OS_VXWORKS) # include #endif ''' -text = text.replace(old, new) +text = text.replace(old, new) # replace() is a no-op once already applied path.write_text(text) PY python - <<'PY' @@ -470,6 +478,11 @@ fi # with QT_CONFIG(opengl). Without OpenGL, QPlatformOpenGLContext is not defined. # This allows Wayland client to build with software rendering (shared memory). BUFI="${COOKBOOK_SOURCE}/src/plugins/platforms/wayland/hardwareintegration/qwaylandclientbufferintegration_p.h" +# Idempotency guard: this rewrite is NOT self-limiting across cooks (the done1/2 +# awk flags only prevent repeats within one run), so on a vendored source/ it +# re-wraps every cook -> nested "#if QT_CONFIG(opengl)" corruption. Skip if the +# guard is already present. +if ! grep -q 'QT_CONFIG(opengl)' "${BUFI}" 2>/dev/null; then awk ' /createPlatformOpenGLContext.*QPlatformOpenGLContext/ && !done1 { print "#if QT_CONFIG(opengl)"; print; print "#endif /* QT_CONFIG(opengl) */"; done1=1; next @@ -480,6 +493,7 @@ awk ' { print } ' "${BUFI}" > "${BUFI}.tmp" mv "${BUFI}.tmp" "${BUFI}" +fi # qtypes.h uses static_assert in C mode. relibc's assert.h does not currently expose the # expected macro there, so inject both the include and a bounded fallback macro for C only.