# wolfSSL Yocto Compatibility Helper Class # Provides functions to work with both old (underscore) and new (colon) Yocto syntax def wolfssl_uses_colon_syntax(d): """ Detect if this Yocto version uses colon syntax (Honister 3.4+ / LAYERVERSION_core >= 14). Falls back to checking DISTRO_VERSION if LAYERVERSION_core unavailable. """ try: # Check OE-Core layer version (most reliable) layer_version = d.getVar('LAYERVERSION_core') or d.getVar('LAYERVERSION_core', True) if layer_version: return int(layer_version) >= 14 except: pass # Fallback: check DISTRO_VERSION try: distro_version = d.getVar('DISTRO_VERSION') or d.getVar('DISTRO_VERSION', True) if distro_version: # Versions 2.x and 3.x before 3.4 use underscore if distro_version.startswith('2.') or distro_version.startswith('3.0') or \ distro_version.startswith('3.1') or distro_version.startswith('3.2') or \ distro_version.startswith('3.3'): return False except: pass # Default to colon syntax for unknown/newer versions return True def wolfssl_varAppend(d, base_var, package_name, value): """ Appends a value to a package-specific variable, handling both old and new Yocto syntax. Args: d: BitBake data store base_var: Base variable name (e.g., 'RDEPENDS', 'FILES', 'RRECOMMENDS') package_name: Package name (e.g., '${PN}') value: Value to append """ import bb package_name_expanded = d.expand(package_name) if wolfssl_uses_colon_syntax(d): var_name = base_var + ':' + package_name_expanded else: var_name = base_var + '_' + package_name_expanded d.appendVar(var_name, value) def wolfssl_varSet(d, base_var, package_name, value): """ Sets a package-specific variable, handling both old and new Yocto syntax. Args: d: BitBake data store base_var: Base variable name (e.g., 'RDEPENDS', 'FILES', 'RRECOMMENDS') package_name: Package name (e.g., '${PN}') value: Value to set """ import bb package_name_expanded = d.expand(package_name) if wolfssl_uses_colon_syntax(d): var_name = base_var + ':' + package_name_expanded else: var_name = base_var + '_' + package_name_expanded d.setVar(var_name, value) def wolfssl_varGet(d, base_var, package_name): """ Gets a package-specific variable, handling both old and new Yocto syntax. Args: d: BitBake data store base_var: Base variable name (e.g., 'RDEPENDS', 'FILES', 'RRECOMMENDS') package_name: Package name (e.g., '${PN}') Returns: Variable value or None """ import bb package_name_expanded = d.expand(package_name) if wolfssl_uses_colon_syntax(d): var_name = base_var + ':' + package_name_expanded else: var_name = base_var + '_' + package_name_expanded return d.getVar(var_name) or d.getVar(var_name, True) def wolfssl_varPrepend(d, var_name, value): """ Prepends a value to a variable (for things like FILESEXTRAPATHS, PACKAGECONFIG). Args: d: BitBake data store var_name: Variable name (e.g., 'FILESEXTRAPATHS', 'PACKAGECONFIG') value: Value to prepend """ d.prependVar(var_name, value) def wolfssl_varAppendNonOverride(d, var_name, value): """ Appends a value to a variable (for things like PACKAGECONFIG, EXTRA_OECONF). Args: d: BitBake data store var_name: Variable name (e.g., 'PACKAGECONFIG', 'EXTRA_OECONF') value: Value to append """ d.appendVar(var_name, value) def wolfssl_varRemoveNonOverride(d, var_name, value): """ Removes one or more whitespace-delimited tokens from a list-style variable (e.g. ERROR_QA, WARN_QA). Edits the datastore directly, so it is version-agnostic and needs no colon/underscore override syntax (unlike ERROR_QA:remove / _remove). No-op if a token is not present. Args: d: BitBake data store var_name: Variable name (e.g., 'ERROR_QA', 'WARN_QA') value: Whitespace-delimited token(s) to remove (e.g., 'patch-status') """ tokens = (d.getVar(var_name) or '').split() remove = set(value.split()) filtered = [t for t in tokens if t not in remove] if filtered != tokens: d.setVar(var_name, ' '.join(filtered))