The code in sanity.bbclass was executed for all distros, regardless whether they use the same numbering of bblayers.conf.sample as OE-core.
This is problematic for distros which started at LCONF_VERSION=1: once they reach the 5 to 7 (inclusive) number range, the code from sanity.bbclass kicks in and automatically updates the version to that number without actually changing anything else in bblayers.conf, which leaves the developer out-of-sync with bblayers.conf.sample. Now the code is in a Python module that gets placed alongside the bblayers.conf.sample to which it belongs. Besides avoiding the problem above, this also allows distros to write their own update code. Signed-off-by: Patrick Ohly <patrick.o...@intel.com> --- meta/classes/sanity.bbclass | 121 ++++------------------- meta/conf/lib/bblayers_update/__init__.py | 104 ++++++++++++++++++++- 2 files changed, 130 insertions(+), 95 deletions(-) create mode 100644 meta/conf/lib/bblayers_update/__init__.py diff --git a/meta/classes/sanity.bbclass b/meta/classes/sanity.bbclass index e8064ac..5cc0d14 100644 --- a/meta/classes/sanity.bbclass +++ b/meta/classes/sanity.bbclass @@ -5,26 +5,6 @@ SANITY_REQUIRED_UTILITIES ?= "patch diffstat makeinfo git bzip2 tar \ gzip gawk chrpath wget cpio perl file which" -def bblayers_conf_file(d): - return os.path.join(d.getVar('TOPDIR'), 'conf/bblayers.conf') - -def sanity_conf_read(fn): - with open(fn, 'r') as f: - lines = f.readlines() - return lines - -def sanity_conf_find_line(pattern, lines): - import re - return next(((index, line) - for index, line in enumerate(lines) - if re.search(pattern, line)), (None, None)) - -def sanity_conf_update(fn, lines, version_var_name, new_version): - index, line = sanity_conf_find_line(r"^%s" % version_var_name, lines) - lines[index] = '%s = "%d"\n' % (version_var_name, new_version) - with open(fn, "w") as f: - f.write(''.join(lines)) - # Functions added to this variable MUST throw a NotImplementedError exception unless # they successfully changed the config version in the config file. Exceptions # are used since exec_func doesn't handle return values. @@ -76,7 +56,12 @@ is a good way to visualise the changes.""" raise NotImplementedError(failmsg) } +# Distros may have their own bblayers.conf.sample and corresponding +# update code. The update code must be provided in a sanity_update_bblayers() +# function in a "lib/bblayers-update" module which must be +# in the same directory as the bblayers.conf.sample. SANITY_BBLAYERCONF_SAMPLE ?= "${COREBASE}/meta*/conf/bblayers.conf.sample" + python oecore_update_bblayers() { # bblayers.conf is out of date, so see if we can resolve that @@ -90,83 +75,29 @@ Please compare your file against bblayers.conf.sample and merge any changes befo is a good way to visualise the changes.""" failmsg = d.expand(failmsg) - if not current_lconf: + import glob + samples = glob.glob(d.getVar('SANITY_BBLAYERCONF_SAMPLE')) + if len(samples) != 1: + # Ambiguous bblayers.conf.sample, must be dealt with manually. + # Should be avoided by overriding SANITY_BBLAYERCONF_SAMPLE. raise NotImplementedError(failmsg) - lines = [] - - if current_lconf < 4: - raise NotImplementedError(failmsg) - - bblayers_fn = bblayers_conf_file(d) - lines = sanity_conf_read(bblayers_fn) - - if current_lconf == 4 and lconf_version > 4: - topdir_var = '$' + '{TOPDIR}' - index, bbpath_line = sanity_conf_find_line('BBPATH', lines) - if bbpath_line: - start = bbpath_line.find('"') - if start != -1 and (len(bbpath_line) != (start + 1)): - if bbpath_line[start + 1] == '"': - lines[index] = (bbpath_line[:start + 1] + - topdir_var + bbpath_line[start + 1:]) - else: - if not topdir_var in bbpath_line: - lines[index] = (bbpath_line[:start + 1] + - topdir_var + ':' + bbpath_line[start + 1:]) - else: - raise NotImplementedError(failmsg) - else: - index, bbfiles_line = sanity_conf_find_line('BBFILES', lines) - if bbfiles_line: - lines.insert(index, 'BBPATH = "' + topdir_var + '"\n') - else: - raise NotImplementedError(failmsg) - - current_lconf += 1 - sanity_conf_update(bblayers_fn, lines, 'LCONF_VERSION', current_lconf) - bb.note("Your conf/bblayers.conf has been automatically updated.") - return - - elif current_lconf == 5 and lconf_version > 5: - # Null update, to avoid issues with people switching between poky and other distros - current_lconf = 6 - sanity_conf_update(bblayers_fn, lines, 'LCONF_VERSION', current_lconf) - bb.note("Your conf/bblayers.conf has been automatically updated.") - return - - status.addresult() - - elif current_lconf == 6 and lconf_version > 6: - # Handle rename of meta-yocto -> meta-poky - # This marks the start of separate version numbers but code is needed in OE-Core - # for the migration, one last time. - layers = d.getVar('BBLAYERS').split() - layers = [ os.path.basename(path) for path in layers ] - if 'meta-yocto' in layers: - found = False - while True: - index, meta_yocto_line = sanity_conf_find_line(r'.*meta-yocto[\'"\s\n]', lines) - if meta_yocto_line: - lines[index] = meta_yocto_line.replace('meta-yocto', 'meta-poky') - found = True - else: - break - if not found: - raise NotImplementedError(failmsg) - index, meta_yocto_line = sanity_conf_find_line('LCONF_VERSION.*\n', lines) - if meta_yocto_line: - lines[index] = 'POKY_BBLAYERS_CONF_VERSION = "1"\n' - else: - raise NotImplementedError(failmsg) - with open(bblayers_fn, "w") as f: - f.write(''.join(lines)) - bb.note("Your conf/bblayers.conf has been automatically updated.") - return - current_lconf += 1 - sanity_conf_update(bblayers_fn, lines, 'LCONF_VERSION', current_lconf) - bb.note("Your conf/bblayers.conf has been automatically updated.") - return + # Is there matching update code for the bblayers.conf.sample? + libdir = os.path.join(os.path.dirname(samples[0]), 'lib') + moduledir = os.path.join(libdir, 'bblayers_update') + if os.path.exists(moduledir): + old_path = sys.path.copy() + try: + sys.path.insert(0, libdir) + try: + from bblayers_update import sanity_update_bblayers + except: + bb.warn('Importing sanity_update_bblayers from %s failed.' % moduledir) + raise + if sanity_update_bblayers(d, failmsg): + return True + finally: + sys.path = old_path raise NotImplementedError(failmsg) } diff --git a/meta/conf/lib/bblayers_update/__init__.py b/meta/conf/lib/bblayers_update/__init__.py new file mode 100644 index 0000000..bd6693c --- /dev/null +++ b/meta/conf/lib/bblayers_update/__init__.py @@ -0,0 +1,104 @@ +import bb + +def bblayers_conf_file(d): + return os.path.join(d.getVar('TOPDIR'), 'conf/bblayers.conf') + +def sanity_conf_read(fn): + with open(fn, 'r') as f: + lines = f.readlines() + return lines + +def sanity_conf_find_line(pattern, lines): + import re + return next(((index, line) + for index, line in enumerate(lines) + if re.search(pattern, line)), (None, None)) + +def sanity_conf_update(fn, lines, version_var_name, new_version): + index, line = sanity_conf_find_line(r"^%s" % version_var_name, lines) + lines[index] = '%s = "%d"\n' % (version_var_name, new_version) + with open(fn, "w") as f: + f.write(''.join(lines)) + +def sanity_update_bblayers(d, failmsg): + current_lconf = int(d.getVar('LCONF_VERSION')) + lconf_version = int(d.getVar('LAYER_CONF_VERSION')) + + if not current_lconf: + return False + + lines = [] + + if current_lconf < 4: + return False + + bblayers_fn = bblayers_conf_file(d) + lines = sanity_conf_read(bblayers_fn) + + if current_lconf == 4 and lconf_version > 4: + topdir_var = '$' + '{TOPDIR}' + index, bbpath_line = sanity_conf_find_line('BBPATH', lines) + if bbpath_line: + start = bbpath_line.find('"') + if start != -1 and (len(bbpath_line) != (start + 1)): + if bbpath_line[start + 1] == '"': + lines[index] = (bbpath_line[:start + 1] + + topdir_var + bbpath_line[start + 1:]) + else: + if not topdir_var in bbpath_line: + lines[index] = (bbpath_line[:start + 1] + + topdir_var + ':' + bbpath_line[start + 1:]) + else: + return False + else: + index, bbfiles_line = sanity_conf_find_line('BBFILES', lines) + if bbfiles_line: + lines.insert(index, 'BBPATH = "' + topdir_var + '"\n') + else: + return False + + current_lconf += 1 + sanity_conf_update(bblayers_fn, lines, 'LCONF_VERSION', current_lconf) + bb.note("Your conf/bblayers.conf has been automatically updated.") + return True + + elif current_lconf == 5 and lconf_version > 5: + # Null update, to avoid issues with people switching between poky and other distros + current_lconf = 6 + sanity_conf_update(bblayers_fn, lines, 'LCONF_VERSION', current_lconf) + bb.note("Your conf/bblayers.conf has been automatically updated.") + return True + + status.addresult() + + elif current_lconf == 6 and lconf_version > 6: + # Handle rename of meta-yocto -> meta-poky + # This marks the start of separate version numbers but code is needed in OE-Core + # for the migration, one last time. + layers = d.getVar('BBLAYERS').split() + layers = [ os.path.basename(path) for path in layers ] + if 'meta-yocto' in layers: + found = False + while True: + index, meta_yocto_line = sanity_conf_find_line(r'.*meta-yocto[\'"\s\n]', lines) + if meta_yocto_line: + lines[index] = meta_yocto_line.replace('meta-yocto', 'meta-poky') + found = True + else: + break + if not found: + return False + index, meta_yocto_line = sanity_conf_find_line('LCONF_VERSION.*\n', lines) + if meta_yocto_line: + lines[index] = 'POKY_BBLAYERS_CONF_VERSION = "1"\n' + else: + return False + with open(bblayers_fn, "w") as f: + f.write(''.join(lines)) + bb.note("Your conf/bblayers.conf has been automatically updated.") + return True + current_lconf += 1 + sanity_conf_update(bblayers_fn, lines, 'LCONF_VERSION', current_lconf) + d.setVar('LCONF_VERSION', current_lconf) + bb.note("Your conf/bblayers.conf has been automatically updated.") + return True -- git-series 0.9.1 -- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core