@@ -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'))}"
@@ -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
@@ -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:
@@ -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
@@ -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)
@@ -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 = ""
@@ -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)} \
${@bb.utils.contains('SDK_TOOLCHAIN_LANGS', 'kernel', 'kernel-devsrc', '', d)} \
target-sdk-provides-dummy \
"
@@ -119,7 +119,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
@@ -462,7 +462,7 @@ def prepare_locked_cache(d, baseoutpath, derivative, conf_initpath):
# Filter the locked signatures file to just the sstate tasks we are interested in
excluded_targets = get_sdk_install_targets(d, images_only=True)
sdk_targets = d.getVar('SDK_TARGETS')
- ext_sdk_target_set = set(multilib_pkg_extend(d, sdk_targets).split())
+ ext_sdk_target_set = set(oe.utils.multilib_pkg_extend(d, sdk_targets).split())
excluded_set = set(excluded_targets.split())
# Ensure SDK_TARGETS and their image SPDX/SBOM tasks are included in the locked signatures,
@@ -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)
@@ -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"
@@ -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
+
@@ -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)
@@ -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() {
@@ -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)
@@ -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"
@@ -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} \
"
@@ -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')} \
"
@@ -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 \
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> --- meta/classes-global/base.bbclass | 2 +- meta/classes-global/package.bbclass | 2 +- meta/classes-global/sanity.bbclass | 8 +- meta/classes-global/utils.bbclass | 90 ------------------- meta/classes-recipe/cross-canadian.bbclass | 2 +- meta/classes-recipe/image.bbclass | 4 +- meta/classes-recipe/populate_sdk_base.bbclass | 10 +-- meta/classes-recipe/populate_sdk_ext.bbclass | 2 +- meta/classes/multilib.bbclass | 2 +- meta/conf/multilib.conf | 2 +- meta/lib/oe/utils.py | 85 ++++++++++++++++++ meta/recipes-core/glibc/glibc-ld.inc | 2 +- meta/recipes-core/meta/dummy-sdk-package.inc | 2 +- meta/recipes-core/meta/meta-environment.bb | 2 +- meta/recipes-core/meta/meta-go-toolchain.bb | 2 +- .../packagegroup-cross-canadian.bb | 6 +- .../packagegroup-go-cross-canadian.bb | 2 +- .../packagegroup-rust-cross-canadian.bb | 2 +- 18 files changed, 111 insertions(+), 116 deletions(-)