aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/classes/layer_extra_sanity.bbclass91
1 files changed, 91 insertions, 0 deletions
diff --git a/meta/classes/layer_extra_sanity.bbclass b/meta/classes/layer_extra_sanity.bbclass
new file mode 100644
index 0000000000..17671c361f
--- /dev/null
+++ b/meta/classes/layer_extra_sanity.bbclass
@@ -0,0 +1,91 @@
+# Check conf/distro and conf/machine don't appear in the same layer
+def check_machine_distro_dir(sanity_data):
+ bblayers = sanity_data.getVar('BBLAYERS', True).split()
+ for bblayer in bblayers:
+ bblayer = bblayer.rstrip('/')
+ # skip checking of the meta layer, it's special
+ if bblayer.endswith('meta'):
+ continue
+ if os.path.exists(bblayer + '/' + 'conf/machine') and os.path.exists(bblayer + '/' + 'conf/distro'):
+ bb.warn("Layer %s is providing both distro configurations and machine configurations. It's recommended that a layer should provide at most one of them." % bblayer)
+
+# Check that distro variables such as DISTRO_FEATURES are not being set in machine conf files
+def check_distro_vars_machine(sanity_data):
+ import re
+
+ bblayers = sanity_data.getVar('BBLAYERS', True).split()
+ distro_regex = re.compile("^DISTRO_.*=.*")
+ distro_var_match = False
+
+ for bblayer in bblayers:
+ bblayer = bblayer.rstrip('/')
+ if bblayer.endswith('meta'):
+ continue
+ # Check .inc and .conf files under machine/conf don't set DISTRO_xxx vars
+ for dirpath, dirnames, filenames in os.walk('%s/conf/machine' % bblayer):
+ for f in filenames:
+ fpath = os.path.join(dirpath, f)
+ if fpath.endswith(".inc") or fpath.endswith(".conf"):
+ with open(fpath) as fopen:
+ for line in fopen:
+ if distro_regex.match(line):
+ distro_var_match = True
+ break
+ if distro_var_match:
+ break
+ if distro_var_match:
+ break
+ if distro_var_match:
+ bb.warn("Layer %s is setting distro specific variables in its machine conf files." % bblayer)
+ distro_var_match = False
+
+# Check that a disto/bsp layer is being included but MACHINE or DISTRO is not set to any conf
+# file that it provides.
+#
+# The rational here is that if a BSP layer is supposed to have recipes or bbappend files that
+# are only specific for the BSPs it provides. So if MACHINE is not set to any of the
+# conf/machine/*.conf file in that layer, very likely the user is accidently including a BSP layer.
+# The same logic goes for distro layers.
+def check_unneedded_bsp_distro_layer(sanity_data):
+ machine = sanity_data.getVar('MACHINE', True)
+ distro = sanity_data.getVar('DISTRO', True)
+ bblayers = sanity_data.getVar('BBLAYERS', True).split()
+
+ for bblayer in bblayers:
+ bblayer = bblayer.rstrip('/')
+ if bblayer.endswith('meta'):
+ continue
+ is_bsp = os.path.exists(bblayer + '/' + 'conf/machine')
+ is_distro = os.path.exists(bblayer + '/' + 'conf/distro')
+ if is_bsp and not is_distro:
+ if not os.path.exists(bblayer + '/' + 'conf/machine/' + machine + '.conf'):
+ bb.warn("BSP layer %s is included but MACHINE is not set to any conf file it provides." % bblayer)
+ elif not is_bsp and is_distro:
+ if not os.path.exists(bblayer + '/' + 'conf/distro/' + distro + '.conf'):
+ bb.warn("Distro layer %s is included but DISTRO is not set to any conf file it provides." % bblayer)
+
+# Create a copy of the datastore and finalise it to ensure appends and
+# overrides are set - the datastore has yet to be finalised at ConfigParsed
+def copy_data(e):
+ sanity_data = bb.data.createCopy(e.data)
+ sanity_data.finalize()
+ return sanity_data
+
+def layer_extra_check_sanity(sanity_data):
+ check_machine_distro_dir(sanity_data)
+ check_unneedded_bsp_distro_layer(sanity_data)
+ check_distro_vars_machine(sanity_data)
+
+addhandler check_layer_extra_sanity_eventhandler
+check_layer_extra_sanity_eventhandler[eventmask] = "bb.event.SanityCheck"
+python check_layer_extra_sanity_eventhandler() {
+ if bb.event.getName(e) == "SanityCheck":
+ sanity_data = copy_data(e)
+ if e.generateevents:
+ sanity_data.setVar("SANITY_USE_EVENTS", "1")
+ layer_extra_check_sanity(sanity_data)
+ e.data.setVar("BB_INVALIDCONF", False)
+ bb.event.fire(bb.event.SanityCheckPassed(), e.data)
+
+ return
+}