diff mbox series

[v3] sstatesig: Fix pn and taskname derivation in find_siginfo

Message ID 20230707065239.28468-1-yang.xu@mediatek.com
State New
Headers show
Series [v3] sstatesig: Fix pn and taskname derivation in find_siginfo | expand

Commit Message

Yang Xu (徐扬) July 7, 2023, 6:52 a.m. UTC
From: Yang Xu <yang.xu@mediatek.com>

The `bb.siggen.compare_sigfiles` method transforms the key format from
`[mc:<mc_name>:][virtual:][native:]<recipe path>:<taskname>` to
`<recipe dir>/<recipe name>:<taskname>[:virtual][:native][:mc:<mc_name>]`
by `clean_basepaths`. However, `find_siginfo` uses the original format
to get the package name (pn) and task name.

This commit corrects the method for deriving the pn and task name in
`find_siginfo` and adds handling for multilib name.
And add test for compare_sigfiles and find_siginfo working together.

Signed-off-by: Yang Xu <yang.xu@mediatek.com>
---
 .../recipes-test/binutils/binutils_%.bbappend |  2 +
 meta/lib/oe/sstatesig.py                      | 17 ++++--
 meta/lib/oeqa/selftest/cases/sstatetests.py   | 53 +++++++++++++++++++
 3 files changed, 67 insertions(+), 5 deletions(-)
 create mode 100644 meta-selftest/recipes-test/binutils/binutils_%.bbappend

Comments

Alexandre Belloni July 7, 2023, 12:36 p.m. UTC | #1
Hello,

On 07/07/2023 06:52:39+0000, Yang Xu via lists.openembedded.org wrote:
> From: Yang Xu <yang.xu@mediatek.com>
> 
> The `bb.siggen.compare_sigfiles` method transforms the key format from
> `[mc:<mc_name>:][virtual:][native:]<recipe path>:<taskname>` to
> `<recipe dir>/<recipe name>:<taskname>[:virtual][:native][:mc:<mc_name>]`
> by `clean_basepaths`. However, `find_siginfo` uses the original format
> to get the package name (pn) and task name.
> 
> This commit corrects the method for deriving the pn and task name in
> `find_siginfo` and adds handling for multilib name.
> And add test for compare_sigfiles and find_siginfo working together.
> 
> Signed-off-by: Yang Xu <yang.xu@mediatek.com>
> ---

Please always include a changelog in this location, else we can't know
easily what changed since v2.

>  .../recipes-test/binutils/binutils_%.bbappend |  2 +
>  meta/lib/oe/sstatesig.py                      | 17 ++++--
>  meta/lib/oeqa/selftest/cases/sstatetests.py   | 53 +++++++++++++++++++
>  3 files changed, 67 insertions(+), 5 deletions(-)
>  create mode 100644 meta-selftest/recipes-test/binutils/binutils_%.bbappend
> 
> diff --git a/meta-selftest/recipes-test/binutils/binutils_%.bbappend b/meta-selftest/recipes-test/binutils/binutils_%.bbappend
> new file mode 100644
> index 0000000000..205720982c
> --- /dev/null
> +++ b/meta-selftest/recipes-test/binutils/binutils_%.bbappend
> @@ -0,0 +1,2 @@
> +# This bbappend is used to alter the recipe using the test_recipe.inc file created by tests.
> +include test_recipe.inc
> diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py
> index f943df181e..f041a0c430 100644
> --- a/meta/lib/oe/sstatesig.py
> +++ b/meta/lib/oe/sstatesig.py
> @@ -321,11 +321,18 @@ def find_siginfo(pn, taskname, taskhashlist, d):
>      if not taskname:
>          # We have to derive pn and taskname
>          key = pn
> -        splitit = key.split('.bb:')
> -        taskname = splitit[1]
> -        pn = os.path.basename(splitit[0]).split('_')[0]
> -        if key.startswith('virtual:native:'):
> -            pn = pn + '-native'
> +        if key.count(':') >= 2:
> +            splitit, taskname, affix = key.split(':', 2)
> +        else:
> +            splitit, taskname = key.split(':', 1)
> +            affix = ''
> +        pn = os.path.splitext(os.path.basename(splitit))[0].split('_')[0]
> +        affixitems = affix.split(':')
> +        if affixitems[0] == 'virtual':
> +            if affixitems[1] == 'native':
> +                pn = pn + '-native'
> +            if affixitems[1] == 'multilib':
> +                pn = affixitems[2] + '-' + pn
>  
>      hashfiles = {}
>      filedates = {}
> diff --git a/meta/lib/oeqa/selftest/cases/sstatetests.py b/meta/lib/oeqa/selftest/cases/sstatetests.py
> index febafdb2f7..818d8b623d 100644
> --- a/meta/lib/oeqa/selftest/cases/sstatetests.py
> +++ b/meta/lib/oeqa/selftest/cases/sstatetests.py
> @@ -691,3 +691,56 @@ TMPDIR = "${TOPDIR}/tmp-sstatesamehash2"
>          self.maxDiff = None
>          self.assertCountEqual(files1, files2)
>  
> +class SStateFindSiginfo(SStateBase):
> +    def test_sstate_compare_sigfiles_and_find_siginfo(self):
> +        """
> +        Test the functionality of the find_siginfo: basic function and callback in compare_sigfiles
> +        """
> +        self.write_config("""
> +TMPDIR = \"${TOPDIR}/tmp-sstates-findsiginfo\"
> +TCLIBCAPPEND = \"\"
> +MACHINE = \"qemux86\"
> +require conf/multilib.conf
> +MULTILIBS = "multilib:lib32"
> +DEFAULTTUNE:virtclass-multilib-lib32 = "x86"
> +BB_SIGNATURE_HANDLER = "OEBasicHash"
> +""")
> +        self.track_for_cleanup(self.topdir + "/tmp-sstates-findsiginfo")
> +
> +        pns = ["binutils", "binutils-native", "lib32-binutils"]
> +
> +        #forcing generate different stamps for binutils every time
> +        self.write_recipeinc("binutils", 'do_fetch[nostamp] = "1"')
> +        for pn in pns*2:
> +            bitbake("%s -S none" % pn)
> +        self.delete_recipeinc("binutils")
> +
> +        with bb.tinfoil.Tinfoil() as tinfoil:
> +            tinfoil.prepare(config_only=True)
> +
> +            def find_siginfo(pn, taskname, sigs=None):
> +                result = None
> +                tinfoil.set_event_mask(["bb.event.FindSigInfoResult",
> +                                "bb.command.CommandCompleted"])
> +                ret = tinfoil.run_command("findSigInfo", pn, taskname, sigs)
> +                if ret:
> +                    while True:
> +                        event = tinfoil.wait_event(1)
> +                        if event:
> +                            if isinstance(event, bb.command.CommandCompleted):
> +                                break
> +                            elif isinstance(event, bb.event.FindSigInfoResult):
> +                                result = event.result
> +                return result
> +
> +            def recursecb(key, hash1, hash2):
> +                hashes = [hash1, hash2]
> +                hashfiles = find_siginfo(key, None, hashes)
> +                self.assertCountEqual(hashes, hashfiles)
> +                bb.siggen.compare_sigfiles(hashfiles[hash1], hashfiles[hash2], recursecb)
> +
> +            for pn in pns:
> +                filedates = find_siginfo(pn, "do_compile")
> +                self.assertGreaterEqual(len(filedates), 2)
> +                latestfiles = sorted(filedates.keys(), key=lambda f: filedates[f])[-2:]
> +                bb.siggen.compare_sigfiles(latestfiles[-2], latestfiles[-1], recursecb)
> -- 
> 2.25.1
> 

> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#184001): https://lists.openembedded.org/g/openembedded-core/message/184001
> Mute This Topic: https://lists.openembedded.org/mt/100001305/3617179
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alexandre.belloni@bootlin.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Yang Xu (徐扬) July 9, 2023, 2:34 p.m. UTC | #2
Dear Alexandre,

Thank you for your reminder.

v1: correct handling for pn and taskname for native target in find_siginfo
v2: add handling for multilib target in find_siginfo
v3: add testcase for compare_sigfiles and find_siginfo work together.

Do I need submit a patch v4 to add these changlog information?

Thank you
Yang Xu (徐扬) July 9, 2023, 2:48 p.m. UTC | #3
Dear Alexandre,

Thank you for your reminder.

v1: correct handing for pn and taskname for native target in
find_siginfo
v2: add handling for multilib target in find_siginfo
v3: add test for compare_sigfiles and find_siginfo work together 

Do I need submit a patch v4 to add these changelog information?

Thank you


On Fri, 2023-07-07 at 14:36 +0200, Alexandre Belloni wrote:
>  	 
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>  Hello,
> 
> On 07/07/2023 06:52:39+0000, Yang Xu via lists.openembedded.org
> wrote:
> > From: Yang Xu <yang.xu@mediatek.com>
> > 
> > The `bb.siggen.compare_sigfiles` method transforms the key format
> from
> > `[mc:<mc_name>:][virtual:][native:]<recipe path>:<taskname>` to
> > `<recipe dir>/<recipe
> name>:<taskname>[:virtual][:native][:mc:<mc_name>]`
> > by `clean_basepaths`. However, `find_siginfo` uses the original
> format
> > to get the package name (pn) and task name.
> > 
> > This commit corrects the method for deriving the pn and task name
> in
> > `find_siginfo` and adds handling for multilib name.
> > And add test for compare_sigfiles and find_siginfo working
> together.
> > 
> > Signed-off-by: Yang Xu <yang.xu@mediatek.com>
> > ---
> 
> Please always include a changelog in this location, else we can't
> know
> easily what changed since v2.
> 
> >  .../recipes-test/binutils/binutils_%.bbappend |  2 +
> >  meta/lib/oe/sstatesig.py                      | 17 ++++--
> >  meta/lib/oeqa/selftest/cases/sstatetests.py   | 53
> +++++++++++++++++++
> >  3 files changed, 67 insertions(+), 5 deletions(-)
> >  create mode 100644 meta-selftest/recipes-
> test/binutils/binutils_%.bbappend
> > 
> > diff --git a/meta-selftest/recipes-
> test/binutils/binutils_%.bbappend b/meta-selftest/recipes-
> test/binutils/binutils_%.bbappend
> > new file mode 100644
> > index 0000000000..205720982c
> > --- /dev/null
> > +++ b/meta-selftest/recipes-test/binutils/binutils_%.bbappend
> > @@ -0,0 +1,2 @@
> > +# This bbappend is used to alter the recipe using the
> test_recipe.inc file created by tests.
> > +include test_recipe.inc
> > diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py
> > index f943df181e..f041a0c430 100644
> > --- a/meta/lib/oe/sstatesig.py
> > +++ b/meta/lib/oe/sstatesig.py
> > @@ -321,11 +321,18 @@ def find_siginfo(pn, taskname, taskhashlist,
> d):
> >      if not taskname:
> >          # We have to derive pn and taskname
> >          key = pn
> > -        splitit = key.split('.bb:')
> > -        taskname = splitit[1]
> > -        pn = os.path.basename(splitit[0]).split('_')[0]
> > -        if key.startswith('virtual:native:'):
> > -            pn = pn + '-native'
> > +        if key.count(':') >= 2:
> > +            splitit, taskname, affix = key.split(':', 2)
> > +        else:
> > +            splitit, taskname = key.split(':', 1)
> > +            affix = ''
> > +        pn =
> os.path.splitext(os.path.basename(splitit))[0].split('_')[0]
> > +        affixitems = affix.split(':')
> > +        if affixitems[0] == 'virtual':
> > +            if affixitems[1] == 'native':
> > +                pn = pn + '-native'
> > +            if affixitems[1] == 'multilib':
> > +                pn = affixitems[2] + '-' + pn
> >  
> >      hashfiles = {}
> >      filedates = {}
> > diff --git a/meta/lib/oeqa/selftest/cases/sstatetests.py
> b/meta/lib/oeqa/selftest/cases/sstatetests.py
> > index febafdb2f7..818d8b623d 100644
> > --- a/meta/lib/oeqa/selftest/cases/sstatetests.py
> > +++ b/meta/lib/oeqa/selftest/cases/sstatetests.py
> > @@ -691,3 +691,56 @@ TMPDIR = "${TOPDIR}/tmp-sstatesamehash2"
> >          self.maxDiff = None
> >          self.assertCountEqual(files1, files2)
> >  
> > +class SStateFindSiginfo(SStateBase):
> > +    def test_sstate_compare_sigfiles_and_find_siginfo(self):
> > +        """
> > +        Test the functionality of the find_siginfo: basic function
> and callback in compare_sigfiles
> > +        """
> > +        self.write_config("""
> > +TMPDIR = \"${TOPDIR}/tmp-sstates-findsiginfo\"
> > +TCLIBCAPPEND = \"\"
> > +MACHINE = \"qemux86\"
> > +require conf/multilib.conf
> > +MULTILIBS = "multilib:lib32"
> > +DEFAULTTUNE:virtclass-multilib-lib32 = "x86"
> > +BB_SIGNATURE_HANDLER = "OEBasicHash"
> > +""")
> > +        self.track_for_cleanup(self.topdir + "/tmp-sstates-
> findsiginfo")
> > +
> > +        pns = ["binutils", "binutils-native", "lib32-binutils"]
> > +
> > +        #forcing generate different stamps for binutils every time
> > +        self.write_recipeinc("binutils", 'do_fetch[nostamp] =
> "1"')
> > +        for pn in pns*2:
> > +            bitbake("%s -S none" % pn)
> > +        self.delete_recipeinc("binutils")
> > +
> > +        with bb.tinfoil.Tinfoil() as tinfoil:
> > +            tinfoil.prepare(config_only=True)
> > +
> > +            def find_siginfo(pn, taskname, sigs=None):
> > +                result = None
> >
> +                tinfoil.set_event_mask(["bb.event.FindSigInfoResult"
> ,
> > +                                "bb.command.CommandCompleted"])
> > +                ret = tinfoil.run_command("findSigInfo", pn,
> taskname, sigs)
> > +                if ret:
> > +                    while True:
> > +                        event = tinfoil.wait_event(1)
> > +                        if event:
> > +                            if isinstance(event,
> bb.command.CommandCompleted):
> > +                                break
> > +                            elif isinstance(event,
> bb.event.FindSigInfoResult):
> > +                                result = event.result
> > +                return result
> > +
> > +            def recursecb(key, hash1, hash2):
> > +                hashes = [hash1, hash2]
> > +                hashfiles = find_siginfo(key, None, hashes)
> > +                self.assertCountEqual(hashes, hashfiles)
> > +                bb.siggen.compare_sigfiles(hashfiles[hash1],
> hashfiles[hash2], recursecb)
> > +
> > +            for pn in pns:
> > +                filedates = find_siginfo(pn, "do_compile")
> > +                self.assertGreaterEqual(len(filedates), 2)
> > +                latestfiles = sorted(filedates.keys(), key=lambda
> f: filedates[f])[-2:]
> > +                bb.siggen.compare_sigfiles(latestfiles[-2],
> latestfiles[-1], recursecb)
> > -- 
> > 2.25.1
> > 
> 
> > 
> > -=-=-=-=-=-=-=-=-=-=-=-
> > Links: You receive all messages sent to this group.
> > View/Reply Online (#184001): 
> https://lists.openembedded.org/g/openembedded-core/message/184001
> > Mute This Topic: 
> https://lists.openembedded.org/mt/100001305/3617179
> > Group Owner: openembedded-core+owner@lists.openembedded.org
> > Unsubscribe: 
> https://lists.openembedded.org/g/openembedded-core/unsub
> [alexandre.belloni@bootlin.com]
> > -=-=-=-=-=-=-=-=-=-=-=-
> > 
> 
>
Ross Burton July 10, 2023, 11:43 a.m. UTC | #4
No need, but please do add it in future patches.

Ross

> On 9 Jul 2023, at 15:34, Yang Xu via lists.openembedded.org <yang.xu=mediatek.com@lists.openembedded.org> wrote:
> 
> Dear Alexandre,
> 
> Thank you for your reminder. 
> 
> v1: correct handling for pn and taskname for native target in find_siginfo
> v2: add handling for multilib target in find_siginfo
> v3: add testcase for compare_sigfiles and find_siginfo work together.
> 
> Do I need submit a patch v4 to add these changlog information?
> 
> Thank you
> 
> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#184039): https://lists.openembedded.org/g/openembedded-core/message/184039
> Mute This Topic: https://lists.openembedded.org/mt/100001305/6875888
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [ross.burton@arm.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Alexandre Belloni July 10, 2023, 9:04 p.m. UTC | #5
Hello,

This caused the following failure on the AB:


2023-07-10 07:09:07,937 - oe-selftest - INFO - 5: 28/28 427/530 (396.69s) (0 failed) (sstatetests.SStateFindSiginfo.test_sstate_compare_sigfiles_and_find_siginfo)
2023-07-10 07:09:07,937 - oe-selftest - INFO - testtools.testresult.real._StringException: Traceback (most recent call last):
  File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/meta/lib/oeqa/selftest/cases/sstatetests.py", line 746, in test_sstate_compare_sigfiles_and_find_siginfo
    bb.siggen.compare_sigfiles(latestfiles[-2], latestfiles[-1], recursecb)
  File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/bitbake/lib/bb/siggen.py", line 1038, in compare_sigfiles
    recout = recursecb(dep, a[dep], b[dep])
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/meta/lib/oeqa/selftest/cases/sstatetests.py", line 740, in recursecb
    bb.siggen.compare_sigfiles(hashfiles[hash1], hashfiles[hash2], recursecb)
  File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/bitbake/lib/bb/siggen.py", line 1038, in compare_sigfiles
    recout = recursecb(dep, a[dep], b[dep])
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/meta/lib/oeqa/selftest/cases/sstatetests.py", line 740, in recursecb
    bb.siggen.compare_sigfiles(hashfiles[hash1], hashfiles[hash2], recursecb)
  File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/bitbake/lib/bb/siggen.py", line 1038, in compare_sigfiles
    recout = recursecb(dep, a[dep], b[dep])
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/meta/lib/oeqa/selftest/cases/sstatetests.py", line 740, in recursecb
    bb.siggen.compare_sigfiles(hashfiles[hash1], hashfiles[hash2], recursecb)
  File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/bitbake/lib/bb/siggen.py", line 1038, in compare_sigfiles
    recout = recursecb(dep, a[dep], b[dep])
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/pokybuild/yocto-worker/oe-selftest-debian/build/meta/lib/oeqa/selftest/cases/sstatetests.py", line 739, in recursecb
    self.assertCountEqual(hashes, hashfiles)
  File "/usr/lib/python3.11/unittest/case.py", line 1233, in assertCountEqual
    self.fail(msg)
  File "/usr/lib/python3.11/unittest/case.py", line 703, in fail
    raise self.failureException(msg)
AssertionError: Element counts were not equal:
First has 1, Second has 0:  '6e2cd26afc5890b8d2ad5eee2cd54e5659ea47de2afd6670b42c25c2d6471045'
First has 1, Second has 0:  '00877293baa6eba15266664c8a78508fac9114d64a99221176349cad0312f517'


https://autobuilder.yoctoproject.org/typhoon/#/builders/80/builds/5401/steps/14/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/127/builds/1727/steps/14/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/86/builds/5443/steps/14/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/87/builds/5476/steps/14/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/79/builds/5450/steps/15/logs/stdio

On 07/07/2023 06:52:39+0000, Yang Xu via lists.openembedded.org wrote:
> From: Yang Xu <yang.xu@mediatek.com>
> 
> The `bb.siggen.compare_sigfiles` method transforms the key format from
> `[mc:<mc_name>:][virtual:][native:]<recipe path>:<taskname>` to
> `<recipe dir>/<recipe name>:<taskname>[:virtual][:native][:mc:<mc_name>]`
> by `clean_basepaths`. However, `find_siginfo` uses the original format
> to get the package name (pn) and task name.
> 
> This commit corrects the method for deriving the pn and task name in
> `find_siginfo` and adds handling for multilib name.
> And add test for compare_sigfiles and find_siginfo working together.
> 
> Signed-off-by: Yang Xu <yang.xu@mediatek.com>
> ---
>  .../recipes-test/binutils/binutils_%.bbappend |  2 +
>  meta/lib/oe/sstatesig.py                      | 17 ++++--
>  meta/lib/oeqa/selftest/cases/sstatetests.py   | 53 +++++++++++++++++++
>  3 files changed, 67 insertions(+), 5 deletions(-)
>  create mode 100644 meta-selftest/recipes-test/binutils/binutils_%.bbappend
> 
> diff --git a/meta-selftest/recipes-test/binutils/binutils_%.bbappend b/meta-selftest/recipes-test/binutils/binutils_%.bbappend
> new file mode 100644
> index 0000000000..205720982c
> --- /dev/null
> +++ b/meta-selftest/recipes-test/binutils/binutils_%.bbappend
> @@ -0,0 +1,2 @@
> +# This bbappend is used to alter the recipe using the test_recipe.inc file created by tests.
> +include test_recipe.inc
> diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py
> index f943df181e..f041a0c430 100644
> --- a/meta/lib/oe/sstatesig.py
> +++ b/meta/lib/oe/sstatesig.py
> @@ -321,11 +321,18 @@ def find_siginfo(pn, taskname, taskhashlist, d):
>      if not taskname:
>          # We have to derive pn and taskname
>          key = pn
> -        splitit = key.split('.bb:')
> -        taskname = splitit[1]
> -        pn = os.path.basename(splitit[0]).split('_')[0]
> -        if key.startswith('virtual:native:'):
> -            pn = pn + '-native'
> +        if key.count(':') >= 2:
> +            splitit, taskname, affix = key.split(':', 2)
> +        else:
> +            splitit, taskname = key.split(':', 1)
> +            affix = ''
> +        pn = os.path.splitext(os.path.basename(splitit))[0].split('_')[0]
> +        affixitems = affix.split(':')
> +        if affixitems[0] == 'virtual':
> +            if affixitems[1] == 'native':
> +                pn = pn + '-native'
> +            if affixitems[1] == 'multilib':
> +                pn = affixitems[2] + '-' + pn
>  
>      hashfiles = {}
>      filedates = {}
> diff --git a/meta/lib/oeqa/selftest/cases/sstatetests.py b/meta/lib/oeqa/selftest/cases/sstatetests.py
> index febafdb2f7..818d8b623d 100644
> --- a/meta/lib/oeqa/selftest/cases/sstatetests.py
> +++ b/meta/lib/oeqa/selftest/cases/sstatetests.py
> @@ -691,3 +691,56 @@ TMPDIR = "${TOPDIR}/tmp-sstatesamehash2"
>          self.maxDiff = None
>          self.assertCountEqual(files1, files2)
>  
> +class SStateFindSiginfo(SStateBase):
> +    def test_sstate_compare_sigfiles_and_find_siginfo(self):
> +        """
> +        Test the functionality of the find_siginfo: basic function and callback in compare_sigfiles
> +        """
> +        self.write_config("""
> +TMPDIR = \"${TOPDIR}/tmp-sstates-findsiginfo\"
> +TCLIBCAPPEND = \"\"
> +MACHINE = \"qemux86\"
> +require conf/multilib.conf
> +MULTILIBS = "multilib:lib32"
> +DEFAULTTUNE:virtclass-multilib-lib32 = "x86"
> +BB_SIGNATURE_HANDLER = "OEBasicHash"
> +""")
> +        self.track_for_cleanup(self.topdir + "/tmp-sstates-findsiginfo")
> +
> +        pns = ["binutils", "binutils-native", "lib32-binutils"]
> +
> +        #forcing generate different stamps for binutils every time
> +        self.write_recipeinc("binutils", 'do_fetch[nostamp] = "1"')
> +        for pn in pns*2:
> +            bitbake("%s -S none" % pn)
> +        self.delete_recipeinc("binutils")
> +
> +        with bb.tinfoil.Tinfoil() as tinfoil:
> +            tinfoil.prepare(config_only=True)
> +
> +            def find_siginfo(pn, taskname, sigs=None):
> +                result = None
> +                tinfoil.set_event_mask(["bb.event.FindSigInfoResult",
> +                                "bb.command.CommandCompleted"])
> +                ret = tinfoil.run_command("findSigInfo", pn, taskname, sigs)
> +                if ret:
> +                    while True:
> +                        event = tinfoil.wait_event(1)
> +                        if event:
> +                            if isinstance(event, bb.command.CommandCompleted):
> +                                break
> +                            elif isinstance(event, bb.event.FindSigInfoResult):
> +                                result = event.result
> +                return result
> +
> +            def recursecb(key, hash1, hash2):
> +                hashes = [hash1, hash2]
> +                hashfiles = find_siginfo(key, None, hashes)
> +                self.assertCountEqual(hashes, hashfiles)
> +                bb.siggen.compare_sigfiles(hashfiles[hash1], hashfiles[hash2], recursecb)
> +
> +            for pn in pns:
> +                filedates = find_siginfo(pn, "do_compile")
> +                self.assertGreaterEqual(len(filedates), 2)
> +                latestfiles = sorted(filedates.keys(), key=lambda f: filedates[f])[-2:]
> +                bb.siggen.compare_sigfiles(latestfiles[-2], latestfiles[-1], recursecb)
> -- 
> 2.25.1
> 

> 
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#184001): https://lists.openembedded.org/g/openembedded-core/message/184001
> Mute This Topic: https://lists.openembedded.org/mt/100001305/3617179
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alexandre.belloni@bootlin.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
diff mbox series

Patch

diff --git a/meta-selftest/recipes-test/binutils/binutils_%.bbappend b/meta-selftest/recipes-test/binutils/binutils_%.bbappend
new file mode 100644
index 0000000000..205720982c
--- /dev/null
+++ b/meta-selftest/recipes-test/binutils/binutils_%.bbappend
@@ -0,0 +1,2 @@ 
+# This bbappend is used to alter the recipe using the test_recipe.inc file created by tests.
+include test_recipe.inc
diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py
index f943df181e..f041a0c430 100644
--- a/meta/lib/oe/sstatesig.py
+++ b/meta/lib/oe/sstatesig.py
@@ -321,11 +321,18 @@  def find_siginfo(pn, taskname, taskhashlist, d):
     if not taskname:
         # We have to derive pn and taskname
         key = pn
-        splitit = key.split('.bb:')
-        taskname = splitit[1]
-        pn = os.path.basename(splitit[0]).split('_')[0]
-        if key.startswith('virtual:native:'):
-            pn = pn + '-native'
+        if key.count(':') >= 2:
+            splitit, taskname, affix = key.split(':', 2)
+        else:
+            splitit, taskname = key.split(':', 1)
+            affix = ''
+        pn = os.path.splitext(os.path.basename(splitit))[0].split('_')[0]
+        affixitems = affix.split(':')
+        if affixitems[0] == 'virtual':
+            if affixitems[1] == 'native':
+                pn = pn + '-native'
+            if affixitems[1] == 'multilib':
+                pn = affixitems[2] + '-' + pn
 
     hashfiles = {}
     filedates = {}
diff --git a/meta/lib/oeqa/selftest/cases/sstatetests.py b/meta/lib/oeqa/selftest/cases/sstatetests.py
index febafdb2f7..818d8b623d 100644
--- a/meta/lib/oeqa/selftest/cases/sstatetests.py
+++ b/meta/lib/oeqa/selftest/cases/sstatetests.py
@@ -691,3 +691,56 @@  TMPDIR = "${TOPDIR}/tmp-sstatesamehash2"
         self.maxDiff = None
         self.assertCountEqual(files1, files2)
 
+class SStateFindSiginfo(SStateBase):
+    def test_sstate_compare_sigfiles_and_find_siginfo(self):
+        """
+        Test the functionality of the find_siginfo: basic function and callback in compare_sigfiles
+        """
+        self.write_config("""
+TMPDIR = \"${TOPDIR}/tmp-sstates-findsiginfo\"
+TCLIBCAPPEND = \"\"
+MACHINE = \"qemux86\"
+require conf/multilib.conf
+MULTILIBS = "multilib:lib32"
+DEFAULTTUNE:virtclass-multilib-lib32 = "x86"
+BB_SIGNATURE_HANDLER = "OEBasicHash"
+""")
+        self.track_for_cleanup(self.topdir + "/tmp-sstates-findsiginfo")
+
+        pns = ["binutils", "binutils-native", "lib32-binutils"]
+
+        #forcing generate different stamps for binutils every time
+        self.write_recipeinc("binutils", 'do_fetch[nostamp] = "1"')
+        for pn in pns*2:
+            bitbake("%s -S none" % pn)
+        self.delete_recipeinc("binutils")
+
+        with bb.tinfoil.Tinfoil() as tinfoil:
+            tinfoil.prepare(config_only=True)
+
+            def find_siginfo(pn, taskname, sigs=None):
+                result = None
+                tinfoil.set_event_mask(["bb.event.FindSigInfoResult",
+                                "bb.command.CommandCompleted"])
+                ret = tinfoil.run_command("findSigInfo", pn, taskname, sigs)
+                if ret:
+                    while True:
+                        event = tinfoil.wait_event(1)
+                        if event:
+                            if isinstance(event, bb.command.CommandCompleted):
+                                break
+                            elif isinstance(event, bb.event.FindSigInfoResult):
+                                result = event.result
+                return result
+
+            def recursecb(key, hash1, hash2):
+                hashes = [hash1, hash2]
+                hashfiles = find_siginfo(key, None, hashes)
+                self.assertCountEqual(hashes, hashfiles)
+                bb.siggen.compare_sigfiles(hashfiles[hash1], hashfiles[hash2], recursecb)
+
+            for pn in pns:
+                filedates = find_siginfo(pn, "do_compile")
+                self.assertGreaterEqual(len(filedates), 2)
+                latestfiles = sorted(filedates.keys(), key=lambda f: filedates[f])[-2:]
+                bb.siggen.compare_sigfiles(latestfiles[-2], latestfiles[-1], recursecb)