On Tue, 2023-03-07 at 21:04 +0200, Ovidiu Panait wrote:
> Hi Richard,
> 
> On 3/6/23 19:59, Richard Purdie wrote:
> > CAUTION: This email comes from a non Wind River email account!
> > Do not click links or open attachments unless you recognize the sender and 
> > know the content is safe.
> > 
> > On Mon, 2023-02-27 at 17:42 +0200, Ovidiu Panait wrote:
> > > The following scenario currently fails:
> > > git clone git://git.yoctoproject.org/poky
> > > cd poky; . oe-init-build-env
> > > 
> > > add to local.conf:
> > > require conf/multilib.conf
> > > MACHINE = "qemuarm64"
> > > MULTILIBS = "multilib:lib32"
> > > DEFAULTTUNE:virtclass-multilib-lib32 = "armv7athf-neon"
> > > 
> > > bitbake gcc-cross-canadian-arm
> > > 
> > > update local.conf to force a rebuild:
> > > GCCPIE = "--disable-default-pie"
> > > 
> > > bitbake gcc-cross-canadian-arm
> > > 
> > > Failure log:
> > > The stack trace of python calls that resulted in this exception/failure 
> > > was:
> > > File: 'exec_func_python() autogenerated', lineno: 2, function: <module>
> > >       0001:
> > >   *** 0002:extend_recipe_sysroot(d)
> > >       0003:
> > > File: 'poky/meta/classes-global/staging.bbclass', lineno: 164, function: 
> > > staging_copyfile
> > >       0160:        os.symlink(linkto, dest)
> > >       0161:        #bb.warn(c)
> > >       0162:    else:
> > >       0163:        try:
> > >   *** 0164:            os.link(c, dest)
> > >       0165:        except OSError as err:
> > >       0166:            if err.errno == errno.EXDEV:
> > >       0167:                bb.utils.copyfile(c, dest)
> > >       0168:            else:
> > > Exception: FileExistsError: [Errno 17] File exists: 
> > > 'poky/build/tmp/sysroots-components/armv7at2hf-neon/lib32-linux-libc-headers/usr/include/asm/byteorder-32.h'
> > >  -> 
> > > 'poky/build/tmp/work/x86_64-nativesdk-pokysdk-linux/gcc-cross-canadian-arm/12.2.0-r0/recipe-sysroot/usr/include/asm/byteorder-32.h'
> > > 
> > > In this particular case, the paths in lib32-linux-libc-headers manifest 
> > > file
> > > are prefixed with lib32-recipe-sysroot:
> > > $ cat build/tmp/sysroots-components/manifests/lib32-linux-libc-headers.xxx
> > > lib32-recipe-sysroot/usr/include/asm/byteorder-32.h
> > > lib32-recipe-sysroot/usr/include/asm/sigcontext-32.h
> > > ...
> > > 
> > > When gcc-cross-canadian-arm is built, the actual files get copied to
> > > recipe-sysroot directory during do_prepare_recipe_sysroot().
> > > 
> > > Because of this mismatch, on rebuild, sstate_clean_manifest() will not 
> > > clean
> > > the files in recipe-sysroot, but will instead try to delete the 
> > > non-existent
> > > files in lib32-recipe-sysroot. This will trigger the FileExists errors 
> > > later.
> > > 
> > > Add checks in sstate_clean_manifest() for this corner case, so that
> > > RECIPE_SYSROOT gets cleaned up properly.
> > > 
> > > This fixes BZ#15045.
> > > 
> > > Signed-off-by: Ovidiu Panait <ovidiu.pan...@eng.windriver.com>
> > > ---
> > >   meta/classes-global/sstate.bbclass | 11 +++++++++++
> > >   1 file changed, 11 insertions(+)
> > > 
> > > diff --git a/meta/classes-global/sstate.bbclass 
> > > b/meta/classes-global/sstate.bbclass
> > > index af93546b04..edf5c7fb65 100644
> > > --- a/meta/classes-global/sstate.bbclass
> > > +++ b/meta/classes-global/sstate.bbclass
> > > @@ -529,9 +529,20 @@ def sstate_clean_manifest(manifest, d, 
> > > canrace=False, prefix=None):
> > >       entries = mfile.readlines()
> > >       mfile.close()
> > > 
> > > +    recipe_sysroot = d.getVar("RECIPE_SYSROOT").rstrip("/").rsplit('/', 
> > > 1)[-1]
> > > +
> > >       for entry in entries:
> > >           sstate_clean_entry(entry, canrace, prefix)
> > > 
> > > +        # The sysroot directory stored in the manifest file might not be 
> > > the
> > > +        # same as RECIPE_SYSROOT, so the real sysroot will not be 
> > > properly
> > > +        # cleaned up on rebuild. Handle the cleanup here in order to 
> > > avoid
> > > +        # "File exists" errors during do_prepare_recipe_sysroot().
> > > +        manifest_sysroot = entry.split("/", 1)[0] or None
> > > +        if manifest_sysroot and manifest_sysroot != recipe_sysroot and 
> > > not manifest_sysroot.endswith("-native"):
> > > +            sysroot_entry = recipe_sysroot + "/" + entry.split("/", 1)[1]
> > > +            sstate_clean_entry(sysroot_entry, canrace, prefix)
> > > +
> > >       postrm = manifest + ".postrm"
> > >       if os.path.exists(manifest + ".postrm"):
> > >           import subprocess
> > I looked into this and as I suspected, the bug is elsewhere. I've sent
> > a different patch to the staging.bbclass code which should fix this
> > problem.
> 
> I tested with latest poky sources (with commit "staging: Separate out 
> different multiconfig manifests" present), but the same error is still 
> triggered on rebuild:
> 
> File: 'poky/meta/classes-global/staging.bbclass', lineno: 164, function: 
> staging_copyfile
>       0160:        os.symlink(linkto, dest)
>       0161:        #bb.warn(c)
>       0162:    else:
>       0163:        try:
>   *** 0164:            os.link(c, dest)
>       0165:        except OSError as err:
>       0166:            if err.errno == errno.EXDEV:
>       0167:                bb.utils.copyfile(c, dest)
>       0168:            else:
> Exception: FileExistsError: [Errno 17] File exists: 
> 'poky/build/tmp/sysroots-components/armv7at2hf-neon/lib32-linux-libc-headers/usr/include/asm/byteorder-32.h'
>  
> -> 
> 'poky/build/tmp/work/x86_64-nativesdk-pokysdk-linux/gcc-cross-canadian-arm/12.2.0-r0/recipe-sysroot/usr/include/asm/byteorder-32.h'
> 
> The manifest files still show lib32-recipe-sysroot instead of 
> recipe-sysroot (the manifest file seems to have already been cached by 
> lib32-gcc-cross-arm):
> $ head -2 
> tmp/work/x86_64-nativesdk-pokysdk-linux/gcc-cross-canadian-arm/12.2.0-r0/recipe-sysroot-native/installeddeps/lib32-linux-libc-headers
> lib32-recipe-sysroot/usr/include/asm/byteorder-32.h
> lib32-recipe-sysroot/usr/include/asm/sigcontext-32.h
> 
> MLPREFIX is set to lib32- for gcc-cross-canadian-arm, so the existing 
> manifest file with lib32-recipe-sysroot paths is used:
> $ bitbake -e gcc-cross-canadian-arm | grep ^MLPREFIX
> MLPREFIX="lib32-"
> 
> Adding an exception for cross-canadian to the the mlprefix code added 
> earlier seems to make it work:
> 
> diff --git a/meta/classes-global/staging.bbclass 
> b/meta/classes-global/staging.bbclass
> index e6d0d1d55c..a9142ce780 100644
> --- a/meta/classes-global/staging.bbclass
> +++ b/meta/classes-global/staging.bbclass
> @@ -276,6 +276,10 @@ python extend_recipe_sysroot() {
>       stagingdir = d.getVar("STAGING_DIR")
>       sharedmanifests = d.getVar("COMPONENTS_DIR") + "/manifests"
>       mlprefix = d.getVar("MLPREFIX")
> +    if "-cross-canadian" in pn:
> +        mlprefix = "nativesdk-"
>       if mlprefix:
>           sharedmanifests = sharedmanifests + "/" + mlprefix
>       recipesysroot = d.getVar("RECIPE_SYSROOT")

Was this in a clean build? The change will need a clean TMPDIR to
properly take effect. I didn't force everyone to rebuild since the
issue is reported so rarely and has been present for a long time.

Cheers,

Richard


-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#178120): 
https://lists.openembedded.org/g/openembedded-core/message/178120
Mute This Topic: https://lists.openembedded.org/mt/97268632/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