According to the comment in do_symlink_kernsrc, this function exists
for compatibility with old style kernel recipes:

    # Old style kernels may set ${S} = ${WORKDIR}/git for example

For such recipes  S will always be different from STAGING_KERNEL_DIR.
This is fine for the first build or when unpack is rerun because new
sources are in S. However the following command breaks the build:

    bitbake -C do_symlink_kernsrc virtual/kernel

At this point, S is a symlink to STAGING_KERNEL_DIR, (meaning S !=
STAGING_KERNEL_DIR). We first remove the contents of STAGING_KERNEL_DIR
without removing the folder itself causing us to lose kernel sources.
Then we create a symlink from S to STAGING_KERNEL_DIR which results in the
following broken symlinks:

    ${WORKDIR}/git -> <...>/build/tmp/work-shared/<machine>/kernel-source
    kernel-source -> <...>/build/tmp/work-shared/<machine>/kernel-source

The build fails with the following error:

    ERROR: <linux_recipe> do_kernel_checkout: FileExistsError(17, 'File exists')
    ERROR: Task (<linux_recipe>:do_kernel_checkout)
    failed with exit code '1'

Attempting to access the kernel-source directory results in:

    ls: cannot access 'kernel-source': Too many levels of symbolic links

Fix this by checking if S is a symlink, and if so, verifying whether the symlink
points to STAGING_KERNEL_DIR to avoid losing sources

Signed-off-by: Julien Stephan <jstep...@baylibre.com>
---
 meta/classes-recipe/kernel.bbclass | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/meta/classes-recipe/kernel.bbclass 
b/meta/classes-recipe/kernel.bbclass
index 89badd90f18..e328151cb59 100644
--- a/meta/classes-recipe/kernel.bbclass
+++ b/meta/classes-recipe/kernel.bbclass
@@ -184,7 +184,12 @@ do_clean[cleandirs] += " ${S} ${STAGING_KERNEL_DIR} ${B} 
${STAGING_KERNEL_BUILDD
 python do_symlink_kernsrc () {
     s = d.getVar("S")
     kernsrc = d.getVar("STAGING_KERNEL_DIR")
-    if s != kernsrc:
+    if os.path.islink(s):
+        _s = os.readlink(s)
+    else:
+        _s = s
+
+    if _s != kernsrc:
         bb.utils.mkdirhier(kernsrc)
         bb.utils.remove(kernsrc, recurse=True)
         if s[-1] == '/':
-- 
2.45.1

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#201601): 
https://lists.openembedded.org/g/openembedded-core/message/201601
Mute This Topic: https://lists.openembedded.org/mt/107052142/21656
Group Owner: openembedded-core+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to