Looks like a good series, thanks for your work on this. LGTM.

On Tue, Aug 16, 2022 at 1:57 PM Richard Purdie <
[email protected]> wrote:

> Reproducible builds are no longer a configuration option but are required.
> We also rely on the prefix mapping capability of the compilers now.
>
> As such, rewrite the source locating code to use the prefix maps instead
> of taking a guess about WORKDIR which isn't correct for kernels, gcc,
> externalsrc and probably more.
>
> Instead, iterate the maps to locate any matching source code, keeping
> in mind that multiple maps may map to one target location.
>
> Signed-off-by: Richard Purdie <[email protected]>
> ---
>  meta/classes-global/package.bbclass | 68 ++++++++++++-----------------
>  1 file changed, 28 insertions(+), 40 deletions(-)
>
> diff --git a/meta/classes-global/package.bbclass
> b/meta/classes-global/package.bbclass
> index 418400da8c9..2d985d8affd 100644
> --- a/meta/classes-global/package.bbclass
> +++ b/meta/classes-global/package.bbclass
> @@ -565,26 +565,16 @@ def copydebugsources(debugsrcdir, sources, d):
>          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
> -        if workdir in sdir or 'work-shared' in sdir:
> -            basedir = workbasedir
> -            parentdir = workparentdir
> -        else:
> -            basedir = sbasedir
> -            parentdir = sparentdir
> +        cflags = d.expand("${CFLAGS}")
>
> -        # If build path exists in sourcefile, it means toolchain did not
> use
> -        # -fdebug-prefix-map to compile
> -        if checkbuildpath(sourcefile, d):
> -            localsrc_prefix = parentdir + "/"
> -        else:
> -            localsrc_prefix = "/usr/src/debug/"
> +        prefixmap = {}
> +        for flag in cflags.split():
> +            if not flag.startswith("-fdebug-prefix-map"):
> +                continue
> +            if "recipe-sysroot" in flag:
> +                continue
> +            flag = flag.split("=")
> +            prefixmap[flag[1]] = flag[2]
>
>          nosuchdir = []
>          basepath = dvar
> @@ -595,28 +585,26 @@ def copydebugsources(debugsrcdir, sources, d):
>          bb.utils.mkdirhier(basepath)
>          cpath.updatecache(basepath)
>
> -        # Ignore files from the recipe sysroots (target and native)
> -        processdebugsrc =  "LC_ALL=C ; sort -z -u '%s' | egrep -v -z
> '((<internal>|<built-in>)$|/.*recipe-sysroot.*/)' | "
> -        # We need to ignore files that are not actually ours
> -        # we do this by only paying attention to items from this package
> -        processdebugsrc += "fgrep -zw '%s' | "
> -        # Remove prefix in the source paths
> -        processdebugsrc += "sed 's#%s##g' | "
> -        processdebugsrc += "(cd '%s' ; cpio -pd0mlL --no-preserve-owner
> '%s%s' 2>/dev/null)"
> -
> -        cmd = processdebugsrc % (sourcefile, basedir, localsrc_prefix,
> parentdir, dvar, debugsrcdir)
> -        try:
> -            subprocess.check_output(cmd, shell=True,
> stderr=subprocess.STDOUT)
> -        except subprocess.CalledProcessError:
> -            # Can "fail" if internal headers/transient sources are
> attempted
> -            pass
> -
> -        # 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, parentdir, dvar,
> debugsrcdir)
> -        subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
> +        for pmap in prefixmap:
> +            # Ignore files from the recipe sysroots (target and native)
> +            cmd =  "LC_ALL=C ; sort -z -u '%s' | egrep -v -z
> '((<internal>|<built-in>)$|/.*recipe-sysroot.*/)' | " % sourcefile
> +            # We need to ignore files that are not actually ours
> +            # we do this by only paying attention to items from this
> package
> +            cmd += "fgrep -zw '%s' | " % prefixmap[pmap]
> +            # Remove prefix in the source paths
> +            cmd += "sed 's#%s/##g' | " % (prefixmap[pmap])
> +            cmd += "(cd '%s' ; cpio -pd0mlL --no-preserve-owner '%s%s'
> 2>/dev/null)" % (pmap, dvar, prefixmap[pmap])
>
> +            try:
> +                subprocess.check_output(cmd, shell=True,
> stderr=subprocess.STDOUT)
> +            except subprocess.CalledProcessError:
> +                # Can "fail" if internal headers/transient sources are
> attempted
> +                pass
> +            # 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, prefixmap[pmap], dvar, prefixmap[pmap], pmap,
> dvar, prefixmap[pmap])
> +            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
> --
> 2.34.1
>
>
> 
>
>

-- 
Christopher Larson
[email protected], [email protected], [email protected]
Principal Software Engineer, Embedded Linux Solutions, Siemens Digital
Industries Software
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#169463): 
https://lists.openembedded.org/g/openembedded-core/message/169463
Mute This Topic: https://lists.openembedded.org/mt/93068145/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to