Hi Alejandro,

Alejandro Hernandez Samaniego <[email protected]> escreveu no dia
sexta, 1/07/2022 à(s) 03:09:

> While executing do_package, bitbake checks for a list of
> debug source files and uses a pattern to match the ones
> to be included in copydebugsources.
>
> Previously when externalsrc was in use either directly or by
> using devtool, the source location changed and this pattern
> no longer matched, hence debug source files failed to be
> included in the corresponding package.
>
> Check when the source directory isnt the default (based on
> WORKDIR), and change the pattern used to match debug source
> files if that is the case, allowing us to perform do_package
> properly.
>
> Workaround debugsource.list containing paths from the host by
> moving debug source files away from the host directory
> structure  to avoid host contamination (this seems to happen
> when packages use $TMPDIR/work-shared and externalsrc is
> in use).
>
> Test matrix included using:
> - devtool to use externalsrc automatically
> - externalsrc with a non-devtool based source directory
> - No externalsrc at all
> Tested the following packages to be working:
> - glibc ($TMPDIR/work-shared based)
> - libxcrypt ($TMPDIR/work based)
>
> [YOCTO 8015]
>
> Signed-off-by: Alejandro Enedino Hernandez Samaniego <
> [email protected]>
> ---
>  meta/classes/package.bbclass | 31 ++++++++++++++++++++++++++++---
>  1 file changed, 28 insertions(+), 3 deletions(-)
>
> diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
> index 62050a18b8..4850134022 100644
> --- a/meta/classes/package.bbclass
> +++ b/meta/classes/package.bbclass
> @@ -553,13 +553,25 @@ def copydebugsources(debugsrcdir, sources, d):
>          strip = d.getVar("STRIP")
>          objcopy = d.getVar("OBJCOPY")
>          workdir = d.getVar("WORKDIR")
> +        sdir = d.getVar("S")
> +        sparentdir = os.path.dirname(os.path.dirname(sdir))
> +        sbasedir = os.path.basename(os.path.dirname(sdir)) + "/" +
> os.path.basename(sdir)
>          workparentdir = os.path.dirname(os.path.dirname(workdir))
>          workbasedir = os.path.basename(os.path.dirname(workdir)) + "/" +
> os.path.basename(workdir)
>
> +        # If S isnt based on WORKDIR we can infer our sources are located
> elsewhere,
> +        # e.g. using externalsrc; use S as base for our dirs
>

This doesn't seem very safe imo, if the idea is to check if the externalsrc
in use it is better using:

if bb.data.inherits_class('externalsrc', d):

Jose

+        if workdir in sdir:
> +            basedir = workbasedir
> +            parentdir = workparentdir
> +        else:
> +            basedir = sbasedir
> +            parentdir = sparentdir
> +
>          # If build path exists in sourcefile, it means toolchain did not
> use
>          # -fdebug-prefix-map to compile
>          if checkbuildpath(sourcefile, d):
> -            localsrc_prefix = workparentdir + "/"
> +            localsrc_prefix = parentdir + "/"
>          else:
>              localsrc_prefix = "/usr/src/debug/"
>
> @@ -581,7 +593,7 @@ def copydebugsources(debugsrcdir, sources, d):
>          processdebugsrc += "sed 's#%s##g' | "
>          processdebugsrc += "(cd '%s' ; cpio -pd0mlL --no-preserve-owner
> '%s%s' 2>/dev/null)"
>
> -        cmd = processdebugsrc % (sourcefile, workbasedir,
> localsrc_prefix, workparentdir, dvar, debugsrcdir)
> +        cmd = processdebugsrc % (sourcefile, basedir, localsrc_prefix,
> parentdir, dvar, debugsrcdir)
>          try:
>              subprocess.check_output(cmd, shell=True,
> stderr=subprocess.STDOUT)
>          except subprocess.CalledProcessError:
> @@ -591,9 +603,22 @@ def copydebugsources(debugsrcdir, sources, d):
>          # cpio seems to have a bug with -lL together and symbolic links
> are just copied, not dereferenced.
>          # Work around this by manually finding and copying any symbolic
> links that made it through.
>          cmd = "find %s%s -type l -print0 -delete | sed s#%s%s/##g | (cd
> '%s' ; cpio -pd0mL --no-preserve-owner '%s%s')" % \
> -                (dvar, debugsrcdir, dvar, debugsrcdir, workparentdir,
> dvar, debugsrcdir)
> +                (dvar, debugsrcdir, dvar, debugsrcdir, parentdir, dvar,
> debugsrcdir)
>          subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
>
> +
> +        # debugsources.list may be polluted from the host if we used
> externalsrc,
> +        # cpio uses copy-pass and may have just created a directory
> structure
> +        # matching the one from the host, if thats the case move those
> files to
> +        # debugsrcdir to avoid host contamination.
> +        # Empty dir structure will be deleted in the next step.
> +
> +        # Same check as above for externalsrc
> +        if workdir not in sdir:
> +            if os.path.exists(dvar + debugsrcdir + sdir):
> +                cmd = "mv %s%s%s/* %s%s" % (dvar, debugsrcdir, sdir,
> dvar,debugsrcdir)
> +                subprocess.check_output(cmd, shell=True,
> stderr=subprocess.STDOUT)
> +
>          # The copy by cpio may have resulted in some empty directories!
> Remove these
>          cmd = "find %s%s -empty -type d -delete" % (dvar, debugsrcdir)
>          subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
> --
> 2.25.1
>
>
> 
>
>

-- 
Best regards,

José Quaresma
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#167453): 
https://lists.openembedded.org/g/openembedded-core/message/167453
Mute This Topic: https://lists.openembedded.org/mt/92100558/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to