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 <khem.raj@oss.qualcomm.com>
This commit is contained in:
Khem Raj
2026-07-21 00:31:39 +00:00
parent cfacdd3f2e
commit defa243f7f
@@ -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
}