* [PATCH] classes-global/license: create -lic package from PKGD, not D
@ 2026-08-27 15:52 roman.nazarenko
2026-08-28 13:59 ` [OE-core] " Richard Purdie
0 siblings, 1 reply; 2+ messages in thread
From: roman.nazarenko @ 2026-08-27 15:52 UTC (permalink / raw)
To: openembedded-core; +Cc: Roman Nazarenko
From: Roman Nazarenko <roman.nazarenko@leica-geosystems.com>
do_package and do_populate_sysroot are siblings - both are only ordered
"after do_install" - so they run concurrently. With
LICENSE_CREATE_PACKAGE=1, perform_packagecopy:prepend wrote the
LIC_FILES_CHKSUM texts straight into ${D}${datadir}/licenses/${PN}/,
mutating the very tree do_populate_sysroot stages with find|cpio:
| DEBUG: Executing shell function sysroot_stage_all
| cpio: ./licenses/libmodule/LICENSE: Cannot stat: No such file or directory
| WARNING: exit code 2 from a shell command.
copy_license_files() removes and re-links an already existing
destination, so a file can be listed by find and gone by the time cpio
stats it.
Write into ${PKGD} from a perform_packagecopy:append instead. By then
${D} is complete and untouched, and ${PKGD} is a private copy that
do_populate_sysroot never reads. Package contents, on-target paths and
ownership are unchanged - do_package is a fakeroot task, so the
os.chown() in copy_license_files() still applies. As a side effect the
license texts stop being staged into every target recipe's sysroot,
which they had no business being in.
This changes perform_packagecopy, so do_package basehashes change for
every recipe; expect a one-time repackage.
Signed-off-by: Roman Nazarenko <roman.nazarenko@leica-geosystems.com>
---
meta/classes-global/license.bbclass | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/meta/classes-global/license.bbclass b/meta/classes-global/license.bbclass
index 86c9ee5878..1d266dd25d 100644
--- a/meta/classes-global/license.bbclass
+++ b/meta/classes-global/license.bbclass
@@ -38,14 +38,15 @@ python do_populate_lic() {
oe.qa.exit_if_errors(d)
}
-# it would be better to copy them in do_install:append, but find_license_files is python
-python perform_packagecopy:prepend () {
+# Write into PKGD, not D: do_populate_sysroot stages D concurrently and races
+# with the remove-then-relink in copy_license_files().
+python perform_packagecopy:append () {
enabled = oe.data.typed_value('LICENSE_CREATE_PACKAGE', d)
if d.getVar('CLASSOVERRIDE') == 'class-target' and enabled:
lic_files_paths = find_license_files(d)
- # LICENSE_FILES_DIRECTORY starts with '/' so os.path.join cannot be used to join D and LICENSE_FILES_DIRECTORY
- destdir = d.getVar('D') + os.path.join(d.getVar('LICENSE_FILES_DIRECTORY'), d.getVar('PN'))
+ # LICENSE_FILES_DIRECTORY starts with '/' so os.path.join cannot be used to join PKGD and LICENSE_FILES_DIRECTORY
+ destdir = d.getVar('PKGD') + os.path.join(d.getVar('LICENSE_FILES_DIRECTORY'), d.getVar('PN'))
copy_license_files(lic_files_paths, destdir)
add_package_and_files(d)
}
--
2.43.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [OE-core] [PATCH] classes-global/license: create -lic package from PKGD, not D
2026-08-27 15:52 [PATCH] classes-global/license: create -lic package from PKGD, not D roman.nazarenko
@ 2026-08-28 13:59 ` Richard Purdie
0 siblings, 0 replies; 2+ messages in thread
From: Richard Purdie @ 2026-08-28 13:59 UTC (permalink / raw)
To: roman.nazarenko, openembedded-core
On Thu, 2026-08-27 at 17:52 +0200, roman.nazarenko via lists.openembedded.org wrote:
> From: Roman Nazarenko <roman.nazarenko@leica-geosystems.com>
>
> do_package and do_populate_sysroot are siblings - both are only ordered
> "after do_install" - so they run concurrently. With
> LICENSE_CREATE_PACKAGE=1, perform_packagecopy:prepend wrote the
> LIC_FILES_CHKSUM texts straight into ${D}${datadir}/licenses/${PN}/,
> mutating the very tree do_populate_sysroot stages with find|cpio:
>
> | DEBUG: Executing shell function sysroot_stage_all
> | cpio: ./licenses/libmodule/LICENSE: Cannot stat: No such file or directory
> | WARNING: exit code 2 from a shell command.
>
> copy_license_files() removes and re-links an already existing
> destination, so a file can be listed by find and gone by the time cpio
> stats it.
>
> Write into ${PKGD} from a perform_packagecopy:append instead. By then
> ${D} is complete and untouched, and ${PKGD} is a private copy that
> do_populate_sysroot never reads. Package contents, on-target paths and
> ownership are unchanged - do_package is a fakeroot task, so the
> os.chown() in copy_license_files() still applies. As a side effect the
> license texts stop being staged into every target recipe's sysroot,
> which they had no business being in.
>
> This changes perform_packagecopy, so do_package basehashes change for
> every recipe; expect a one-time repackage.
>
> Signed-off-by: Roman Nazarenko <roman.nazarenko@leica-geosystems.com>
> ---
> meta/classes-global/license.bbclass | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/meta/classes-global/license.bbclass b/meta/classes-global/license.bbclass
> index 86c9ee5878..1d266dd25d 100644
> --- a/meta/classes-global/license.bbclass
> +++ b/meta/classes-global/license.bbclass
> @@ -38,14 +38,15 @@ python do_populate_lic() {
> oe.qa.exit_if_errors(d)
> }
>
> -# it would be better to copy them in do_install:append, but find_license_files is python
> -python perform_packagecopy:prepend () {
> +# Write into PKGD, not D: do_populate_sysroot stages D concurrently and races
> +# with the remove-then-relink in copy_license_files().
> +python perform_packagecopy:append () {
> enabled = oe.data.typed_value('LICENSE_CREATE_PACKAGE', d)
> if d.getVar('CLASSOVERRIDE') == 'class-target' and enabled:
> lic_files_paths = find_license_files(d)
>
> - # LICENSE_FILES_DIRECTORY starts with '/' so os.path.join cannot be used to join D and LICENSE_FILES_DIRECTORY
> - destdir = d.getVar('D') + os.path.join(d.getVar('LICENSE_FILES_DIRECTORY'), d.getVar('PN'))
> + # LICENSE_FILES_DIRECTORY starts with '/' so os.path.join cannot be used to join PKGD and LICENSE_FILES_DIRECTORY
> + destdir = d.getVar('PKGD') + os.path.join(d.getVar('LICENSE_FILES_DIRECTORY'), d.getVar('PN'))
> copy_license_files(lic_files_paths, destdir)
> add_package_and_files(d)
> }
The comment you removed does still apply. Could you instead try making
this a do_install postfunc? I suspect those didn't exist when this was
written.
Cheers,
Richard
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-08-28 13:59 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-27 15:52 [PATCH] classes-global/license: create -lic package from PKGD, not D roman.nazarenko
2026-08-28 13:59 ` [OE-core] " Richard Purdie
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.