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]] -=-=-=-=-=-=-=-=-=-=-=-
