From: Richard Purdie Date: Sat, 1 Aug 2026 21:01:10 +0000 (+0100) Subject: utils: Move functions from utils.bbclass to utils.py X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4e04ca516c6ba0711859804ad24e9c2d130ad2ae;p=thirdparty%2Fopenembedded%2Fopenembedded-core.git utils: Move functions from utils.bbclass to utils.py Signed-off-by: Richard Purdie --- diff --git a/meta/classes-global/base.bbclass b/meta/classes-global/base.bbclass index 4684dbd60c..8b4abe8f1e 100644 --- a/meta/classes-global/base.bbclass +++ b/meta/classes-global/base.bbclass @@ -72,7 +72,7 @@ BASEDEPENDS:class-nativesdk = "${@get_base_dep(d)}" DEPENDS:prepend = "${BASEDEPENDS} " -FILESPATH = "${@base_set_filespath(["${FILE_DIRNAME}/${BP}", "${FILE_DIRNAME}/${BPN}", "${FILE_DIRNAME}/files"], d)}" +FILESPATH = "${@oe.utils.base_set_filespath(["${FILE_DIRNAME}/${BP}", "${FILE_DIRNAME}/${BPN}", "${FILE_DIRNAME}/files"], d)}" # THISDIR only works properly with imediate expansion as it has to run # in the context of the location its used (:=) THISDIR = "${@os.path.dirname(d.getVar('FILE'))}" diff --git a/meta/classes-global/package.bbclass b/meta/classes-global/package.bbclass index cb92b49571..3d293dead7 100644 --- a/meta/classes-global/package.bbclass +++ b/meta/classes-global/package.bbclass @@ -54,7 +54,7 @@ PKGDEST = "${WORKDIR}/packages-split" LOCALE_SECTION ?= '' -ALL_MULTILIB_PACKAGE_ARCHS = "${@all_multilib_tune_values(d, 'PACKAGE_ARCHS')}" +ALL_MULTILIB_PACKAGE_ARCHS = "${@oe.utils.all_multilib_tune_values(d, 'PACKAGE_ARCHS')}" # rpm is used for the per-file dependency identification # dwarfsrcfiles is used to determine the list of debug source files diff --git a/meta/classes-global/sanity.bbclass b/meta/classes-global/sanity.bbclass index 5c5cf311da..91c22599bf 100644 --- a/meta/classes-global/sanity.bbclass +++ b/meta/classes-global/sanity.bbclass @@ -720,13 +720,13 @@ def check_sanity_version_change(status, d): missing = "" - if not check_app_exists("${MAKE}", d): + if not oe.utils.check_app_exists("${MAKE}", d): missing = missing + "GNU make," - if not check_app_exists('gcc', d): + if not oe.utils.check_app_exists('gcc', d): missing = missing + "C Compiler (gcc)," - if not check_app_exists('g++', d): + if not oe.utils.check_app_exists('g++', d): missing = missing + "C++ Compiler (g++)," # installing emacs on Ubuntu 24.04 pulls in emacs-gtk -> libgcc-14-dev despite gcc being 13 @@ -737,7 +737,7 @@ def check_sanity_version_change(status, d): required_utilities = d.getVar('SANITY_REQUIRED_UTILITIES') for util in required_utilities.split(): - if not check_app_exists(util, d): + if not oe.utils.check_app_exists(util, d): missing = missing + "%s," % util if missing: diff --git a/meta/classes-global/utils.bbclass b/meta/classes-global/utils.bbclass index 443f0c6556..cee847594e 100644 --- a/meta/classes-global/utils.bbclass +++ b/meta/classes-global/utils.bbclass @@ -265,96 +265,6 @@ hardlinkdir () { (cd $from; find . -print0 | cpio --null -pdlu $to) } - -def check_app_exists(app, d): - app = d.expand(app).split()[0].strip() - path = d.getVar('PATH') - return bool(bb.utils.which(path, app)) - -def base_set_filespath(path, d): - filespath = [] - extrapaths = (d.getVar("FILESEXTRAPATHS") or "") - # Remove default flag which was used for checking - extrapaths = extrapaths.replace("__default:", "") - # Don't prepend empty strings to the path list - if extrapaths != "": - path = extrapaths.split(":") + path - # The ":" ensures we have an 'empty' override - overrides = (":" + (d.getVar("FILESOVERRIDES") or "")).split(":") - overrides.reverse() - for o in overrides: - for p in path: - if p != "": - filespath.append(os.path.join(p, o)) - return ":".join(filespath) - -def extend_variants(d, var, extend, delim=':'): - """Return a string of all bb class extend variants for the given extend""" - variants = [] - whole = d.getVar(var) or "" - for ext in whole.split(): - eext = ext.split(delim) - if len(eext) > 1 and eext[0] == extend: - variants.append(eext[1]) - return " ".join(variants) - -def multilib_pkg_extend(d, pkg): - variants = (d.getVar("MULTILIB_VARIANTS") or "").split() - if not variants: - return pkg - pkgs = pkg - for v in variants: - pkgs = pkgs + " " + v + "-" + pkg - return pkgs - -def get_multilib_datastore(variant, d): - return oe.utils.get_multilib_datastore(variant, d) - -def all_multilib_tune_values(d, var, unique = True, need_split = True, delim = ' '): - """Return a string of all ${var} in all multilib tune configuration""" - values = [] - variants = (d.getVar("MULTILIB_VARIANTS") or "").split() + [''] - for item in variants: - localdata = get_multilib_datastore(item, d) - # We need WORKDIR to be consistent with the original datastore - localdata.setVar("WORKDIR", d.getVar("WORKDIR")) - value = localdata.getVar(var) or "" - if value != "": - if need_split: - for item in value.split(delim): - values.append(item) - else: - values.append(value) - if unique: - #we do this to keep order as much as possible - ret = [] - for value in values: - if not value in ret: - ret.append(value) - else: - ret = values - return " ".join(ret) - -def all_multilib_tune_list(vars, d): - """ - Return a list of ${VAR} for each variable VAR in vars from each - multilib tune configuration. - Is safe to be called from a multilib recipe/context as it can - figure out the original tune and remove the multilib overrides. - """ - values = {} - for v in vars: - values[v] = [] - values['ml'] = [''] - - variants = (d.getVar("MULTILIB_VARIANTS") or "").split() + [''] - for item in variants: - localdata = get_multilib_datastore(item, d) - values[v].append(localdata.getVar(v)) - values['ml'].append(item) - return values -all_multilib_tune_list[vardepsexclude] = "OVERRIDES" - # If the user hasn't set up their name/email, set some defaults check_git_config() { if ! git config user.email > /dev/null ; then diff --git a/meta/classes-recipe/cross-canadian.bbclass b/meta/classes-recipe/cross-canadian.bbclass index fe991f44bb..25e67d9e07 100644 --- a/meta/classes-recipe/cross-canadian.bbclass +++ b/meta/classes-recipe/cross-canadian.bbclass @@ -94,7 +94,7 @@ python () { # Also need to handle multilib target vendors vendors = d.getVar("CANADIANEXTRAVENDOR") if not vendors: - vendors = all_multilib_tune_values(d, 'TARGET_VENDOR') + vendors = oe.utils.all_multilib_tune_values(d, 'TARGET_VENDOR') origvendor = d.getVar("TARGET_VENDOR_MULTILIB_ORIGINAL") if origvendor: d.setVar("TARGET_VENDOR", origvendor) diff --git a/meta/classes-recipe/image.bbclass b/meta/classes-recipe/image.bbclass index 53f1a9dc45..460e5ab39f 100644 --- a/meta/classes-recipe/image.bbclass +++ b/meta/classes-recipe/image.bbclass @@ -33,7 +33,7 @@ PACKAGES = "" DEPENDS += "depmodwrapper-cross cross-localedef-native" RDEPENDS += "${PACKAGE_INSTALL} ${LINGUAS_INSTALL} ${IMAGE_INSTALL_DEBUGFS}" RRECOMMENDS += "${PACKAGE_INSTALL_ATTEMPTONLY}" -PATH:prepend = "${@":".join(all_multilib_tune_values(d, 'STAGING_BINDIR_CROSS').split())}:" +PATH:prepend = "${@":".join(oe.utils.all_multilib_tune_values(d, 'STAGING_BINDIR_CROSS').split())}:" INHIBIT_DEFAULT_DEPS = "1" @@ -102,7 +102,7 @@ USE_DEPMOD ?= "1" PID = "${@os.getpid()}" PACKAGE_ARCH = "${MACHINE_ARCH}" -SSTATE_ARCHS_TUNEPKG = "${@all_multilib_tune_values(d, 'TUNE_PKGARCH')}" +SSTATE_ARCHS_TUNEPKG = "${@oe.utils.all_multilib_tune_values(d, 'TUNE_PKGARCH')}" LDCONFIGDEPEND ?= "ldconfig-native:do_populate_sysroot" LDCONFIGDEPEND:libc-musl = "" diff --git a/meta/classes-recipe/populate_sdk_base.bbclass b/meta/classes-recipe/populate_sdk_base.bbclass index b427ff2761..aea4226ec3 100644 --- a/meta/classes-recipe/populate_sdk_base.bbclass +++ b/meta/classes-recipe/populate_sdk_base.bbclass @@ -11,7 +11,7 @@ PACKAGES = "" # This exists as an optimization for SPDX processing to only run in image and # SDK processing context. This class happens to be common to these usages. -SPDX_MULTILIB_SSTATE_ARCHS = "${@all_multilib_tune_values(d, 'SSTATE_ARCHS')}" +SPDX_MULTILIB_SSTATE_ARCHS = "${@oe.utils.all_multilib_tune_values(d, 'SSTATE_ARCHS')}" inherit image-postinst-intercepts image-artifact-names nopackages @@ -77,9 +77,9 @@ TOOLCHAIN_HOST_TASK ?= " \ " TOOLCHAIN_HOST_TASK_ATTEMPTONLY ?= "" TOOLCHAIN_TARGET_TASK ?= " \ - ${@multilib_pkg_extend(d, 'packagegroup-core-standalone-sdk-target')} \ - ${@bb.utils.contains('SDK_TOOLCHAIN_LANGS', 'go', multilib_pkg_extend(d, 'packagegroup-go-sdk-target'), '', d)} \ - ${@bb.utils.contains('SDK_TOOLCHAIN_LANGS', 'rust', multilib_pkg_extend(d, 'libstd-rs'), '', d)} \ + ${@oe.utils.multilib_pkg_extend(d, 'packagegroup-core-standalone-sdk-target')} \ + ${@bb.utils.contains('SDK_TOOLCHAIN_LANGS', 'go', oe.utils.multilib_pkg_extend(d, 'packagegroup-go-sdk-target'), '', d)} \ + ${@bb.utils.contains('SDK_TOOLCHAIN_LANGS', 'rust', oe.utils.multilib_pkg_extend(d, 'libstd-rs'), '', d)} \ target-sdk-provides-dummy \ " TOOLCHAIN_TARGET_TASK_ATTEMPTONLY ?= "" @@ -118,7 +118,7 @@ python () { SDK_RDEPENDS = "${TOOLCHAIN_TARGET_TASK} ${TOOLCHAIN_HOST_TASK}" SDK_DEPENDS = "virtual/fakeroot-native ${SDK_ARCHIVE_DEPENDS} cross-localedef-native" -PATH:prepend = "${WORKDIR}/recipe-sysroot/${SDKPATHNATIVE}${bindir}/crossscripts:${@":".join(all_multilib_tune_values(d, 'STAGING_BINDIR_CROSS').split())}:" +PATH:prepend = "${WORKDIR}/recipe-sysroot/${SDKPATHNATIVE}${bindir}/crossscripts:${@":".join(oe.utils.all_multilib_tune_values(d, 'STAGING_BINDIR_CROSS').split())}:" SDK_DEPENDS += "nativesdk-glibc-locale" # We want the MULTIARCH_TARGET_SYS to point to the TUNE_PKGARCH, not PACKAGE_ARCH as it diff --git a/meta/classes/multilib.bbclass b/meta/classes/multilib.bbclass index 6e90af261d..7266f6661d 100644 --- a/meta/classes/multilib.bbclass +++ b/meta/classes/multilib.bbclass @@ -32,7 +32,7 @@ python multilib_virtclass_handler () { d.setVar(name + "_MULTILIB_ORIGINAL", val) # We nearly don't need this but dependencies on NON_MULTILIB_RECIPES don't work without it - d.setVar("SSTATE_ARCHS_TUNEPKG", "${@all_multilib_tune_values(d, 'TUNE_PKGARCH')}") + d.setVar("SSTATE_ARCHS_TUNEPKG", "${@oe.utils.all_multilib_tune_values(d, 'TUNE_PKGARCH')}") overrides = e.data.getVar("OVERRIDES", False) pn = e.data.getVar("PN", False) diff --git a/meta/conf/multilib.conf b/meta/conf/multilib.conf index aff55c1e9d..d692723da3 100644 --- a/meta/conf/multilib.conf +++ b/meta/conf/multilib.conf @@ -1,7 +1,7 @@ baselib = "${@d.getVar('BASE_LIB:tune-' + (d.getVar('DEFAULTTUNE') or 'INVALID')) or d.getVar('BASELIB')}" -MULTILIB_VARIANTS = "${@extend_variants(d,'MULTILIBS','multilib')}" +MULTILIB_VARIANTS = "${@oe.utils.extend_variants(d,'MULTILIBS','multilib')}" MULTILIB_VARIANTS[vardeps] += "MULTILIBS" MULTILIB_SAVE_VARNAME = "DEFAULTTUNE TARGET_ARCH TARGET_SYS TARGET_VENDOR" diff --git a/meta/lib/oe/utils.py b/meta/lib/oe/utils.py index 082f6cef74..d24f49b875 100644 --- a/meta/lib/oe/utils.py +++ b/meta/lib/oe/utils.py @@ -553,3 +553,88 @@ def make_arch_independent(d): d.setVar("qemu_wrapper_cmdline", "def qemu_wrapper_cmdline(data, rootfs_path, library_paths):\n return 'false'") +def base_set_filespath(path, d): + filespath = [] + extrapaths = (d.getVar("FILESEXTRAPATHS") or "") + # Remove default flag which was used for checking + extrapaths = extrapaths.replace("__default:", "") + # Don't prepend empty strings to the path list + if extrapaths != "": + path = extrapaths.split(":") + path + # The ":" ensures we have an 'empty' override + overrides = (":" + (d.getVar("FILESOVERRIDES") or "")).split(":") + overrides.reverse() + for o in overrides: + for p in path: + if p != "": + filespath.append(os.path.join(p, o)) + return ":".join(filespath) + +def check_app_exists(app, d): + app = d.expand(app).split()[0].strip() + path = d.getVar('PATH') + return bool(bb.utils.which(path, app)) + +def all_multilib_tune_values(d, var, unique = True, need_split = True, delim = ' '): + """Return a string of all ${var} in all multilib tune configuration""" + values = [] + variants = (d.getVar("MULTILIB_VARIANTS") or "").split() + [''] + for item in variants: + localdata = get_multilib_datastore(item, d) + # We need WORKDIR to be consistent with the original datastore + localdata.setVar("WORKDIR", d.getVar("WORKDIR")) + value = localdata.getVar(var) or "" + if value != "": + if need_split: + for item in value.split(delim): + values.append(item) + else: + values.append(value) + if unique: + #we do this to keep order as much as possible + ret = [] + for value in values: + if not value in ret: + ret.append(value) + else: + ret = values + return " ".join(ret) + +def all_multilib_tune_list(vars, d): + """ + Return a list of ${VAR} for each variable VAR in vars from each + multilib tune configuration. + Is safe to be called from a multilib recipe/context as it can + figure out the original tune and remove the multilib overrides. + """ + values = {} + for v in vars: + values[v] = [] + values['ml'] = [''] + + variants = (d.getVar("MULTILIB_VARIANTS") or "").split() + [''] + for item in variants: + localdata = oe.utils.get_multilib_datastore(item, d) + values[v].append(localdata.getVar(v)) + values['ml'].append(item) + return values + +def extend_variants(d, var, extend, delim=':'): + """Return a string of all bb class extend variants for the given extend""" + variants = [] + whole = d.getVar(var) or "" + for ext in whole.split(): + eext = ext.split(delim) + if len(eext) > 1 and eext[0] == extend: + variants.append(eext[1]) + return " ".join(variants) + +def multilib_pkg_extend(d, pkg): + variants = (d.getVar("MULTILIB_VARIANTS") or "").split() + if not variants: + return pkg + pkgs = pkg + for v in variants: + pkgs = pkgs + " " + v + "-" + pkg + return pkgs + diff --git a/meta/recipes-core/glibc/glibc-ld.inc b/meta/recipes-core/glibc/glibc-ld.inc index da8fcc430b..0fb8d090bc 100644 --- a/meta/recipes-core/glibc/glibc-ld.inc +++ b/meta/recipes-core/glibc/glibc-ld.inc @@ -5,7 +5,7 @@ GLIBC_GETLOADER = "${@get_linuxloader(d)}" def glibc_dl_info(d): infos = {'ldconfig':set(), 'lddrewrite':set()} - loaders = all_multilib_tune_values(d, "GLIBC_GETLOADER").split() + loaders = oe.utils.all_multilib_tune_values(d, "GLIBC_GETLOADER").split() for loader in loaders: infos['ldconfig'].add('{"' + loader + '",' + "FLAG_ELF_LIBC6" + ' }') infos['lddrewrite'].add(loader) diff --git a/meta/recipes-core/meta/dummy-sdk-package.inc b/meta/recipes-core/meta/dummy-sdk-package.inc index 60dfe9f73b..d2781a6464 100644 --- a/meta/recipes-core/meta/dummy-sdk-package.inc +++ b/meta/recipes-core/meta/dummy-sdk-package.inc @@ -24,7 +24,7 @@ PR[vardeps] += "DUMMYPROVIDES" PR[vardeps] += "DUMMYPROVIDES_PACKAGES" DUMMYPROVIDES_PACKAGES ??= "" -DUMMYPROVIDES_PACKAGES_MULTILIB = "${@' '.join([multilib_pkg_extend(d, pkg) for pkg in d.getVar('DUMMYPROVIDES_PACKAGES').split()])}" +DUMMYPROVIDES_PACKAGES_MULTILIB = "${@' '.join([oe.utils.multilib_pkg_extend(d, pkg) for pkg in d.getVar('DUMMYPROVIDES_PACKAGES').split()])}" DUMMYPROVIDES += "${DUMMYPROVIDES_PACKAGES_MULTILIB}" python populate_packages:prepend() { diff --git a/meta/recipes-core/meta/meta-environment.bb b/meta/recipes-core/meta/meta-environment.bb index e259099313..f814061281 100644 --- a/meta/recipes-core/meta/meta-environment.bb +++ b/meta/recipes-core/meta/meta-environment.bb @@ -21,7 +21,7 @@ inherit cross-canadian do_generate_content[cleandirs] = "${SDK_OUTPUT}" do_generate_content[dirs] = "${SDK_OUTPUT}/${SDKPATH}" # Need to ensure we have the virtual mappings and site files for all multtilib variants -do_generate_content[depends] = "${@oe.utils.build_depends_string(all_multilib_tune_values(d, 'TOOLCHAIN_NEED_CONFIGSITE_CACHE'), 'do_populate_sysroot')}" +do_generate_content[depends] = "${@oe.utils.build_depends_string(oe.utils.all_multilib_tune_values(d, 'TOOLCHAIN_NEED_CONFIGSITE_CACHE'), 'do_populate_sysroot')}" python do_generate_content() { # Handle multilibs in the SDK environment, siteconfig, etc files... localdata = bb.data.createCopy(d) diff --git a/meta/recipes-core/meta/meta-go-toolchain.bb b/meta/recipes-core/meta/meta-go-toolchain.bb index 758963d1e5..cb2b11bb1e 100644 --- a/meta/recipes-core/meta/meta-go-toolchain.bb +++ b/meta/recipes-core/meta/meta-go-toolchain.bb @@ -8,7 +8,7 @@ TOOLCHAIN_HOST_TASK:append = " \ " TOOLCHAIN_TARGET_TASK:append = " \ - ${@multilib_pkg_extend(d, 'packagegroup-go-sdk-target')} \ + ${@oe.utils.multilib_pkg_extend(d, 'packagegroup-go-sdk-target')} \ " # rv32/ppc32 do not support go COMPATIBLE_HOST:riscv32 = "null" diff --git a/meta/recipes-core/packagegroups/packagegroup-cross-canadian.bb b/meta/recipes-core/packagegroups/packagegroup-cross-canadian.bb index 49c075eb11..4b0499b1b9 100644 --- a/meta/recipes-core/packagegroups/packagegroup-cross-canadian.bb +++ b/meta/recipes-core/packagegroups/packagegroup-cross-canadian.bb @@ -11,9 +11,9 @@ GCC = "gcc-cross-canadian-${TRANSLATED_TARGET_ARCH}" GDB = "gdb-cross-canadian-${TRANSLATED_TARGET_ARCH}" RDEPENDS:${PN} = "\ - ${@all_multilib_tune_values(d, 'BINUTILS')} \ - ${@all_multilib_tune_values(d, 'GCC')} \ - ${@all_multilib_tune_values(d, 'GDB')} \ + ${@oe.utils.all_multilib_tune_values(d, 'BINUTILS')} \ + ${@oe.utils.all_multilib_tune_values(d, 'GCC')} \ + ${@oe.utils.all_multilib_tune_values(d, 'GDB')} \ meta-environment-${MACHINE} \ " diff --git a/meta/recipes-core/packagegroups/packagegroup-go-cross-canadian.bb b/meta/recipes-core/packagegroups/packagegroup-go-cross-canadian.bb index d0596efe7a..56c2a73f46 100644 --- a/meta/recipes-core/packagegroups/packagegroup-go-cross-canadian.bb +++ b/meta/recipes-core/packagegroups/packagegroup-go-cross-canadian.bb @@ -8,5 +8,5 @@ PACKAGEGROUP_DISABLE_COMPLEMENTARY = "1" GO = "go-cross-canadian-${TRANSLATED_TARGET_ARCH}" RDEPENDS:${PN} = " \ - ${@all_multilib_tune_values(d, 'GO')} \ + ${@oe.utils.all_multilib_tune_values(d, 'GO')} \ " diff --git a/meta/recipes-core/packagegroups/packagegroup-rust-cross-canadian.bb b/meta/recipes-core/packagegroups/packagegroup-rust-cross-canadian.bb index 7e220d2cce..c73c8d3333 100644 --- a/meta/recipes-core/packagegroups/packagegroup-rust-cross-canadian.bb +++ b/meta/recipes-core/packagegroups/packagegroup-rust-cross-canadian.bb @@ -8,7 +8,7 @@ PACKAGEGROUP_DISABLE_COMPLEMENTARY = "1" RUST = "rust-cross-canadian-${TRANSLATED_TARGET_ARCH}" RDEPENDS:${PN} = " \ - ${@all_multilib_tune_values(d, 'RUST')} \ + ${@oe.utils.all_multilib_tune_values(d, 'RUST')} \ nativesdk-binutils \ nativesdk-gcc \ nativesdk-glibc-dev \