[OE-core] [PATCH 16/16] sstatesig.py: Add handling for machine specific module depenedencies

Martin Jansa martin.jansa at gmail.com
Thu Feb 23 14:41:20 UTC 2012


On Thu, Feb 23, 2012 at 01:38:25PM +0000, Richard Purdie wrote:
> Adding dependencies on machine specific recipes from generic packages
> causes a rebuild of the generic package per machine if using signatures
> for the stamp files which is unacceptable.
> 
> We need to declare that RRECOMMENDS on kernel-module-* are safe
> and that we shouldn't care about these machine specific dependencies
> from a stamp perspective. This change adds code which does this.
> 
> It depends on a change in bitbake to expose the dataCache object
> which can be used to make the calculations we need to allow this to
> work correctly.
> 
> Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>

Improves qemux86-64copy build times significantly :)

Acked-by: Martin Jansa <Martin.Jansa at gmail.com>


> ---
>  meta/lib/oe/sstatesig.py |   26 ++++++++++++++++++++------
>  1 files changed, 20 insertions(+), 6 deletions(-)
> 
> diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py
> index ee7cbad..5a64882 100644
> --- a/meta/lib/oe/sstatesig.py
> +++ b/meta/lib/oe/sstatesig.py
> @@ -1,6 +1,6 @@
>  import bb.siggen
>  
> -def sstate_rundepfilter(fn, recipename, task, dep, depname):
> +def sstate_rundepfilter(fn, recipename, task, dep, depname, dataCache):
>      # Return True if we should keep the dependency, False to drop it
>      def isNative(x):
>          return x.endswith("-native")
> @@ -8,13 +8,16 @@ def sstate_rundepfilter(fn, recipename, task, dep, depname):
>          return x.endswith("-cross") or x.endswith("-cross-initial") or x.endswith("-cross-intermediate")
>      def isNativeSDK(x):
>          return x.endswith("-nativesdk")
> +    def isKernel(fn):
> +        inherits = " ".join(dataCache.inherits[fn])
> +        return inherits.find("module-base.bbclass") != -1 or inherits.find("linux-kernel-base.bbclass") != -1
>  
>      # Always include our own inter-task dependencies
>      if recipename == depname:
>          return True
>  
>      # Quilt (patch application) changing isn't likely to affect anything
> -    if depname == "quilt-native":
> +    if depname == "quilt-native" and recipename != "quilt-native":
>          return False
>      # Don't change native/cross/nativesdk recipe dependencies any further
>      if isNative(recipename) or isCross(recipename) or isNativeSDK(recipename):
> @@ -30,6 +33,17 @@ def sstate_rundepfilter(fn, recipename, task, dep, depname):
>      if depname in ['sysvinit-inittab', 'shadow-securetty', 'opkg-config-base', 'netbase', 'formfactor', 'xserver-xf86-config', 'pointercal', 'base-files']:
>          return False
>  
> +    # Kernel modules are well namespaced. We don't want to depend on the kernel's checksum
> +    # if we're just doing an RRECOMMENDS_xxx = "kernel-module-*", not least because the checksum
> +    # is machine specific.
> +    # Therefore if we're not a kernel or a module recipe (inheriting the kernel classes)
> +    # and we reccomend a kernel-module, we exclude the dependency.
> +    depfn = dep.rsplit(".", 1)[0]
> +    if dataCache and isKernel(depfn) and not isKernel(fn):
> +        for pkg in dataCache.runrecs[fn]:
> +            if " ".join(dataCache.runrecs[fn][pkg]).find("kernel-module-") != -1:
> +                return False
> +
>      # Default to keep dependencies
>      return True
>  
> @@ -37,15 +51,15 @@ class SignatureGeneratorOEBasic(bb.siggen.SignatureGeneratorBasic):
>      name = "OEBasic"
>      def init_rundepcheck(self, data):
>          pass
> -    def rundep_check(self, fn, recipename, task, dep, depname):
> -        return sstate_rundepfilter(fn, recipename, task, dep, depname)
> +    def rundep_check(self, fn, recipename, task, dep, depname, dataCache = None):
> +        return sstate_rundepfilter(fn, recipename, task, dep, depname, dataCache)
>  
>  class SignatureGeneratorOEBasicHash(bb.siggen.SignatureGeneratorBasicHash):
>      name = "OEBasicHash"
>      def init_rundepcheck(self, data):
>          pass
> -    def rundep_check(self, fn, recipename, task, dep, depname):
> -        return sstate_rundepfilter(fn, recipename, task, dep, depname)
> +    def rundep_check(self, fn, recipename, task, dep, depname, dataCache = None):
> +        return sstate_rundepfilter(fn, recipename, task, dep, depname, dataCache)
>  
>  # Insert these classes into siggen's namespace so it can see and select them
>  bb.siggen.SignatureGeneratorOEBasic = SignatureGeneratorOEBasic
> -- 
> 1.7.5.4
> 
> 
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core

-- 
Martin 'JaMa' Jansa     jabber: Martin.Jansa at gmail.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20120223/3292f4fe/attachment-0002.sig>


More information about the Openembedded-core mailing list