From defa243f7f7415d0c7d0b129c81541dba479c2e5 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Tue, 21 Jul 2026 00:31:39 +0000 Subject: [PATCH] ufw: make usrmerge setup.py sed idempotent do_package failed with a fatal QA error: QA Issue: ufw: Files/directories were installed but not shipped in any package: /usr/usr/lib/ufw/... (and on repeated rebuilds /usr/usr/usr/lib/ufw/...) [installed-vs-shipped] Under the usrmerge DISTRO_FEATURE, do_configure:prepend rewrites the single os.path.join('/lib', 'ufw') in setup.py to nonarch_base_libdir (/usr/lib) with an in-place sed. The pattern '/lib' is not anchored, so when do_configure re-runs against an already-patched ${S} (cached unpack/patch, as happens on world rebuilds) it matches the '/lib' inside the previously substituted '/usr/lib' and prepends another /usr, giving /usr/usr/lib and then /usr/usr/usr/lib. FILES:${PN} ships ${nonarch_base_libdir}/ufw (/usr/lib/ufw), so the doubled paths are unshipped and QA fails. Anchor the substitution to the quoted literal '/lib'. After the first run the text is '/usr/lib', which no longer contains '/lib', so re-running do_configure is a no-op. Verified two forced do_configure runs leave os.path.join('/usr/lib', 'ufw') and do_package succeeds. Signed-off-by: Khem Raj --- meta-networking/recipes-connectivity/ufw/ufw_0.36.2.bb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/meta-networking/recipes-connectivity/ufw/ufw_0.36.2.bb b/meta-networking/recipes-connectivity/ufw/ufw_0.36.2.bb index 171d0f6285..c6e106f934 100644 --- a/meta-networking/recipes-connectivity/ufw/ufw_0.36.2.bb +++ b/meta-networking/recipes-connectivity/ufw/ufw_0.36.2.bb @@ -41,7 +41,11 @@ RRECOMMENDS:${PN} = " \ do_configure:prepend() { if ${@bb.utils.contains('DISTRO_FEATURES','usrmerge','true','false',d)}; then - sed -i -e 's|/lib|${nonarch_base_libdir}|' ${S}/setup.py + # setup.py has a single os.path.join('/lib', 'ufw'); anchor the match to + # the quoted literal so re-running do_configure on an already-patched + # ${S} (cached unpack/patch) is a no-op instead of prepending another + # /usr each time (which produced /usr/usr/lib/ufw and QA failures). + sed -i -e "s|'/lib'|'${nonarch_base_libdir}'|" ${S}/setup.py fi }