diff options
author | Patrick Williams <patrick@stwcx.xyz> | 2016-08-17 22:31:25 +0300 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2016-08-22 19:43:26 +0300 |
commit | 60f9d69e016b11c468c98ea75ba0a60c44afbbc4 (patch) | |
tree | ecb49581a9e41a37943c22cd9ef3f63451b20ee7 /import-layers/yocto-poky/meta/classes/recipe_sanity.bbclass | |
parent | e18c61205e0234b03697129c20cc69c9b3940efc (diff) | |
download | openbmc-60f9d69e016b11c468c98ea75ba0a60c44afbbc4.tar.xz |
yocto-poky: Move to import-layers subdir
We are going to import additional layers, so create a subdir to
hold all of the layers that we import with git-subtree.
Change-Id: I6f732153a22be8ca663035c518837e3cc5ec0799
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Diffstat (limited to 'import-layers/yocto-poky/meta/classes/recipe_sanity.bbclass')
-rw-r--r-- | import-layers/yocto-poky/meta/classes/recipe_sanity.bbclass | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/import-layers/yocto-poky/meta/classes/recipe_sanity.bbclass b/import-layers/yocto-poky/meta/classes/recipe_sanity.bbclass new file mode 100644 index 000000000..295611f0f --- /dev/null +++ b/import-layers/yocto-poky/meta/classes/recipe_sanity.bbclass @@ -0,0 +1,166 @@ +def __note(msg, d): + bb.note("%s: recipe_sanity: %s" % (d.getVar("P", True), msg)) + +__recipe_sanity_badruntimevars = "RDEPENDS RPROVIDES RRECOMMENDS RCONFLICTS" +def bad_runtime_vars(cfgdata, d): + if bb.data.inherits_class("native", d) or \ + bb.data.inherits_class("cross", d): + return + + for var in d.getVar("__recipe_sanity_badruntimevars", True).split(): + val = d.getVar(var, 0) + if val and val != cfgdata.get(var): + __note("%s should be %s_${PN}" % (var, var), d) + +__recipe_sanity_reqvars = "DESCRIPTION" +__recipe_sanity_reqdiffvars = "" +def req_vars(cfgdata, d): + for var in d.getVar("__recipe_sanity_reqvars", True).split(): + if not d.getVar(var, 0): + __note("%s should be set" % var, d) + + for var in d.getVar("__recipe_sanity_reqdiffvars", True).split(): + val = d.getVar(var, 0) + cfgval = cfgdata.get(var) + + if not val: + __note("%s should be set" % var, d) + elif val == cfgval: + __note("%s should be defined to something other than default (%s)" % (var, cfgval), d) + +def var_renames_overwrite(cfgdata, d): + renames = d.getVar("__recipe_sanity_renames", 0) + if renames: + for (key, newkey, oldvalue, newvalue) in renames: + if oldvalue != newvalue and oldvalue != cfgdata.get(newkey): + __note("rename of variable '%s' to '%s' overwrote existing value '%s' with '%s'." % (key, newkey, oldvalue, newvalue), d) + +def incorrect_nonempty_PACKAGES(cfgdata, d): + if bb.data.inherits_class("native", d) or \ + bb.data.inherits_class("cross", d): + if d.getVar("PACKAGES", True): + return True + +def can_use_autotools_base(cfgdata, d): + cfg = d.getVar("do_configure", True) + if not bb.data.inherits_class("autotools", d): + return False + + for i in ["autoreconf"] + ["%s_do_configure" % cls for cls in ["gnomebase", "gnome", "e", "autotools", "efl", "gpephone", "openmoko", "openmoko2", "xfce", "xlibs"]]: + if cfg.find(i) != -1: + return False + + for clsfile in d.getVar("__inherit_cache", 0): + (base, _) = os.path.splitext(os.path.basename(clsfile)) + if cfg.find("%s_do_configure" % base) != -1: + __note("autotools_base usage needs verification, spotted %s_do_configure" % base, d) + + return True + +def can_delete_FILESPATH(cfgdata, d): + expected = cfgdata.get("FILESPATH") + expectedpaths = d.expand(expected) + unexpanded = d.getVar("FILESPATH", 0) + filespath = d.getVar("FILESPATH", True).split(":") + filespath = [os.path.normpath(f) for f in filespath if os.path.exists(f)] + for fp in filespath: + if not fp in expectedpaths: + # __note("Path %s in FILESPATH not in the expected paths %s" % + # (fp, expectedpaths), d) + return False + return expected != unexpanded + +def can_delete_FILESDIR(cfgdata, d): + expected = cfgdata.get("FILESDIR") + #expected = "${@bb.utils.which(d.getVar('FILESPATH', True), '.')}" + unexpanded = d.getVar("FILESDIR", 0) + if unexpanded is None: + return False + + expanded = os.path.normpath(d.getVar("FILESDIR", True)) + filespath = d.getVar("FILESPATH", True).split(":") + filespath = [os.path.normpath(f) for f in filespath if os.path.exists(f)] + + return unexpanded != expected and \ + os.path.exists(expanded) and \ + (expanded in filespath or + expanded == d.expand(expected)) + +def can_delete_others(p, cfgdata, d): + for k in ["S", "PV", "PN", "DESCRIPTION", "DEPENDS", + "SECTION", "PACKAGES", "EXTRA_OECONF", "EXTRA_OEMAKE"]: + #for k in cfgdata: + unexpanded = d.getVar(k, 0) + cfgunexpanded = cfgdata.get(k) + if not cfgunexpanded: + continue + + try: + expanded = d.getVar(k, True) + cfgexpanded = d.expand(cfgunexpanded) + except bb.fetch.ParameterError: + continue + + if unexpanded != cfgunexpanded and \ + cfgexpanded == expanded: + __note("candidate for removal of %s" % k, d) + bb.debug(1, "%s: recipe_sanity: cfg's '%s' and d's '%s' both expand to %s" % + (p, cfgunexpanded, unexpanded, expanded)) + +python do_recipe_sanity () { + p = d.getVar("P", True) + p = "%s %s %s" % (d.getVar("PN", True), d.getVar("PV", True), d.getVar("PR", True)) + + sanitychecks = [ + (can_delete_FILESDIR, "candidate for removal of FILESDIR"), + (can_delete_FILESPATH, "candidate for removal of FILESPATH"), + #(can_use_autotools_base, "candidate for use of autotools_base"), + (incorrect_nonempty_PACKAGES, "native or cross recipe with non-empty PACKAGES"), + ] + cfgdata = d.getVar("__recipe_sanity_cfgdata", 0) + + for (func, msg) in sanitychecks: + if func(cfgdata, d): + __note(msg, d) + + can_delete_others(p, cfgdata, d) + var_renames_overwrite(cfgdata, d) + req_vars(cfgdata, d) + bad_runtime_vars(cfgdata, d) +} +do_recipe_sanity[nostamp] = "1" +addtask recipe_sanity + +do_recipe_sanity_all[nostamp] = "1" +do_recipe_sanity_all[recrdeptask] = "do_recipe_sanity_all do_recipe_sanity" +do_recipe_sanity_all () { + : +} +addtask recipe_sanity_all after do_recipe_sanity + +python recipe_sanity_eh () { + d = e.data + + cfgdata = {} + for k in d.keys(): + if not isinstance(d.getVar(k, 0), bb.data_smart.DataSmart): + cfgdata[k] = d.getVar(k, 0) + + d.setVar("__recipe_sanity_cfgdata", cfgdata) + #d.setVar("__recipe_sanity_cfgdata", d) + + # Sick, very sick.. + from bb.data_smart import DataSmart + old = DataSmart.renameVar + def myrename(self, key, newkey): + oldvalue = self.getVar(newkey, 0) + old(self, key, newkey) + newvalue = self.getVar(newkey, 0) + if oldvalue: + renames = self.getVar("__recipe_sanity_renames", 0) or set() + renames.add((key, newkey, oldvalue, newvalue)) + self.setVar("__recipe_sanity_renames", renames) + DataSmart.renameVar = myrename +} +addhandler recipe_sanity_eh +recipe_sanity_eh[eventmask] = "bb.event.ConfigParsed" |