[OE-core] [RFC PATCH 3/3] classes/sstate: regenerate sstate when signing enabled

Joshua Lock jlock at vmware.com
Tue Jul 30 09:58:52 UTC 2019



> On 27 Jul 2019, at 11:12, Richard Purdie <richard.purdie at linuxfoundation.org> wrote:
> 
> On Fri, 2019-07-26 at 11:26 +0000, Joshua Lock via Openembedded-core
> wrote:
>> This change ensures that the task signatures changes, and therefore
>> sstate tasks are rerun, when signing is enabled. This has the
>> positive outcome that if signing is enabled new signed shared state
>> objects will be produced, rather than just signing shared state
>> objects for tasks where no work has been performed yet.
>> 
>> The downside of this change is that enabling/disabling sstate object
>> signing alters the taskhash and results in rebuilding the world.
>> 
>> Signed-off-by: Joshua Lock <jlock at vmware.com>
>> ---
>> meta/classes/sstate.bbclass | 10 ++++++++--
>> meta/lib/oe/gpg_sign.py     | 10 ++++++++++
>> 2 files changed, 18 insertions(+), 2 deletions(-)
>> 
>> diff --git a/meta/classes/sstate.bbclass
>> b/meta/classes/sstate.bbclass
>> index 3342c5ef50..b060e15053 100644
>> --- a/meta/classes/sstate.bbclass
>> +++ b/meta/classes/sstate.bbclass
>> @@ -659,8 +659,12 @@ def sstate_package(ss, d):
>>     if d.getVar('SSTATE_SKIP_CREATION') == '1':
>>         return
>> 
>> +    sstate_create_package = ['sstate_report_unihash',
>> 'sstate_create_package']
>> +    if d.getVar('SSTATE_SIG_KEY'):
>> +        sstate_create_package.append('sstate_sign_package')
>> +
>>     for f in (d.getVar('SSTATECREATEFUNCS') or '').split() + \
>> -             ['sstate_report_unihash', 'sstate_create_package',
>> 'sstate_sign_package'] + \
>> +             sstate_create_package + \
>>              (d.getVar('SSTATEPOSTCREATEFUNCS') or '').split():
>>         # All hooks should run in SSTATE_BUILDDIR.
>>         bb.build.exec_func(f, d, (sstatebuild,))
>> @@ -774,7 +778,7 @@ sstate_create_package () {
>> }
>> 
>> python sstate_sign_package () {
>> -    from oe.gpg_sign import get_signer
>> +    from oe.gpg_sign import get_signer, SignFailedError
>> 
>>     if d.getVar('SSTATE_SIG_KEY'):
>>         signer = get_signer(d, 'local')
>> @@ -783,6 +787,8 @@ python sstate_sign_package () {
>>             os.unlink(sstate_pkg + '.sig')
>>         signer.detach_sign(sstate_pkg, d.getVar('SSTATE_SIG_KEY',
>> False), None,
>>                            d.getVar('SSTATE_SIG_PASSPHRASE'),
>> armor=False)
>> +    else:
>> +        raise SignFailedError("Can't sign sstate packages without
>> key, SSTATE_SIG_KEY empty")
>> }
>> 
>> python sstate_report_unihash() {
>> diff --git a/meta/lib/oe/gpg_sign.py b/meta/lib/oe/gpg_sign.py
>> index 2fd8c3b1ac..ec5ace0dd0 100644
>> --- a/meta/lib/oe/gpg_sign.py
>> +++ b/meta/lib/oe/gpg_sign.py
>> @@ -123,6 +123,16 @@ class LocalSigner(object):
>>         return ret
>> 
>> 
>> +class SignFailedError(bb.build.FuncFailed):
>> +    def __init__(self, description, name=None, logfile=None):
>> +        self.description = description
>> +        self.name = name
>> +        self.logfile = logfile
>> +
>> +    def __str__(self):
>> +        return 'Signing failed: %s' % self.description
>> +
>> +
> 
> Whilst this subclass is quite pythonic, I'm not sure we want to do
> this. At the back of my mind is the feeling that FuncFailed is a bit
> pointless :/.

This is pointless in more ways than one, because above I changed the SSTATECREATEFUNCS to only include sstate_sign_package if SSTATE_SIG_KEY is set this exception shouldn’t ever be raised.

I’ll send an update series with this class and its usage dropped.

Joshua

> Put differently, what does this buy us that bb.fatal() doesn't?
> 
> We do have a few users of FuncFailed in OECore but not many (about
> 8)...
> 
> Cheers,
> 
> Richard
> 
> 
> 



More information about the Openembedded-core mailing list