subtree updates: openembedded poky

poky: fb1853c66c..0907793d5e:
  Alexander Kanavin (30):
        sudo: update 1.9.12p2 -> 1.9.13p2
        procps: update 3.3.17 -> 4.0.3
        selftest/overlayfs: enable systemd via INIT_MANAGER
        systemd: update 252.5 -> 253.1
        dpkg: update 1.21.20 -> 1.21.21
        libdnf: update 0.69.0 -> 0.70.0
        ethtool: update 6.1 -> 6.2
        iptables: update 1.8.8 -> 1.8.9
        util-macros: do not probe into host triplet when checking manpage section names
        encodings: update 1.0.6 -> 1.0.7
        font-alias: update 1.0.4 -> 1.0.5
        sqlite3: update 3.40.1 -> 3.41.0
        enchant2: upgrade 2.3.3 -> 2.3.4
        make: upgrade 4.4 -> 4.4.1
        vte: upgrade 0.70.2 -> 0.70.3
        pango: upgrade 1.50.12 -> 1.50.13
        libnotify: upgrade 0.8.1 -> 0.8.2
        puzzles: upgrade to latest revision
        iproute2: upgrade 6.1.0 -> 6.2.0
        bind: upgrade 9.18.11 -> 9.18.12
        stress-ng: remove obsolete patch
        piglit: upgrade to latest revision
        apt: re-enable version check
        devtool/upgrade: do not delete the workspace/recipes directory
        runqemu: direct mesa to use its own drivers, rather than ones provided by host distro
        mesa: allow mesa-native/nativesdk only subject to opengl/vulkan DISTRO_FEATURE
        mesa: enable a rich set of drivers for native builds
        llvm: allow building libllvm in native builds, subject to PACKAGECONFIG
        mesa: do not strip rpaths from dri drivers
        mesa: update 22.3.5 -> 23.0.0

  Alexandre Belloni (2):
        pseudo: Update to pull in fd leak fix
        stress-ng: upgrade 0.15.04 -> 0.15.06

  Alexis Lothoré (8):
        scripts/resulttool: call fixup_ptest_names in regression_common
        oeqa/selftest/resulttool: fix ptest filtering tests
        oeqa/selftest/resulttool: fix fake data used for testing
        scripts/resulttool: fix ptests results containing a non reproducible path
        oeqa/selftest/resulttool: add test for error propagation in test name filtering
        scripts/resulttool: do not count newly passing tests as regressions
        scripts/yocto_testresults_query.py: set proper branches when using resulttool
        scripts/yocto_testresults_query.py: fix regression reports for branches with slashes

  Andrew Geissler (1):
        filemap.py: enforce maximum of 4kb block size

  Arturo Buzarra (1):
        run-postinsts: Set dependency for ldconfig to avoid boot issues

  Bruce Ashfield (12):
        perf: fix buildpaths QA warning
        lttng-modules: update to v2.13.9
        lttng-modules: fix for v6.3+ kernels
        linux-yocto/6.1: update to v6.1.15
        linux-yocto/5.15: update to v5.15.98
        linux-yocto/6.1: update to v6.1.20
        linux-yocto/5.15: update to v5.15.103
        kernel-devsrc: fix mismatched compiler warning
        linux-yocto-dev: bump to v6.3
        kernel/kernel-devsrc: powerpc: add elfutils dependency
        yocto-bsp/6.1: update reference boards to v6.1.20
        yocto-bsp/5.15: update to v5.15.103

  Carlos Alberto Lopez Perez (1):
        mesa-demos: packageconfig weston should have a dependency on wayland-protocols

  Changqing Li (1):
        cpio: fix ptest failure

  Chen Qi (4):
        Revert "systemd-systemctl: Create machine-id with "uninitialized" text in it"
        rpm: fix RPM_ETCCONFIGDIR value in SDK
        debugedit: add recipe
        rpm: add back find-debuginfo support

  Clément Péron (2):
        qemu: split out qemu-guest-agent, add startup scripts
        runqemu: add an option to enable guest-agent virtio device

  Daniel Ammann (1):
        bitbake: fetch2/sftp: Fix fetching URIs with spaces

  Dmitry Baryshkov (1):
        mesa: import patch from upstream to fix tools build on musl

  Fawzi KHABER (4):
        bitbake: doc: ref-variables: add LAYERSERIES_COMPAT to term glossary
        bitbake: bitbake-user-manual: update Hello World example
        package.bbclass: check packages name conflict in do_package
        oeqa/selftest/cases/package.py: adding unittest for package rename conflicts

  Frederic Martinsons (7):
        cargo.bbclass: use offline mode for building
        bitbake: crate.py: authorize crate url with parameters
        cargo-update-recipe-crates: generate checksum for each crates
        python3-bcrypt: add crates checksums
        python3-cryptography: add crates checksums
        bitbake: fetch2: Add checksum capability for crate fetcher
        bitbake: crate.py: make checksum verification mandatory

  Geoffrey GIRY (1):
        cve-check: Fix false negative version issue

  James R T (1):
        bitbake: ConfHandler: Allow the '@' character in variable flag names

  Jialing Zhang (5):
        class-recipe: add support for loongarch64
        Do not remove the -m option for loongarch64
        image-uefi: add support for loongarch64
        add support for loongarch64
        recipes: add support for loongarch64

  Jose Quaresma (5):
        go: fix some linkshared regression introduced in go 1.20
        buildstats-summary: add an option to disable bold
        oeqs/selftest: OESelftestTestContext: replace the os.environ after subprocess.check_output
        oeqa/selftest: OESelftestTestContext: convert relative to full path when newbuilddir is provided
        oeqa/selftest/reproducible: Split different packages from missing packages output

  Joshua Watt (1):
        runqemu: Fix TypeError when command fails

  Kai Kang (1):
        grub2: support metadata_csum_seed feature

  Kenfe-Mickael Laventure (3):
        buildtools-tarball: Handle spaces within user $PATH
        toolchain-scripts: Handle spaces within user $PATH
        populate_sdk_ext: Handle spaces within user $PATH

  Khem Raj (9):
        libcomps: Fix callback function prototype for PyCOMPS_hash
        rpm: Fix hdr_hash function prototype
        binutils: Enable --enable-new-dtags
        systemd: Fix musl fix patch
        systemd.bbclass: Add /usr/lib/systemd to searchpaths as well
        systemtap: Disable dangling-pointer warning
        glibc: Disable warnings as errors
        vte: Upgrade to 0.72.0
        Revert "runqemu: Add workaround for APIC hang on pre 4.15 kernels on qemux86"

  Lee Chee Yang (2):
        migration-guides: add release-notes for 4.0.8
        migration-guides: add release-notes for 4.1.3

  Maanya Goenka (1):
        create-spdx: fix config build by adding dependency to enable reruns

  Mark Asselstine (1):
        bitbake: build: Make python output print to stdout when running with -v (verbose)

  Mark Hatle (3):
        bitbake: wget.py: Add catch TimeoutError exception
        bitbake: wget.py: Combine urlopener exceptions
        tcf-agent: Update to current version

  Markus Volk (1):
        gtk4: update 4.8.3 -> 4.10.0

  Martin Jansa (22):
        file: add few more PACKAGECONFIGs to avoid autodetected deps from host
        npm.bbclass: avoid DeprecationWarning with new python
        timezone: use 'tz' subdir instead of ${WORKDIR} directly
        tzdata: use separate B instead of WORKDIR for zic output
        git-submodule-test: disable upstream version check
        tzcode-native: fix build with gcc-13 on host
        selftest: devtool: set BB_HASHSERVE_UPSTREAM when setting SSTATE_MIRROR
        selftest: wic: respect IMAGE_LINK_NAME
        selftest: wic: respect IMAGE_LINK_NAME also in test_rawcopy_plugin_qemu
        selftest: runqemu: respect IMAGE_LINK_NAME
        image-artifact-names.bbclass: add INITRAMFS_IMAGE_NAME from kernel.bbclass
        selftest: fitimage.py: respect INITRAMFS_IMAGE_NAME and KERNEL_FIT_LINK_NAME
        image-artifact-names: add IMAGE_MACHINE_SUFFIX variable
        selftest: gdbserver.py: respect IMAGE_LINK_NAME
        selftest: minidebuginfo.py respect IMAGE_LINK_NAME
        runqemu: get_first_file() rename cmd* to glob*
        selftest: imagefeatures.py: respect IMAGE_LINK_NAME for debugfs and manifest as well
        oeqa: loader.py: show warning when skipping selected module and abort if all are skipped
        bmap-tools: switch to main branch
        python3-scons: upgrade to v4.5.2
        selftest: systemd_boot.py: respect IMAGE_LINK_NAME
        selftest: eSDK rename to esdk

  Martin Larsson (1):
        libpam: Remove flex dependency

  Michael Halstead (1):
        selftest/runtime_test/virgl: Disable for all Rocky Linux

  Michael Opdenacker (7):
        ref-manual: clarify explanations about feature backfilling
        overview-manual: add missing link to BitBake User Manual
        manuals: simplify references to the BitBake User Manual
        poky.yaml.in, system-requirements.rst: update system requirements
        ref-manual: system-requirements.rst: simplify supported distro requirements
        ref-manual: variables.rst: update LAYERSERIES_COMPAT
        bitbake: bitbake-user-manual: fix links to supported release manuals

  Mikko Rapeli (1):
        oeqa rtc.py: skip if read-only-rootfs

  Ming Liu (1):
        linux: inherit pkgconfig in kernel.bbclass

  Mingli Yu (4):
        mdadm: Fix testcase 06wrmostly
        mdadm: fix tests/02lineargrow
        mdadm: Fix raid0 tests
        mdadm: fix tests/00raid0

  Ovidiu Panait (1):
        gobject-introspection: inherit python3targetconfig

  Peter Marko (2):
        go: use go as CVE product for all golang recipe veriants
        gcc-shared-source: do not use ${S}/.. in deploy_source_date_epoch

  Piotr Łobacz (1):
        systemd: fix wrong nobody-group assignment

  Randy MacLeod (3):
        valgrind: Disable drd/tests/bar_bad ptest
        openssl: update from 3.0.8 to 3.1.0
        vim: upgrade 9.0.1403 -> 9.0.1429

  Richard Purdie (52):
        gdb: Fix occasional build failure
        staging: Separate out different multiconfig manifests
        bitbake: server/xmlrpc: Fix after currentAsyncCommand locking changes
        gdb: Mark patch as backport
        glibc: Add missing binutils dependency
        glibc: Update sstate/equiv versions to clean cache
        staging/multilib: Fix manifest corruption
        m4/opkg/ethtool/attr/libgpg-error: Add missing bash ptest dependency
        openssl: Add missing ptest dependency on openssl-bin
        valgrind: Add missing utf-32 gconv dependency for ptests
        perl: Add missing procps-ps dependency for ptests
        acl/attr: ptest fixes and improvements
        m4: Add missing ptest dependency
        libmodule-build-perl: Fix ptest dependencies
        bc: Fix ptest test output naming
        findutils: Fix ptest dependency issue
        gawk: Fix ptest dependency
        libconvert-asn1-perl: Fix ptest dependencies
        libxml-sax-perl: Fix ptest dependencies
        babeltrace2: Fix ptest execution in minimal images and add debug info
        babeltrace: Fix ptest dependency
        lttng-tools: Improve ptest debugging and fix dependencies
        gettext: Add missing bash ptest dependency
        glibc-tests: Add missing bash ptest dependency
        opkg: Add missing python module ptest dependencies
        libxml-perl: Add missing perl module ptest dependencies
        gstreamer1.0: Add missing gconv ptest dependency
        gnutls: Add missing python ptest dependency
        busybox: Fix ptest dependencies
        selftest/recipetool: Stop test corrupting tinfoil class
        oeqa/selftest/sstate: Merge sstate test class with tests themselves
        oeqa/selftest/sstate: Move common code to base class
        oeqa/selftest/sstate: Split classes to allow more parallelism
        base-files: Drop localhost.localdomain from hosts file
        core-image-ptest: Switch to BBCLASSEXTEND parallel execution
        ptest-packagelists: Simplify ptest list/code
        scripts/combo-layer: Fix python deprecation warning
        pybootchartui: Fix python syntax issue
        pybootchart: Fix extents handling to account for cpu/io/mem pressure changes
        matchbox-wm: Update 1.2.2 -> 1.2.3
        matchbox-panel-2: Update 2.11 -> 2.12
        matchbox-desktop-2: Update 2.2 -> 2.3
        matchbox-terminal: Update to latest SRCREV
        matchbox-config-gtk: Update to latest SRCREV
        matchbox-terminal: Fix PV to match standard format
        openssl: Fix reproducibility issue
        resulttool: Improve overlapping ptest result reporting
        poky-bleeding: Update and rework
        bitbake: fetch2: Rename __BBSEENSRCREV -> __BBSRCREV_SEEN
        bitbake: fetch2: Add autorev warning when it is set too late
        abi_version/sstate: Handle pkgconfig output changes and bump output versions
        bitbake: fetch2/local: Mention the value of localpath in failure message

  Robert Joslyn (1):
        curl: Update from 7.88.1 to 8.0.1

  Robert Yang (3):
        bitbake: fetch/git: Fix local clone url to make it work with repo
        bitbake: cache: Make EXCLUDE_FROM_WORLD boolean
        bitbake: bitbake: bitbake-user-manual: Update EXCLUDE_FROM_WORLD

  Romuald JEANNE (1):
        image_types: fix vname var init in multiubi_mkfs() function

  Romuald Jeanne (2):
        image_types: fix multiubi var init
        oeqa/selftest/imagefeatures: set a test for mutliubi in test_image_fstypes

  Ross Burton (35):
        vim: add missing pkgconfig inherit
        shadow: ignore CVE-2016-15024
        epiphany: upgrade to 43.1
        manpages: use an intercept to run mandb
        oeqa/selftest/imagefeatures: add test for man-db
        systemd: add ignore for CVE-2022-4415
        meson: remove obsolete RPATH stripping patch
        poky: set MAINTAINER clearly
        vim: set modified-by to the recipe MAINTAINER
        vim: upgrade to 9.0.1403
        lib/resulttool: fix typo breaking resulttool log --ptest
        resulttool: add log --list-ptest
        python3-numpy: add missing dependency for the tests
        python3: missing ptest dependencies
        python3: add missing -modules dependencies
        python3-unittest-automake-output: add new recipe for ptest integration
        python3-atomicwrites: use python3-unittest-automake-output
        python3-bcrypt: use python3-unittest-automake-output
        python3-cryptography: use python3-unittest-automake-output
        python3-hypothesis: use python3-unittest-automake-output
        python3-jinja2: use python3-unittest-automake-output
        python3-markupsafe: use python3-unittest-automake-output
        python3-more-itertools: use python3-unittest-automake-output
        python3-pluggy: use python3-unittest-automake-output
        python3-pyasn1: : use python3-unittest-automake-output
        python3-pytz: use python3-unittest-automake-output
        python3-wcwidth: use python3-unittest-automake-output
        python3-webcolors: use python3-unittest-automake-output
        python3-jsonpointer: rewrite testing
        scripts: add buildstats-summary
        quilt: fix non-deterministic ownership in ptest package
        scripts/lib/buildstats: handle top-level build_stats not being complete
        go: fix CVE-2023-2453
        libunwind: fix compile failures on 32-bit arm with Clang 16
        tzdata: upgrade to 2023c

  Siddharth Doshi (2):
        OpenSSL: Security fix for CVE-2023-0464
        openssh: upgrade 9.2p1 -> 9.3p1

  Sudip Mukherjee (3):
        libgit2: update license information
        libgit2: upgrade to v1.6.3
        cracklib: upgrade to v2.9.10

  Sundeep KOKKONDA (1):
        rust: added missing runtime dependencies to run rust on target

  Thomas Roos (1):
        qemuboot-x86.inc: allow overwrite of QB_CPU

  Tim Orling (4):
        cracklib: update github branch to 'main'
        python3-wheel: upgrade 0.38.4 -> 0.40.0
        bitbake: toaster: update gen_fixtures.py for mickledore
        bitbake: toaster: update fixtures for mickledore

  Tom Hochstein (2):
        meson: Fix wrapper handling of implicit setup command
        oeqa/sdk: Improve Meson test

  Trevor Woerner (3):
        cups: use BUILDROOT instead of DESTDIR
        cups: check PACKAGECONFIG for pam feature
        cups: add/fix web interface packaging

  Ulrich Ölmann (1):
        base: fix typos

  Wang Mingyu (24):
        autoconf-archive: upgrade 2022.09.03 -> 2023.02.20
        font-util: upgrade 1.3.3 -> 1.4.0
        harfbuzz: upgrade 7.0.1 -> 7.1.0
        iso-codes: upgrade 4.12.0 -> 4.13.0
        libmicrohttpd: upgrade 0.9.75 -> 0.9.76
        meson: upgrade 1.0.0 -> 1.0.1
        glib-2.0: upgrade 2.74.5 -> 2.74.6
        python3-cryptography(-vectors): upgrade 39.0.1 -> 39.0.2
        python3-setuptools: upgrade 67.3.3 -> 67.4.0
        python3-git: upgrade 3.1.30 -> 3.1.31
        repo: upgrade 2.31 -> 2.32
        strace: upgrade 6.1 -> 6.2
        stress-ng: upgrade 0.15.03 -> 0.15.04
        lua: Fix install conflict when enable multilib.
        vala: Fix install conflict when enable multilib.
        dhcpcd: Fix install conflict when enable multilib.
        grep: upgrade 3.8 -> 3.9
        python3-setuptools: upgrade 67.4.0 -> 67.6.0
        python3-poetry-core: upgrade 1.5.1 -> 1.5.2
        python3-pytest: upgrade 7.2.1 -> 7.2.2
        python3-scons: upgrade 4.4.0 -> 4.5.1
        python3-testtools: upgrade 2.5.0 -> 2.6.0
        python3-urllib3: upgrade 1.26.14 -> 1.26.15
        xcb-proto: Fix install conflict when enable multilib.

  Xiangyu Chen (3):
        sudo: update 1.9.12p2 -> 1.9.13p3
        rng-tools: splitting the rng-tools systemd/sysvinit serivce as a package
        package: moving field data process before variable process in process_pkgconfig

  Yash Shinde (1):
        binutils: Fix CVE-2023-25586

  Yoann Congal (1):
        ref-manual: Add info on "mixin" layers

  Yureka Lilian (1):
        systemd: rebase musl patches

  Zang Ruochen (1):
        maintainers.inc: Modify email address

  Zoltan Boszormenyi (2):
        piglit: Fix build time dependency
        pypi.bbclass: Set SRC_URI downloadfilename with an optional prefix

meta-openembedded: a9b2d1303b..17243e70c8:
  AYP (1):
        packagegroup-meta-networking: remove ntpdate

  Andreas Helbech Kleist (1):
        cli11: enable native/nativesdk builds

  Archana Polampalli (1):
        Nodejs: add missing run_ptest script

  Bartosz Golaszewski (3):
        libgpiod: update to v2.0
        python3-gpiod: update to v2.0
        reboot-mode: new package

  Changqing Li (5):
        rabbitmq-c: upgrade 0.11.0 -> 0.13.0
        sg3-utils: upgrade 1.45 -> 1.47
        liblockfile: upgrade 1.14 -> 1.17
        syslog-ng: upgrade 3.38.1 -> 4.0.1
        redis: upgrade 7.0.9 -> 7.0.10

  Chen Pei (1):
        meta-perl-base:fix SUMMARY

  Christophe Vu-Brugier (2):
        exfatprogs: add new recipe
        exfat-utils: remove recipe

  Clément Péron (1):
        python3-click-repl: add mising prompt-toolkit runtime dependency

  Etienne Cordonnier (8):
        android-tools 10: import version from meta-clang
        android-tools 10: remove dead code
        android-tools 10: move adbd to its own package
        android-tools 10: Add flag to enable adbd service
        android-tools 10: various fixes
        android-tools 10: port some patches from version 5
        android-tools: fix TMPDIR
        android-tools: update to 29.0.6.r14

  Fabio Estevam (2):
        iperf3: Update to 3.13
        ettercap: Update Upstream-Status

  Frederic Martinsons (2):
        uutils-coreutils: Add crates checksum and use cargo-update-recipes-crates
        python3-pyruvate: Add crates checksum and use cargo-update-recipes-crates

  Jan Feemers (1):
        nodejs: package-split between nodejs and nodejs-npm

  Joe Slater (3):
        libidn: update to 1.41
        re2: move to version 2023-03-01
        libreport: update to version 2.17.8

  Justin Bronder (1):
        tk: inherit pkgconfig

  Khem Raj (41):
        gnome-commander: Upgrade to 1.16.0 release
        python3-lru-dict: Fix function pointer mismatch
        hdf5: Upgrade to 1.14.0
        python3-h5py: Upgrade to 3.8.0
        pkcs11-helper: Update to latest tip of trunk
        glm: Update to tip of trunk
        libsdl2-ttf: Upgrade to 2.20.2
        libsdl-image: Fix build with clang16
        gphoto2: Fix build with clang16 + musl
        pmdk: Upgrade to 1.12.1
        pndk: Add missing dependency on native cmake
        libx86-1: Fix build with clang16
        mongodb: Upgrade to 4.4.19
        glog: Disable 64bit atomics on rv32
        mongodb: Fix type mitmatch found with clang16
        gegl: Remove openmp dep for rv32 and ppc32
        gnome-desktop: Make seccomp dependency optional for rv32
        nodejs: Upgrade to 18.14.2
        libx86-1: Fix build on 32bit x86
        vlc: Upgrade to 3.0.18
        redis: Upgrade 6.x recipe to 6.2.11
        redis: Upgrade 7.x to 7.0.9
        packagegroup-meta-multimedia: mycroft needs pulseaudio
        pahole: Upgrade to tip of trunk
        sg3-utils: Fix build with musl
        gsoap: Upgrade to 2.8.126
        waylandpp: Just enforce opengl for target recipe
        freeglut: Drop -fcommon and add -Wno-implicit-function-declaration
        nodejs: Depend on file-native
        lirc: Fix build with usrmerge feature building on ubuntu hosts
        rp-pppoe: Define _GNU_SOURCE
        libssh: Fix build with clang16
        packagegroup-meta-multimedia: Remove library only packages from rdeps
        packagegroup-meta-oe: Remove mongodb from rdep list of packagegroup
        packagegroup-meta-networking: Set PACKAGE_ARCH = "${MACHINE_ARCH}"
        cmocka: Check for previous declaration of uintptr_t
        ettercap: Fix build with libcurl >= 8
        fluentbit: Disable upstart scripts
        xfstests: Fix build with musl
        nautilus: Fix build with clang and drop unused patch
        gimp: Update to 2.10.34

  Lei Maohui (2):
        libiodbc: Install *.h files to /usr/include/iodbc to fix conflicts error with unixodbc reference to ubuntu:
        pgpool2: Added a new recipe.

  Manoj Saun (1):
        postgresql: fix ptest failure of sysviews test

  Markus Volk (13):
        dav1d: add recipe
        libavif: add recipe
        xdg-dbus-proxy: add recipe
        libnice: upgrade 0.1.18 -> 0.1.21
        pipewire: update 0.3.66 -> 0.3.67
        nv-codec-headers: update 11.1.5.2 -> 12.0.16.0
        wireplumber: update 0.4.13 -> 0.4.14
        libcamera: update 0.0.1 -> 0.0.4
        xdg-desktop-portal: fix bwrap path
        gvfs: add more PACKAGECONFIGS
        evolution-data-server: update 3.46.3 -> 3.48.0
        gtksourceview5: update 5.6.1 -> 5.7.1
        libgtop: update 2.40.0 -> 2.41.1

  Mingli Yu (4):
        php: Upgrade to 8.1.16
        opencv: Upgrade to 4.7.0
        crash: Upgrade to 8.0.2
        mcelog: Upgrade to v191

  Peter Johennecken (1):
        fluentbit: change of download name

  Peter Marko (1):
        dnsmasq: fix CVE-2023-28450

  Petr Gotthard (4):
        openvpn: upgrade 2.6.0 -> 2.6.1
        libqmi: upgrade 1.32.2 -> 1.32.4
        libmbim: upgrade 1.28.2 -> 1.28.4
        modemmanager: upgrade 1.20.4 -> 1.20.6

  Randy MacLeod (4):
        rsyslog: update from 8.2212.0 to 8.2302.0
        rsyslog: add disabled PACKAGECONFIG to drop capabilities
        librelp: make inline errors be warnings in debug build
        cmocka: update from 1.1.5+ to 1.1.7

  Sakib Sajal (1):
        libuser: upgrade v0.63 -> v0.64

  Stefan Ghinea (1):
        redis: fix service redis-server restart not working under sysvinit

  Trevor Woerner (3):
        cups-filters: remove duplicate configure option
        cups-filters: fix ghostscript handling
        hplip: add runtime dependency on ghostscript

  Wang Mingyu (136):
        logcheck: upgrade 1.4.0 -> 1.4.2
        byacc: upgrade 20230201 -> 20230219
        bubblewrap: upgrade 0.7.0 -> 0.8.0
        bats: upgrade 1.8.2 -> 1.9.0
        cryptsetup: upgrade 2.6.0 -> 2.6.1
        c-ares: upgrade 1.18.1 -> 1.19.0
        cukinia: upgrade 0.6.0 -> 0.6.1
        python3-coverage: upgrade 7.2.0 -> 7.2.1
        python3-decouple: upgrade 3.7 -> 3.8
        python3-aiohue: upgrade 4.6.1 -> 4.6.2
        python3-fastnumbers: upgrade 4.0.1 -> 5.0.1
        python3-haversine: upgrade 2.7.0 -> 2.8.0
        python3-google-auth: upgrade 2.16.1 -> 2.16.2
        python3-google-api-python-client: upgrade 2.79.0 -> 2.80.0
        python3-imageio: upgrade 2.25.1 -> 2.26.0
        python3-ipython: upgrade 8.10.0 -> 8.11.0
        python3-nocasedict: upgrade 1.1.0 -> 2.0.0
        python3-natsort: upgrade 8.2.0 -> 8.3.1
        python3-nocaselist: Upgrade 1.1.0 -> 1.1.1
        python3-protobuf: upgrade 4.21.12 -> 4.22.0
        python3-pydicti: upgrade 1.2.0 -> 1.2.1
        python3-watchdog: upgrade 2.3.0-> 2.3.1
        python3-pymisp: upgrade 2.4.168 -> 2.4.168.1
        python3-wrapt: upgrade 1.14.1 -> 1.15.0
        apache2: upgrade 2.4.55 -> 2.4.56
        logwatch: upgrade 7.7 -> 7.8
        libvpx: upgrade 1.12.0 -> 1.13.0
        libjcat: upgrade 0.1.12 -> 0.1.13
        librsync: upgrade 2.3.2 -> 2.3.4
        lcms: upgrade 2.14 -> 2.15
        gsoap: upgrade 2.0.106 -> 2.0.124
        hwdata: upgrade 0.367 -> 0.368
        ctags: upgrade 6.0.20230212.0 -> 6.0.20230305.0
        freerdp: upgrade 2.9.0 -> 2.10.0
        python3-mpmath: upgrade 1.2.1 -> 1.3.0
        python3-alembic: upgrade 1.9.4 -> 1.10.2
        python3-astroid: upgrade 2.14.2 -> 2.15.0
        python3-charset-normalizer: upgrade 3.0.1 -> 3.1.0
        python3-argcomplete upgrade 2.0.0 -> 2.1.1
        python3-fastjsonschema: upgrade 2.16.2 -> 2.16.3
        python3-protobuf: upgrade 4.22.0 -> 4.22.1
        python3-xmlschema: upgrade 2.2.1 -> 2.2.2
        python3-tqdm: upgrade 4.64.1 -> 4.65.0
        python3-pyexpect: upgrade 1.0.21 -> 1.0.22
        python3-pywbem: upgrade 1.6.0 -> 1.6.1
        stunnel: upgrade 5.67 -> 5.69
        rp-pppoe: upgrade 3.14 -> 3.15
        nbdkit: upgrade 1.33.7 -> 1.33.10
        php: update 8.1.16 -> 8.2.3
        tcsh: upgrade 6.22.04 -> 6.24.07
        monit: upgrade 5.32.0 -> 5.33.0
        poppler: upgrade 23.02.0 -> 23.03.0
        satyr: upgrade 0.40 -> 0.42
        nginx: upgrade 1.20.1 -> 1.23.3
        raptor2: upgrade 2.0.15 -> 2.0.16
        spawn-fcgi: upgrade 1.6.4 -> 1.6.5
        unixodbc: Fix install conflict when enable multilib.
        xdebug: upgrade 3.1.1 -> 3.2.0
        postgresql: Fix install conflict when enable multilib.
        networkmanager: upgrade 1.42.0 -> 1.42.4
        rdma-core: upgrade 44.0 -> 45.0
        python3-gcovr: upgrade 5.2 -> 6.0
        makeself: upgrade 2.4.5 -> 2.5.0
        ctags: upgrade 6.0.20230305.0 -> 6.0.20230312.0
        python3-gmqtt: upgrade 0.6.11 -> 0.6.12
        python3-google-api-python-client: upgrade 2.80.0 -> 2.81.0
        python3-msgpack: upgrade 1.0.4 -> 1.0.5
        python3-portion: upgrade 2.3.1 -> 2.4.0
        python3-paramiko: upgrade 3.0.0 -> 3.1.0
        python3-openpyxl: upgrade 3.1.1 -> 3.1.2
        python3-pymisp: upgrade 2.4.168.1 -> 2.4.169
        python3-pydantic: upgrade 1.10.5 -> 1.10.6
        python3-pytest-xdist: upgrade 3.2.0 -> 3.2.1
        python3-pymodbus: upgrade 3.1.3 -> 3.2.0
        python3-smpplib: upgrade 2.2.1 -> 2.2.2
        python3-twitter: upgrade 4.12.1 -> 4.13.0
        python3-unidiff: upgrade 0.7.4 -> 0.7.5
        python3-xlsxwriter: upgrade 3.0.8 -> 3.0.9
        python3-pykickstart: upgrade 3.44 -> 3.45
        python3-web3: upgrade 5.31.3 -> 5.31.4
        python3-pymodbus: upgrade 3.2.0 -> 3.2.1
        python3-geojson: upgrade 2.5.0 -> 3.0.1
        python3-sentry-sdk: upgrade 1.15.0 -> 1.17.0
        python3-apt: upgrade 2.5.2 -> 2.5.3
        python3-argcomplete: upgrade 2.1.1 -> 3.0.0
        python3-cmake: upgrade 3.25.2 -> 3.26.0
        python3-coverage: upgrade 7.2.1 -> 7.2.2
        python3-eth-typing: upgrade 3.2.0 -> 3.3.0
        python3-daemon: upgrade 2.3.2 -> 3.0.1
        python3-engineio: upgrade 4.3.4 -> 4.4.0
        python3-flask-socketio: upgrade 5.3.2 -> 5.3.3
        python3-pykickstart: upgrade 3.45 -> 3.47
        python3-pymisp: upgrade 2.4.169 -> 2.4.169.2
        python3-simplejson: upgrade 3.18.3 -> 3.18.4
        python3-rapidjson: upgrade 1.9 -> 1.10
        python3-socketio: upgrade 5.7.2 -> 5.8.0
        python3-sqlalchemy: upgrade 2.0.4 -> 2.0.7
        python3-tzlocal: upgrade 4.2 -> 4.3
        python3-typeguard: upgrade 2.13.3 -> 3.0.1
        python3-web3: upgrade 5.31.4 -> 6.0.0
        python3-zeroconf: upgrade 0.47.3 -> 0.47.4
        tracker: upgrade 3.4.2 -> 3.5.0
        xterm: upgrade 378 -> 379
        python3-zopeinterface: upgrade 5.5.2 -> 6.0
        xf86-video-amdgpu: upgrade 22.0.0 -> 23.0.0
        libclass-method-modifiers-perl: upgrade 2.13 -> 2.15
        libcompress-raw-bzip2-perl: upgrade 2.201 -> 2.204
        libcompress-raw-lzma-perl: upgrade 2.201 -> 2.204
        libcompress-raw-zlib-perl: upgrade 2.202 -> 2.204
        libio-compress-lzma-perl: upgrade 2.201 -> 2.204
        libio-compress-perl: upgrade 2.201 -> 2.204
        libtest-deep-perl: upgrade 1.130 -> 1.204
        opencl-headers: upgrade 2022.09.30 -> 2023.02.06
        php: upgrade 8.2.3 -> 8.2.4
        googletest: upgrade 1.12.1 -> 1.13.0
        consolation: upgrade 0.0.8 -> 0.0.9
        can-utils: upgrade 2021.08.0 -> 2023.03
        nbdkit: upgrade 1.33.10 -> 1.33.11
        adcli: upgrade 0.9.0 -> 0.9.2
        gnome-chess: upgrade 43.1 -> 43.2
        xfstests: upgrade 2023.01.01 -> 2023.03.05
        gnome-backgrounds: upgrade 43 -> 44.0
        libwacom: upgrade 2.5.0 -> 2.6.0
        libass: upgrade 0.17.0 -> 0.17.1
        libnet-dns-perl: upgrade 1.36 -> 1.37
        libadwaita: upgrade 1.2.1 -> 1.3.1
        libcgi-perl: upgrade 4.55 -> 4.56
        libpeas: upgrade 1.34.0 -> 1.36.0
        gvfs: upgrade 1.50.3 -> 1.50.4
        gnome-system-monitor: upgrade 42.0 -> 44.0
        nautilus: upgrade 43.2 -> 44.0
        babl: upgrade 0.1.98 -> 0.1.102
        ctags: upgrade 6.0.20230312.0 -> 6.0.20230319.0
        folks: upgrade 0.15.5 -> 0.15.6
        gegl: upgrade 0.4.40 -> 0.4.42
        gnome-autoar: upgrade 0.4.3 -> 0.4.4

  Xiangyu Chen (2):
        libbpf: upgrade 0.8.0 -> 1.1.0
        abseil-cpp: upgrade 20221014.0 -> 20230125.1

  Yi Zhao (25):
        audit: upgrade 3.0.9 -> 3.1
        audit: drop version 2.8.5
        frr: add UPSTREAM_CHECK_GITTAGREGEX
        quagga: drop recipe
        libssh: upgrade 0.8.9 -> 0.10.4
        strongswan: 5.9.9 -> 5.9.10
        libnfnetlink: upgrade 1.0.1 -> 1.0.2
        libnetfilter-cthelper: upgrade 1.0.0 -> 1.0.1
        libnetfilter-cttimeout: upgrade 1.0.0 -> 1.0.1
        traceroute: upgrade 2.1.1 -> 2.1.2
        freeradius: add UPSTREAM_CHECK_GITTAGREGEX
        libyang: fix ptest
        libyang: upgrade 2.0.194 -> 2.1.30
        frr: support more arches
        netplan: add missing runtime dependencies
        python3-rich: add recipe
        packagegroup-meta-networking: add frr
        packagegroup-meta-oe: enable build libyang on riscv32/64
        libnftnl: upgrade 1.2.4 -> 1.2.5
        libldb: upgrade 2.6.1 -> 2.7.1
        samba: upgrade 4.17.5 -> 4.18.0
        libssh: add ptest
        mbedtls: add ptest
        libyang: upgrade 2.1.30 -> 2.1.55
        tcpreplay: 4.4.2 -> 4.4.3

  Yoann Congal (4):
        libusb-compat: Revert "libusb-compat: move libraries to base_libdir"
        libusb-compat: upgrade sources to fix -native build
        libusb-compat: add simple ptest (example programs)
        libusb-compat: RDEPENDS on libusb1

  Yue Tao (1):
        Introduce python3-trustme to fix ptest error of python3-requests-toolbelt

  Zhixiong Chi (2):
        ntp: drop the deprecated ntpdate
        python3-betamax: fix ptest failture of fixture and record modes

  Zoltán Böszörményi (13):
        opencl-icd-loader: Add RPROVIDES:${PN} = "virtual/opencl-icd"
        ocl-icd: Add PROVIDES and RPROVIDES for virtual/opencl-icd
        meta-oe/conf/layer.conf: Add PREFERRED_[R]PROVIDER_virtual/opencl-icd
        python3-ninja: New recipe
        python3-cmake: New recipe
        python3-scikit-build: New recipe
        python3-pyproject-metadata: New recipe
        opencv: Support OpenVINO
        python3-executing: New recipe
        python3-pure-eval: New recipe
        python3-stack-data: New recipe
        python3-ipython: Add missing dependency
        opencv: Fix PACKAGECONFIG[openvino]

Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
Change-Id: Idbfcd5f4c03ed5bd9c72558714edbe0200495aad
diff --git a/poky/meta/lib/oeqa/selftest/cases/_sstatetests_noauto.py b/poky/meta/lib/oeqa/selftest/cases/_sstatetests_noauto.py
index 5f1c8df..2c9584d 100644
--- a/poky/meta/lib/oeqa/selftest/cases/_sstatetests_noauto.py
+++ b/poky/meta/lib/oeqa/selftest/cases/_sstatetests_noauto.py
@@ -9,7 +9,7 @@
 
 import oeqa.utils.ftools as ftools
 from oeqa.utils.commands import runCmd, bitbake, get_bb_var
-from oeqa.selftest.cases.sstate import SStateBase
+from oeqa.selftest.cases.sstatetests import SStateBase
 
 
 class RebuildFromSState(SStateBase):
diff --git a/poky/meta/lib/oeqa/selftest/cases/cve_check.py b/poky/meta/lib/oeqa/selftest/cases/cve_check.py
index ac47af1..9534c97 100644
--- a/poky/meta/lib/oeqa/selftest/cases/cve_check.py
+++ b/poky/meta/lib/oeqa/selftest/cases/cve_check.py
@@ -54,6 +54,25 @@
         self.assertTrue( result ,msg="Failed to compare version with suffix '1.0_patch2' < '1.0_patch3'")
 
 
+    def test_convert_cve_version(self):
+        from oe.cve_check import convert_cve_version
+
+        # Default format
+        self.assertEqual(convert_cve_version("8.3"), "8.3")
+        self.assertEqual(convert_cve_version(""), "")
+
+        # OpenSSL format version
+        self.assertEqual(convert_cve_version("1.1.1t"), "1.1.1t")
+
+        # OpenSSH format
+        self.assertEqual(convert_cve_version("8.3_p1"), "8.3p1")
+        self.assertEqual(convert_cve_version("8.3_p22"), "8.3p22")
+
+        # Linux kernel format
+        self.assertEqual(convert_cve_version("6.2_rc8"), "6.2-rc8")
+        self.assertEqual(convert_cve_version("6.2_rc31"), "6.2-rc31")
+
+
     def test_recipe_report_json(self):
         config = """
 INHERIT += "cve-check"
diff --git a/poky/meta/lib/oeqa/selftest/cases/devtool.py b/poky/meta/lib/oeqa/selftest/cases/devtool.py
index 86014d2..81d0201 100644
--- a/poky/meta/lib/oeqa/selftest/cases/devtool.py
+++ b/poky/meta/lib/oeqa/selftest/cases/devtool.py
@@ -276,6 +276,7 @@
         cls.sstate_conf  = 'SSTATE_DIR = "%s"\n' % cls.devtool_sstate
         cls.sstate_conf += ('SSTATE_MIRRORS += "file://.* file:///%s/PATH"\n'
                             % cls.original_sstate)
+        cls.sstate_conf += ('BB_HASHSERVE_UPSTREAM = "hashserv.yocto.io:8687"\n')
 
     @classmethod
     def tearDownClass(cls):
diff --git a/poky/meta/lib/oeqa/selftest/cases/eSDK.py b/poky/meta/lib/oeqa/selftest/cases/esdk.py
similarity index 100%
rename from poky/meta/lib/oeqa/selftest/cases/eSDK.py
rename to poky/meta/lib/oeqa/selftest/cases/esdk.py
diff --git a/poky/meta/lib/oeqa/selftest/cases/fitimage.py b/poky/meta/lib/oeqa/selftest/cases/fitimage.py
index 1570d54..7bc171e 100644
--- a/poky/meta/lib/oeqa/selftest/cases/fitimage.py
+++ b/poky/meta/lib/oeqa/selftest/cases/fitimage.py
@@ -5,7 +5,7 @@
 #
 
 from oeqa.selftest.case import OESelftestTestCase
-from oeqa.utils.commands import runCmd, bitbake, get_bb_var
+from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars
 import os
 import re
 
@@ -42,15 +42,14 @@
         self.write_config(config)
 
         # fitImage is created as part of linux recipe
-        bitbake("virtual/kernel")
+        image = "virtual/kernel"
+        bitbake(image)
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'INITRAMFS_IMAGE_NAME', 'KERNEL_FIT_LINK_NAME'], image)
 
-        image_type = "core-image-minimal"
-        deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
-        machine = get_bb_var('MACHINE')
-        fitimage_its_path = os.path.join(deploy_dir_image,
-            "fitImage-its-%s-%s-%s" % (image_type, machine, machine))
-        fitimage_path = os.path.join(deploy_dir_image,
-            "fitImage-%s-%s-%s" % (image_type, machine, machine))
+        fitimage_its_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'],
+            "fitImage-its-%s-%s" % (bb_vars['INITRAMFS_IMAGE_NAME'], bb_vars['KERNEL_FIT_LINK_NAME']))
+        fitimage_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'],
+            "fitImage-%s-%s" % (bb_vars['INITRAMFS_IMAGE_NAME'], bb_vars['KERNEL_FIT_LINK_NAME']))
 
         self.assertTrue(os.path.exists(fitimage_its_path),
             "%s image tree source doesn't exist" % (fitimage_its_path))
@@ -123,15 +122,14 @@
         self.write_config(config)
 
         # fitImage is created as part of linux recipe
-        bitbake("virtual/kernel")
+        image = "virtual/kernel"
+        bitbake(image)
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'KERNEL_FIT_LINK_NAME'], image)
 
-        image_type = "core-image-minimal"
-        deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
-        machine = get_bb_var('MACHINE')
-        fitimage_its_path = os.path.join(deploy_dir_image,
-            "fitImage-its-%s" % (machine,))
-        fitimage_path = os.path.join(deploy_dir_image,
-            "fitImage-%s.bin" % (machine,))
+        fitimage_its_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'],
+            "fitImage-its-%s" % (bb_vars['KERNEL_FIT_LINK_NAME']))
+        fitimage_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'],
+            "fitImage-%s.bin" % (bb_vars['KERNEL_FIT_LINK_NAME']))
 
         self.assertTrue(os.path.exists(fitimage_its_path),
             "%s image tree source doesn't exist" % (fitimage_its_path))
diff --git a/poky/meta/lib/oeqa/selftest/cases/gdbserver.py b/poky/meta/lib/oeqa/selftest/cases/gdbserver.py
index 3621d9c..9da97ae 100644
--- a/poky/meta/lib/oeqa/selftest/cases/gdbserver.py
+++ b/poky/meta/lib/oeqa/selftest/cases/gdbserver.py
@@ -10,13 +10,12 @@
 import concurrent.futures
 
 from oeqa.selftest.case import OESelftestTestCase
-from oeqa.utils.commands import bitbake, get_bb_var, runqemu, runCmd
+from oeqa.utils.commands import bitbake, get_bb_var, get_bb_vars , runqemu, runCmd
 
 class GdbServerTest(OESelftestTestCase):
     def test_gdb_server(self):
         target_arch = self.td["TARGET_ARCH"]
         target_sys = self.td["TARGET_SYS"]
-        deploy_dir = get_bb_var("DEPLOY_DIR_IMAGE")
 
         features = """
 IMAGE_GEN_DEBUGFS = "1"
@@ -34,11 +33,13 @@
         r = runCmd("%s --version" % gdb_binary, native_sysroot=native_sysroot, target_sys=target_sys)
         self.assertEqual(r.status, 0)
         self.assertIn("GNU gdb", r.output)
+        image = 'core-image-minimal'
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'], image)
 
         with tempfile.TemporaryDirectory(prefix="debugfs-") as debugfs:
-            filename = os.path.join(deploy_dir, "core-image-minimal-%s-dbg.tar.bz2" % self.td["MACHINE"])
+            filename = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], "%s-dbg.tar.bz2" % bb_vars['IMAGE_LINK_NAME'])
             shutil.unpack_archive(filename, debugfs)
-            filename = os.path.join(deploy_dir, "core-image-minimal-%s.tar.bz2" % self.td["MACHINE"])
+            filename = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], "%s.tar.bz2" % bb_vars['IMAGE_LINK_NAME'])
             shutil.unpack_archive(filename, debugfs)
 
             with runqemu("core-image-minimal", runqemuparams="nographic") as qemu:
diff --git a/poky/meta/lib/oeqa/selftest/cases/imagefeatures.py b/poky/meta/lib/oeqa/selftest/cases/imagefeatures.py
index af38150..d31b43d 100644
--- a/poky/meta/lib/oeqa/selftest/cases/imagefeatures.py
+++ b/poky/meta/lib/oeqa/selftest/cases/imagefeatures.py
@@ -6,7 +6,7 @@
 
 from oeqa.selftest.case import OESelftestTestCase
 from oeqa.core.decorator import OETestTag
-from oeqa.utils.commands import runCmd, bitbake, get_bb_var, runqemu
+from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars, runqemu
 from oeqa.utils.sshcontrol import SSHControl
 import glob
 import os
@@ -102,12 +102,11 @@
         features = 'IMAGE_FSTYPES += " ext4 ext4.bmap ext4.bmap.gz"'
         self.write_config(features)
 
-        image_name = 'core-image-minimal'
-        bitbake(image_name)
+        image = 'core-image-minimal'
+        bitbake(image)
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'], image)
 
-        deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
-        link_name = get_bb_var('IMAGE_LINK_NAME', image_name)
-        image_path = os.path.join(deploy_dir_image, "%s.ext4" % link_name)
+        image_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], "%s.ext4" % bb_vars['IMAGE_LINK_NAME'])
         bmap_path = "%s.bmap" % image_path
         gzip_path = "%s.gz" % bmap_path
 
@@ -120,8 +119,8 @@
         image_stat = os.stat(image_path)
         self.assertGreater(image_stat.st_size, image_stat.st_blocks * 512)
 
-        # check if the resulting gzip is valid
-        self.assertTrue(runCmd('gzip -t %s' % gzip_path))
+        # check if the resulting gzip is valid, --force is needed in case gzip_path is a symlink
+        self.assertTrue(runCmd('gzip --test --force %s' % gzip_path))
 
     def test_hypervisor_fmts(self):
         """
@@ -139,14 +138,13 @@
             features += 'IMAGE_FSTYPES += "ext4.%s"\n' % itype
         self.write_config(features)
 
-        image_name = 'core-image-minimal'
-        bitbake(image_name)
+        image = 'core-image-minimal'
+        bitbake(image)
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'], image)
 
-        deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
-        link_name = get_bb_var('IMAGE_LINK_NAME', image_name)
         for itype in img_types:
-            image_path = os.path.join(deploy_dir_image, "%s.ext4.%s" %
-                                      (link_name, itype))
+            image_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], "%s.ext4.%s" %
+                                      (bb_vars['IMAGE_LINK_NAME'], itype))
 
             # check if result image file is in deploy directory
             self.assertTrue(os.path.exists(image_path))
@@ -177,13 +175,11 @@
         features = 'IMAGE_FSTYPES += "%s %s.sha256sum"' % (conv, conv)
         self.write_config(features)
 
-        image_name = 'core-image-minimal'
-        bitbake(image_name)
-
-        deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
-        link_name = get_bb_var('IMAGE_LINK_NAME', image_name)
-        image_path = os.path.join(deploy_dir_image, "%s.%s" %
-                                  (link_name, conv))
+        image = 'core-image-minimal'
+        bitbake(image)
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'], image)
+        image_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], "%s.%s" %
+                                  (bb_vars['IMAGE_LINK_NAME'], conv))
 
         # check if resulting image is in the deploy directory
         self.assertTrue(os.path.exists(image_path))
@@ -191,7 +187,7 @@
 
         # check if the resulting sha256sum agrees
         self.assertTrue(runCmd('cd %s;sha256sum -c %s.%s.sha256sum' %
-                               (deploy_dir_image, link_name, conv)))
+                               (bb_vars['DEPLOY_DIR_IMAGE'], bb_vars['IMAGE_LINK_NAME'], conv)))
 
     def test_image_fstypes(self):
         """
@@ -200,10 +196,10 @@
         Product:     oe-core
         Author:      Ed Bartosh <ed.bartosh@linux.intel.com>
         """
-        image_name = 'core-image-minimal'
+        image = 'core-image-minimal'
 
-        all_image_types = set(get_bb_var("IMAGE_TYPES", image_name).split())
-        skip_image_types = set(('container', 'elf', 'f2fs', 'multiubi', 'tar.zst', 'wic.zst', 'squashfs-lzo'))
+        all_image_types = set(get_bb_var("IMAGE_TYPES", image).split())
+        skip_image_types = set(('container', 'elf', 'f2fs', 'tar.zst', 'wic.zst', 'squashfs-lzo'))
         img_types = all_image_types - skip_image_types
 
         config = """
@@ -211,17 +207,31 @@
 WKS_FILE = "wictestdisk.wks"
 MKUBIFS_ARGS ?= "-m 2048 -e 129024 -c 2047"
 UBINIZE_ARGS ?= "-m 2048 -p 128KiB -s 512"
+MULTIUBI_BUILD += "mtd_2_128"
+MKUBIFS_ARGS_mtd_2_128 ?= "-m 2048 -e 129024 -c 2047"
+UBINIZE_ARGS_mtd_2_128 ?= "-m 2048 -p 128KiB -s 512"
+MULTIUBI_BUILD += "mtd_4_256"
+MKUBIFS_ARGS_mtd_4_256 ?= "-m 4096 -e 253952 -c 4096"
+UBINIZE_ARGS_mtd_4_256 ?= "-m 4096 -p 256KiB"
 """ % ' '.join(img_types)
         self.write_config(config)
 
-        bitbake(image_name)
+        bitbake(image)
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME', 'MULTIUBI_BUILD'], image)
 
-        deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
-        link_name = get_bb_var('IMAGE_LINK_NAME', image_name)
         for itype in img_types:
-            image_path = os.path.join(deploy_dir_image, "%s.%s" % (link_name, itype))
-            # check if result image is in deploy directory
-            self.assertTrue(os.path.exists(image_path),
+            if itype == 'multiubi':
+                # For multiubi build we need to manage MULTIUBI_BUILD entry to append
+                # specific name to IMAGE_LINK_NAME
+                for vname in bb_vars['MULTIUBI_BUILD'].split():
+                    image_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], "%s_%s.ubifs" % (bb_vars['IMAGE_LINK_NAME'], vname))
+                    # check if result image is in deploy directory
+                    self.assertTrue(os.path.exists(image_path),
+                                    "%s image %s doesn't exist" % (itype, image_path))
+            else:
+            	image_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], "%s.%s" % (bb_vars['IMAGE_LINK_NAME'], itype))
+            	# check if result image is in deploy directory
+            	self.assertTrue(os.path.exists(image_path),
                             "%s image %s doesn't exist" % (itype, image_path))
 
     def test_useradd_static(self):
@@ -271,19 +281,20 @@
                      Yeoh Ee Peng <ee.peng.yeoh@intel.com>
         """
       
-        image_name = 'core-image-minimal'
+        image = 'core-image-minimal'
+        image_fstypes_debugfs = 'tar.bz2'
         features = 'IMAGE_GEN_DEBUGFS = "1"\n'
-        features += 'IMAGE_FSTYPES_DEBUGFS = "tar.bz2"\n'
+        features += 'IMAGE_FSTYPES_DEBUGFS = "%s"\n' % image_fstypes_debugfs
         self.write_config(features)
 
-        bitbake(image_name)
-        deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
-        dbg_tar_file = os.path.join(deploy_dir_image, "*-dbg.rootfs.tar.bz2")
-        debug_files = glob.glob(dbg_tar_file)
-        self.assertNotEqual(len(debug_files), 0, 'debug filesystem not generated at %s' % dbg_tar_file)
-        result = runCmd('cd %s; tar xvf %s' % (deploy_dir_image, dbg_tar_file))
+        bitbake(image)
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'], image)
+
+        dbg_tar_file = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], "%s-dbg.%s" % (bb_vars['IMAGE_LINK_NAME'], image_fstypes_debugfs))
+        self.assertTrue(os.path.exists(dbg_tar_file), 'debug filesystem not generated at %s' % dbg_tar_file)
+        result = runCmd('cd %s; tar xvf %s' % (bb_vars['DEPLOY_DIR_IMAGE'], dbg_tar_file))
         self.assertEqual(result.status, 0, msg='Failed to extract %s: %s' % (dbg_tar_file, result.output))
-        result = runCmd('find %s -name %s' % (deploy_dir_image, "udevadm"))
+        result = runCmd('find %s -name %s' % (bb_vars['DEPLOY_DIR_IMAGE'], "udevadm"))
         self.assertTrue("udevadm" in result.output, msg='Failed to find udevadm: %s' % result.output)
         dbg_symbols_targets = result.output.splitlines()
         self.assertTrue(dbg_symbols_targets, msg='Failed to split udevadm: %s' % dbg_symbols_targets)
@@ -293,9 +304,33 @@
 
     def test_empty_image(self):
         """Test creation of image with no packages"""
-        bitbake('test-empty-image')
-        res_dir = get_bb_var('DEPLOY_DIR_IMAGE')
-        images = os.path.join(res_dir, "test-empty-image-*.manifest")
-        result = glob.glob(images)
-        with open(result[1],"r") as f:
+        image = 'test-empty-image'
+        bitbake(image)
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'], image)
+        manifest = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], "%s.manifest" % bb_vars['IMAGE_LINK_NAME'])
+        self.assertTrue(os.path.exists(manifest))
+
+        with open(manifest, "r") as f:
                 self.assertEqual(len(f.read().strip()),0)
+
+    def test_mandb(self):
+        """
+        Test that an image containing manpages has working man and apropos commands.
+        """
+        config = """
+DISTRO_FEATURES:append = " api-documentation"
+CORE_IMAGE_EXTRA_INSTALL = "man-pages kmod-doc"
+"""
+        self.write_config(config)
+        bitbake("core-image-minimal")
+
+        with runqemu('core-image-minimal', ssh=False, runqemuparams='nographic') as qemu:
+            # This manpage is provided by man-pages
+            status, output = qemu.run_serial("apropos 8859")
+            self.assertEqual(status, 1, 'Failed to run apropos: %s' % (output))
+            self.assertIn("iso_8859_15", output)
+
+            # This manpage is provided by kmod
+            status, output = qemu.run_serial("man --pager=cat modprobe")
+            self.assertEqual(status, 1, 'Failed to run man: %s' % (output))
+            self.assertIn("force-modversion", output)
diff --git a/poky/meta/lib/oeqa/selftest/cases/minidebuginfo.py b/poky/meta/lib/oeqa/selftest/cases/minidebuginfo.py
index 7947c38..aa1f9fa 100644
--- a/poky/meta/lib/oeqa/selftest/cases/minidebuginfo.py
+++ b/poky/meta/lib/oeqa/selftest/cases/minidebuginfo.py
@@ -9,7 +9,7 @@
 import shutil
 
 from oeqa.selftest.case import OESelftestTestCase
-from oeqa.utils.commands import bitbake, get_bb_var, runCmd
+from oeqa.utils.commands import bitbake, get_bb_var, get_bb_vars, runCmd
 
 
 class Minidebuginfo(OESelftestTestCase):
@@ -17,27 +17,28 @@
         target_sys = get_bb_var("TARGET_SYS")
         binutils = "binutils-cross-{}".format(get_bb_var("TARGET_ARCH"))
 
+        image = 'core-image-minimal'
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME', 'READELF'], image)
+
         self.write_config("""
 PACKAGE_MINIDEBUGINFO = "1"
 IMAGE_FSTYPES = "tar.bz2"
 """)
-        bitbake("core-image-minimal {}:do_addto_recipe_sysroot".format(binutils))
+        bitbake("{} {}:do_addto_recipe_sysroot".format(image, binutils))
 
-        deploy_dir = get_bb_var("DEPLOY_DIR_IMAGE")
         native_sysroot = get_bb_var("RECIPE_SYSROOT_NATIVE", binutils)
-        readelf = get_bb_var("READELF", "core-image-minimal")
 
         # confirm that executables and shared libraries contain an ELF section
         # ".gnu_debugdata" which stores minidebuginfo.
         with tempfile.TemporaryDirectory(prefix = "unpackfs-") as unpackedfs:
-            filename = os.path.join(deploy_dir, "core-image-minimal-{}.tar.bz2".format(self.td["MACHINE"]))
+            filename = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], "{}.tar.bz2".format(bb_vars['IMAGE_LINK_NAME']))
             shutil.unpack_archive(filename, unpackedfs)
 
-            r = runCmd([readelf, "-W", "-S", os.path.join(unpackedfs, "bin", "busybox")],
+            r = runCmd([bb_vars['READELF'], "-W", "-S", os.path.join(unpackedfs, "bin", "busybox")],
                     native_sysroot = native_sysroot, target_sys = target_sys)
             self.assertIn(".gnu_debugdata", r.output)
 
-            r = runCmd([readelf, "-W", "-S", os.path.join(unpackedfs, "lib", "libc.so.6")],
+            r = runCmd([bb_vars['READELF'], "-W", "-S", os.path.join(unpackedfs, "lib", "libc.so.6")],
                     native_sysroot = native_sysroot, target_sys = target_sys)
             self.assertIn(".gnu_debugdata", r.output)
 
diff --git a/poky/meta/lib/oeqa/selftest/cases/overlayfs.py b/poky/meta/lib/oeqa/selftest/cases/overlayfs.py
index dfd9f14..b4f0663 100644
--- a/poky/meta/lib/oeqa/selftest/cases/overlayfs.py
+++ b/poky/meta/lib/oeqa/selftest/cases/overlayfs.py
@@ -139,10 +139,10 @@
 
         config = """
 IMAGE_INSTALL:append = " overlayfs-user systemd-machine-units"
-DISTRO_FEATURES:append = " systemd overlayfs"
+DISTRO_FEATURES:append = " overlayfs"
 
 # Use systemd as init manager
-VIRTUAL-RUNTIME_init_manager = "systemd"
+INIT_MANAGER = "systemd"
 
 # enable overlayfs in the kernel
 KERNEL_EXTRA_FEATURES:append = " features/overlayfs/overlayfs.scc"
@@ -274,10 +274,8 @@
         """
 
         configBase = """
-DISTRO_FEATURES:append = " systemd"
-
 # Use systemd as init manager
-VIRTUAL-RUNTIME_init_manager = "systemd"
+INIT_MANAGER = "systemd"
 
 # enable overlayfs in the kernel
 KERNEL_EXTRA_FEATURES:append = " features/overlayfs/overlayfs.scc"
@@ -316,10 +314,8 @@
         """
 
         config = """
-DISTRO_FEATURES:append = " systemd"
-
 # Use systemd as init manager
-VIRTUAL-RUNTIME_init_manager = "systemd"
+INIT_MANAGER = "systemd"
 
 # enable overlayfs in the kernel
 KERNEL_EXTRA_FEATURES:append = " features/overlayfs/overlayfs.scc"
@@ -344,10 +340,8 @@
         """
 
         config = """
-DISTRO_FEATURES:append = " systemd"
-
 # Use systemd as init manager
-VIRTUAL-RUNTIME_init_manager = "systemd"
+INIT_MANAGER = "systemd"
 
 # enable overlayfs in the kernel
 KERNEL_EXTRA_FEATURES:append = " features/overlayfs/overlayfs.scc"
@@ -465,10 +459,8 @@
 
     def get_working_config(self):
         return """
-DISTRO_FEATURES:append = " systemd"
-
 # Use systemd as init manager
-VIRTUAL-RUNTIME_init_manager = "systemd"
+INIT_MANAGER = "systemd"
 
 # enable overlayfs in the kernel
 KERNEL_EXTRA_FEATURES:append = " features/overlayfs/overlayfs.scc"
diff --git a/poky/meta/lib/oeqa/selftest/cases/package.py b/poky/meta/lib/oeqa/selftest/cases/package.py
index 4f7cd10..1aa6c03 100644
--- a/poky/meta/lib/oeqa/selftest/cases/package.py
+++ b/poky/meta/lib/oeqa/selftest/cases/package.py
@@ -89,6 +89,13 @@
             self.assertEqual(status - 100, sort, "%s %s (%d) failed" % (ver1, ver2, sort))
 
 class PackageTests(OESelftestTestCase):
+    # Verify that a recipe cannot rename a package into an existing one
+    def test_package_name_conflict(self):
+        res = bitbake("packagenameconflict", ignore_status=True)
+        self.assertNotEqual(res.status, 0)
+        err = "package name already exists"
+        self.assertTrue(err in res.output)
+
     # Verify that a recipe which sets up hardlink files has those preserved into split packages
     # Also test file sparseness is preserved
     def test_preserve_sparse_hardlinks(self):
diff --git a/poky/meta/lib/oeqa/selftest/cases/recipetool.py b/poky/meta/lib/oeqa/selftest/cases/recipetool.py
index 25b06cd..b193f0f 100644
--- a/poky/meta/lib/oeqa/selftest/cases/recipetool.py
+++ b/poky/meta/lib/oeqa/selftest/cases/recipetool.py
@@ -581,7 +581,10 @@
 
         commonlicdir = get_bb_var('COMMON_LICENSE_DIR')
 
-        d = bb.tinfoil.TinfoilDataStoreConnector
+        class DataConnectorCopy(bb.tinfoil.TinfoilDataStoreConnector):
+            pass
+
+        d = DataConnectorCopy
         d.getVar = Mock(return_value=commonlicdir)
 
         srctree = tempfile.mkdtemp(prefix='recipetoolqa')
diff --git a/poky/meta/lib/oeqa/selftest/cases/reproducible.py b/poky/meta/lib/oeqa/selftest/cases/reproducible.py
index f4dd779..cd7aa8a 100644
--- a/poky/meta/lib/oeqa/selftest/cases/reproducible.py
+++ b/poky/meta/lib/oeqa/selftest/cases/reproducible.py
@@ -292,9 +292,13 @@
                         self.copy_file(d.reference, '/'.join([save_dir, 'packages-excluded', strip_topdir(d.reference)]))
                         self.copy_file(d.test, '/'.join([save_dir, 'packages-excluded', strip_topdir(d.test)]))
 
-                if result.missing or result.different:
-                    fails.append("The following %s packages are missing or different and not in exclusion list: %s" %
-                            (c, '\n'.join(r.test for r in (result.missing + result.different))))
+                if result.different:
+                    fails.append("The following %s packages are different and not in exclusion list:\n%s" %
+                            (c, '\n'.join(r.test for r in (result.different))))
+
+                if result.missing and len(self.sstate_targets) == 0:
+                    fails.append("The following %s packages are missing and not in exclusion list:\n%s" %
+                            (c, '\n'.join(r.test for r in (result.missing))))
 
         # Clean up empty directories
         if self.save_results:
diff --git a/poky/meta/lib/oeqa/selftest/cases/resulttooltests.py b/poky/meta/lib/oeqa/selftest/cases/resulttooltests.py
index f059991..c3303f3 100644
--- a/poky/meta/lib/oeqa/selftest/cases/resulttooltests.py
+++ b/poky/meta/lib/oeqa/selftest/cases/resulttooltests.py
@@ -274,14 +274,14 @@
             "MACHINE": "qemux86"
         }, "result": {
             "ltpresult_foo": {
-                "STATUS": "PASSED"
+                "status": "PASSED"
             }}}
         target_configuration = {"configuration": {
             "TEST_TYPE": "runtime",
             "MACHINE": "qemux86_64"
         }, "result": {
             "bar": {
-                "STATUS": "PASSED"
+                "status": "PASSED"
             }}}
         self.assertFalse(regression.can_be_compared(self.logger, base_configuration, target_configuration),
                          msg="incorrect ltpresult filtering, mismatching ltpresult content should not be compared")
@@ -292,52 +292,84 @@
             "MACHINE": "qemux86"
         }, "result": {
             "ltpresult_foo": {
-                "STATUS": "PASSED"
+                "status": "PASSED"
             }}}
         target_configuration = {"configuration": {
             "TEST_TYPE": "runtime",
             "MACHINE": "qemux86"
         }, "result": {
             "ltpresult_foo": {
-                "STATUS": "PASSED"
+                "status": "PASSED"
             }}}
         self.assertTrue(regression.can_be_compared(self.logger, base_configuration, target_configuration),
                         msg="incorrect ltpresult filtering, matching ltpresult content should be compared")
 
     def test_can_match_non_static_ptest_names(self):
-        base_configuration = {"configuration": {
-            "TEST_TYPE": "runtime",
-            "MACHINE": "qemux86"
-        }, "result": {
-            "ptestresult.lttng-tools.foo_-_bar_-_moo": {
-                "STATUS": "PASSED"
-            },
-            "ptestresult.babeltrace.bar_-_moo_-_foo": {
-                "STATUS": "PASSED"
-            },
-            "ptestresult.babletrace2.moo_-_foo_-_bar": {
-                "STATUS": "PASSED"
-            },
-            "ptestresult.curl.test_0000__foo_out_of_bar": {
-                "STATUS": "PASSED"
-            }
-        }}
-        target_configuration = {"configuration": {
-            "TEST_TYPE": "runtime",
-            "MACHINE": "qemux86"
-        }, "result": {
-            "ptestresult.lttng-tools.xxx_-_yyy_-_zzz": {
-                "STATUS": "PASSED"
-            },
-            "ptestresult.babeltrace.yyy_-_zzz_-_xxx": {
-                "STATUS": "PASSED"
-            },
-            "ptestresult.babletrace2.zzz_-_xxx_-_yyy": {
-                "STATUS": "PASSED"
-            },
-            "ptestresult.curl.test_0000__xxx_out_of_yyy": {
-                "STATUS": "PASSED"
-            }
-            }}
-        self.assertTrue(regression.can_be_compared(self.logger, base_configuration, target_configuration),
-                        msg="incorrect ptests filtering, tests shoould be compared if prefixes match")
+        base_configuration = {"a": {
+            "conf_X": {
+                "configuration": {
+                    "TEST_TYPE": "runtime",
+                    "MACHINE": "qemux86"
+                }, "result": {
+                    "ptestresult.lttng-tools.foo_-_bar_-_moo": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.babeltrace.bar_-_moo_-_foo": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.babeltrace2.moo_-_foo_-_bar": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.curl.test_0000__foo_out_of_bar": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.dbus.test_0000__foo_out_of_bar,_remaining:_00:02,_took_0.032s,_duration:_03:32_": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.binutils-ld.in testcase /foo/build-st-bar/moo/ctf.exp": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.gcc-libstdc++-v3.Couldn't create remote directory /tmp/runtest.30975 on target": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.gcc-libgomp.Couldn't create remote directory /tmp/runtest.3657621 on": {
+                        "status": "PASSED"
+                    }
+                }}}}
+        target_configuration = {"a": {
+            "conf_Y": {
+                "configuration": {
+                    "TEST_TYPE": "runtime",
+                    "MACHINE": "qemux86"
+                }, "result": {
+                    "ptestresult.lttng-tools.foo_-_yyy_-_zzz": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.babeltrace.bar_-_zzz_-_xxx": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.babeltrace2.moo_-_xxx_-_yyy": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.curl.test_0000__xxx_out_of_yyy": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.dbus.test_0000__yyy_out_of_zzz,_remaining:_00:03,_took_0.034s,_duration:_03:30_": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.binutils-ld.in testcase /xxx/build-st-yyy/zzz/ctf.exp": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.gcc-libstdc++-v3.Couldn't create remote directory /tmp/runtest.45678 on target": {
+                        "status": "PASSED"
+                    },
+                    "ptestresult.gcc-libgomp.Couldn't create remote directory /tmp/runtest.3657621 on": {
+                        "status": "PASSED"
+                    }
+                }}}}
+        regression.fixup_ptest_names(base_configuration, self.logger)
+        regression.fixup_ptest_names(target_configuration, self.logger)
+        result, resultstring = regression.compare_result(
+            self.logger, "A", "B", base_configuration["a"]["conf_X"], target_configuration["a"]["conf_Y"])
+        self.assertDictEqual(
+            result, {}, msg=f"ptests should be compared: {resultstring}")
diff --git a/poky/meta/lib/oeqa/selftest/cases/runqemu.py b/poky/meta/lib/oeqa/selftest/cases/runqemu.py
index c2c3fbc..e72ff52 100644
--- a/poky/meta/lib/oeqa/selftest/cases/runqemu.py
+++ b/poky/meta/lib/oeqa/selftest/cases/runqemu.py
@@ -24,6 +24,7 @@
         super(RunqemuTests, self).setUpLocal()
         self.recipe = 'core-image-minimal'
         self.machine =  self.td['MACHINE']
+        self.image_link_name =  get_bb_var('IMAGE_LINK_NAME', self.recipe)
 
         self.fstypes = "ext4"
         if self.td["HOST_ARCH"] in ('i586', 'i686', 'x86_64'):
@@ -127,7 +128,7 @@
 
     def test_boot_qemu_boot(self):
         """Test runqemu /path/to/image.qemuboot.conf"""
-        qemuboot_conf = "%s-%s.qemuboot.conf" % (self.recipe, self.machine)
+        qemuboot_conf = "%s.qemuboot.conf" % (self.image_link_name)
         qemuboot_conf = os.path.join(self.deploy_dir_image, qemuboot_conf)
         if not os.path.exists(qemuboot_conf):
             self.skipTest("%s not found" % qemuboot_conf)
@@ -138,7 +139,7 @@
 
     def test_boot_rootfs(self):
         """Test runqemu /path/to/rootfs.ext4"""
-        rootfs = "%s-%s.ext4" % (self.recipe, self.machine)
+        rootfs = "%s.ext4" % (self.image_link_name)
         rootfs = os.path.join(self.deploy_dir_image, rootfs)
         if not os.path.exists(rootfs):
             self.skipTest("%s not found" % rootfs)
@@ -167,8 +168,9 @@
         cls.recipe = 'core-image-minimal'
         cls.machine =  get_bb_var('MACHINE')
         cls.deploy_dir_image =  get_bb_var('DEPLOY_DIR_IMAGE')
+        cls.image_link_name =  get_bb_var('IMAGE_LINK_NAME', cls.recipe)
         cls.cmd_common = "runqemu nographic"
-        cls.qemuboot_conf = "%s-%s.qemuboot.conf" % (cls.recipe, cls.machine)
+        cls.qemuboot_conf = "%s.qemuboot.conf" % (cls.image_link_name)
         cls.qemuboot_conf = os.path.join(cls.deploy_dir_image, cls.qemuboot_conf)
         bitbake(cls.recipe)
 
@@ -200,7 +202,7 @@
             self.assertTrue(qemu_shutdown_succeeded, 'Failed: %s does not shutdown within timeout(%s)' % (self.machine, shutdown_timeout))
 
     def test_qemu_can_boot_nfs_and_shutdown(self):
-        rootfs_tar = "%s-%s.tar.bz2" % (self.recipe, self.machine)
+        rootfs_tar = "%s.tar.bz2" % (self.image_link_name)
         rootfs_tar = os.path.join(self.deploy_dir_image, rootfs_tar)
         self.assertExists(rootfs_tar)
         cmd = "%s %s" % (self.cmd_common, rootfs_tar)
diff --git a/poky/meta/lib/oeqa/selftest/cases/runtime_test.py b/poky/meta/lib/oeqa/selftest/cases/runtime_test.py
index e32c4af..81b8d05 100644
--- a/poky/meta/lib/oeqa/selftest/cases/runtime_test.py
+++ b/poky/meta/lib/oeqa/selftest/cases/runtime_test.py
@@ -257,7 +257,8 @@
         import subprocess, os
 
         distro = oe.lsb.distro_identifier()
-        if distro and (distro in ['debian-9', 'debian-10', 'centos-7', 'centos-8', 'ubuntu-16.04', 'ubuntu-18.04'] or distro.startswith('almalinux')):
+        if distro and (distro in ['debian-9', 'debian-10', 'centos-7', 'centos-8', 'ubuntu-16.04', 'ubuntu-18.04'] or
+            distro.startswith('almalinux') or distro.startswith('rocky')):
             self.skipTest('virgl headless cannot be tested with %s' %(distro))
 
         qemu_distrofeatures = get_bb_var('DISTRO_FEATURES', 'qemu-system-native')
diff --git a/poky/meta/lib/oeqa/selftest/cases/sstate.py b/poky/meta/lib/oeqa/selftest/cases/sstate.py
deleted file mode 100644
index e73bb94..0000000
--- a/poky/meta/lib/oeqa/selftest/cases/sstate.py
+++ /dev/null
@@ -1,66 +0,0 @@
-#
-# Copyright OpenEmbedded Contributors
-#
-# SPDX-License-Identifier: MIT
-#
-
-import datetime
-import os
-import re
-
-from oeqa.selftest.case import OESelftestTestCase
-from oeqa.utils.commands import get_bb_vars
-
-
-class SStateBase(OESelftestTestCase):
-
-    def setUpLocal(self):
-        super(SStateBase, self).setUpLocal()
-        self.temp_sstate_location = None
-        needed_vars = ['SSTATE_DIR', 'NATIVELSBSTRING', 'TCLIBC', 'TUNE_ARCH',
-                       'TOPDIR', 'TARGET_VENDOR', 'TARGET_OS']
-        bb_vars = get_bb_vars(needed_vars)
-        self.sstate_path = bb_vars['SSTATE_DIR']
-        self.hostdistro = bb_vars['NATIVELSBSTRING']
-        self.tclibc = bb_vars['TCLIBC']
-        self.tune_arch = bb_vars['TUNE_ARCH']
-        self.topdir = bb_vars['TOPDIR']
-        self.target_vendor = bb_vars['TARGET_VENDOR']
-        self.target_os = bb_vars['TARGET_OS']
-        self.distro_specific_sstate = os.path.join(self.sstate_path, self.hostdistro)
-
-    # Creates a special sstate configuration with the option to add sstate mirrors
-    def config_sstate(self, temp_sstate_location=False, add_local_mirrors=[]):
-        self.temp_sstate_location = temp_sstate_location
-
-        if self.temp_sstate_location:
-            temp_sstate_path = os.path.join(self.builddir, "temp_sstate_%s" % datetime.datetime.now().strftime('%Y%m%d%H%M%S'))
-            config_temp_sstate = "SSTATE_DIR = \"%s\"" % temp_sstate_path
-            self.append_config(config_temp_sstate)
-            self.track_for_cleanup(temp_sstate_path)
-        bb_vars = get_bb_vars(['SSTATE_DIR', 'NATIVELSBSTRING'])
-        self.sstate_path = bb_vars['SSTATE_DIR']
-        self.hostdistro = bb_vars['NATIVELSBSTRING']
-        self.distro_specific_sstate = os.path.join(self.sstate_path, self.hostdistro)
-
-        if add_local_mirrors:
-            config_set_sstate_if_not_set = 'SSTATE_MIRRORS ?= ""'
-            self.append_config(config_set_sstate_if_not_set)
-            for local_mirror in add_local_mirrors:
-                self.assertFalse(os.path.join(local_mirror) == os.path.join(self.sstate_path), msg='Cannot add the current sstate path as a sstate mirror')
-                config_sstate_mirror = "SSTATE_MIRRORS += \"file://.* file:///%s/PATH\"" % local_mirror
-                self.append_config(config_sstate_mirror)
-
-    # Returns a list containing sstate files
-    def search_sstate(self, filename_regex, distro_specific=True, distro_nonspecific=True):
-        result = []
-        for root, dirs, files in os.walk(self.sstate_path):
-            if distro_specific and re.search(r"%s/%s/[a-z0-9]{2}/[a-z0-9]{2}$" % (self.sstate_path, self.hostdistro), root):
-                for f in files:
-                    if re.search(filename_regex, f):
-                        result.append(f)
-            if distro_nonspecific and re.search(r"%s/[a-z0-9]{2}/[a-z0-9]{2}$" % self.sstate_path, root):
-                for f in files:
-                    if re.search(filename_regex, f):
-                        result.append(f)
-        return result
diff --git a/poky/meta/lib/oeqa/selftest/cases/sstatetests.py b/poky/meta/lib/oeqa/selftest/cases/sstatetests.py
index ae766f9..e978313 100644
--- a/poky/meta/lib/oeqa/selftest/cases/sstatetests.py
+++ b/poky/meta/lib/oeqa/selftest/cases/sstatetests.py
@@ -9,13 +9,175 @@
 import glob
 import subprocess
 import tempfile
+import datetime
+import re
 
-from oeqa.utils.commands import runCmd, bitbake, get_bb_var, create_temp_layer
-from oeqa.selftest.cases.sstate import SStateBase
+from oeqa.utils.commands import runCmd, bitbake, get_bb_var, create_temp_layer, get_bb_vars
+from oeqa.selftest.case import OESelftestTestCase
+
 import oe
-
 import bb.siggen
 
+class SStateBase(OESelftestTestCase):
+
+    def setUpLocal(self):
+        super(SStateBase, self).setUpLocal()
+        self.temp_sstate_location = None
+        needed_vars = ['SSTATE_DIR', 'NATIVELSBSTRING', 'TCLIBC', 'TUNE_ARCH',
+                       'TOPDIR', 'TARGET_VENDOR', 'TARGET_OS']
+        bb_vars = get_bb_vars(needed_vars)
+        self.sstate_path = bb_vars['SSTATE_DIR']
+        self.hostdistro = bb_vars['NATIVELSBSTRING']
+        self.tclibc = bb_vars['TCLIBC']
+        self.tune_arch = bb_vars['TUNE_ARCH']
+        self.topdir = bb_vars['TOPDIR']
+        self.target_vendor = bb_vars['TARGET_VENDOR']
+        self.target_os = bb_vars['TARGET_OS']
+        self.distro_specific_sstate = os.path.join(self.sstate_path, self.hostdistro)
+
+    # Creates a special sstate configuration with the option to add sstate mirrors
+    def config_sstate(self, temp_sstate_location=False, add_local_mirrors=[]):
+        self.temp_sstate_location = temp_sstate_location
+
+        if self.temp_sstate_location:
+            temp_sstate_path = os.path.join(self.builddir, "temp_sstate_%s" % datetime.datetime.now().strftime('%Y%m%d%H%M%S'))
+            config_temp_sstate = "SSTATE_DIR = \"%s\"" % temp_sstate_path
+            self.append_config(config_temp_sstate)
+            self.track_for_cleanup(temp_sstate_path)
+        bb_vars = get_bb_vars(['SSTATE_DIR', 'NATIVELSBSTRING'])
+        self.sstate_path = bb_vars['SSTATE_DIR']
+        self.hostdistro = bb_vars['NATIVELSBSTRING']
+        self.distro_specific_sstate = os.path.join(self.sstate_path, self.hostdistro)
+
+        if add_local_mirrors:
+            config_set_sstate_if_not_set = 'SSTATE_MIRRORS ?= ""'
+            self.append_config(config_set_sstate_if_not_set)
+            for local_mirror in add_local_mirrors:
+                self.assertFalse(os.path.join(local_mirror) == os.path.join(self.sstate_path), msg='Cannot add the current sstate path as a sstate mirror')
+                config_sstate_mirror = "SSTATE_MIRRORS += \"file://.* file:///%s/PATH\"" % local_mirror
+                self.append_config(config_sstate_mirror)
+
+    # Returns a list containing sstate files
+    def search_sstate(self, filename_regex, distro_specific=True, distro_nonspecific=True):
+        result = []
+        for root, dirs, files in os.walk(self.sstate_path):
+            if distro_specific and re.search(r"%s/%s/[a-z0-9]{2}/[a-z0-9]{2}$" % (self.sstate_path, self.hostdistro), root):
+                for f in files:
+                    if re.search(filename_regex, f):
+                        result.append(f)
+            if distro_nonspecific and re.search(r"%s/[a-z0-9]{2}/[a-z0-9]{2}$" % self.sstate_path, root):
+                for f in files:
+                    if re.search(filename_regex, f):
+                        result.append(f)
+        return result
+
+    # Test sstate files creation and their location
+    def run_test_sstate_creation(self, targets, distro_specific=True, distro_nonspecific=True, temp_sstate_location=True, should_pass=True):
+        self.config_sstate(temp_sstate_location, [self.sstate_path])
+
+        if  self.temp_sstate_location:
+            bitbake(['-cclean'] + targets)
+        else:
+            bitbake(['-ccleansstate'] + targets)
+
+        bitbake(targets)
+        file_tracker = []
+        results = self.search_sstate('|'.join(map(str, targets)), distro_specific, distro_nonspecific)
+        if distro_nonspecific:
+            for r in results:
+                if r.endswith(("_populate_lic.tar.zst", "_populate_lic.tar.zst.siginfo", "_fetch.tar.zst.siginfo", "_unpack.tar.zst.siginfo", "_patch.tar.zst.siginfo")):
+                    continue
+                file_tracker.append(r)
+        else:
+            file_tracker = results
+
+        if should_pass:
+            self.assertTrue(file_tracker , msg="Could not find sstate files for: %s" % ', '.join(map(str, targets)))
+        else:
+            self.assertTrue(not file_tracker , msg="Found sstate files in the wrong place for: %s (found %s)" % (', '.join(map(str, targets)), str(file_tracker)))
+
+    # Test the sstate files deletion part of the do_cleansstate task
+    def run_test_cleansstate_task(self, targets, distro_specific=True, distro_nonspecific=True, temp_sstate_location=True):
+        self.config_sstate(temp_sstate_location, [self.sstate_path])
+
+        bitbake(['-ccleansstate'] + targets)
+
+        bitbake(targets)
+        archives_created = self.search_sstate('|'.join(map(str, [s + r'.*?\.tar.zst$' for s in targets])), distro_specific, distro_nonspecific)
+        self.assertTrue(archives_created, msg="Could not find sstate .tar.zst files for: %s (%s)" % (', '.join(map(str, targets)), str(archives_created)))
+
+        siginfo_created = self.search_sstate('|'.join(map(str, [s + r'.*?\.siginfo$' for s in targets])), distro_specific, distro_nonspecific)
+        self.assertTrue(siginfo_created, msg="Could not find sstate .siginfo files for: %s (%s)" % (', '.join(map(str, targets)), str(siginfo_created)))
+
+        bitbake(['-ccleansstate'] + targets)
+        archives_removed = self.search_sstate('|'.join(map(str, [s + r'.*?\.tar.zst$' for s in targets])), distro_specific, distro_nonspecific)
+        self.assertTrue(not archives_removed, msg="do_cleansstate didn't remove .tar.zst sstate files for: %s (%s)" % (', '.join(map(str, targets)), str(archives_removed)))
+
+    # Test rebuilding of distro-specific sstate files
+    def run_test_rebuild_distro_specific_sstate(self, targets, temp_sstate_location=True):
+        self.config_sstate(temp_sstate_location, [self.sstate_path])
+
+        bitbake(['-ccleansstate'] + targets)
+
+        bitbake(targets)
+        results = self.search_sstate('|'.join(map(str, [s + r'.*?\.tar.zst$' for s in targets])), distro_specific=False, distro_nonspecific=True)
+        filtered_results = []
+        for r in results:
+            if r.endswith(("_populate_lic.tar.zst", "_populate_lic.tar.zst.siginfo")):
+                continue
+            filtered_results.append(r)
+        self.assertTrue(filtered_results == [], msg="Found distro non-specific sstate for: %s (%s)" % (', '.join(map(str, targets)), str(filtered_results)))
+        file_tracker_1 = self.search_sstate('|'.join(map(str, [s + r'.*?\.tar.zst$' for s in targets])), distro_specific=True, distro_nonspecific=False)
+        self.assertTrue(len(file_tracker_1) >= len(targets), msg = "Not all sstate files were created for: %s" % ', '.join(map(str, targets)))
+
+        self.track_for_cleanup(self.distro_specific_sstate + "_old")
+        shutil.copytree(self.distro_specific_sstate, self.distro_specific_sstate + "_old")
+        shutil.rmtree(self.distro_specific_sstate)
+
+        bitbake(['-cclean'] + targets)
+        bitbake(targets)
+        file_tracker_2 = self.search_sstate('|'.join(map(str, [s + r'.*?\.tar.zst$' for s in targets])), distro_specific=True, distro_nonspecific=False)
+        self.assertTrue(len(file_tracker_2) >= len(targets), msg = "Not all sstate files were created for: %s" % ', '.join(map(str, targets)))
+
+        not_recreated = [x for x in file_tracker_1 if x not in file_tracker_2]
+        self.assertTrue(not_recreated == [], msg="The following sstate files were not recreated: %s" % ', '.join(map(str, not_recreated)))
+
+        created_once = [x for x in file_tracker_2 if x not in file_tracker_1]
+        self.assertTrue(created_once == [], msg="The following sstate files were created only in the second run: %s" % ', '.join(map(str, created_once)))
+
+    def sstate_common_samesigs(self, configA, configB, allarch=False):
+
+        self.write_config(configA)
+        self.track_for_cleanup(self.topdir + "/tmp-sstatesamehash")
+        bitbake("world meta-toolchain -S none")
+        self.write_config(configB)
+        self.track_for_cleanup(self.topdir + "/tmp-sstatesamehash2")
+        bitbake("world meta-toolchain -S none")
+
+        def get_files(d, result):
+            for root, dirs, files in os.walk(d):
+                for name in files:
+                    if "meta-environment" in root or "cross-canadian" in root:
+                        continue
+                    if "do_build" not in name:
+                        # 1.4.1+gitAUTOINC+302fca9f4c-r0.do_package_write_ipk.sigdata.f3a2a38697da743f0dbed8b56aafcf79
+                        (_, task, _, shash) = name.rsplit(".", 3)
+                        result[os.path.join(os.path.basename(root), task)] = shash
+
+        files1 = {}
+        files2 = {}
+        subdirs = sorted(glob.glob(self.topdir + "/tmp-sstatesamehash/stamps/*-nativesdk*-linux"))
+        if allarch:
+            subdirs.extend(sorted(glob.glob(self.topdir + "/tmp-sstatesamehash/stamps/all-*-linux")))
+
+        for subdir in subdirs:
+            nativesdkdir = os.path.basename(subdir)
+            get_files(self.topdir + "/tmp-sstatesamehash/stamps/" + nativesdkdir, files1)
+            get_files(self.topdir + "/tmp-sstatesamehash2/stamps/" + nativesdkdir, files2)
+
+        self.maxDiff = None
+        self.assertEqual(files1, files2)
+
 class SStateTests(SStateBase):
     def test_autorev_sstate_works(self):
         # Test that a git repository which changes is correctly handled by SRCREV = ${AUTOREV}
@@ -55,32 +217,7 @@
         result = runCmd('git add bar.txt; git commit -asm "add bar"', cwd=srcdir)
         bitbake("dbus-wait-test -c unpack")
 
-
-    # Test sstate files creation and their location
-    def run_test_sstate_creation(self, targets, distro_specific=True, distro_nonspecific=True, temp_sstate_location=True, should_pass=True):
-        self.config_sstate(temp_sstate_location, [self.sstate_path])
-
-        if  self.temp_sstate_location:
-            bitbake(['-cclean'] + targets)
-        else:
-            bitbake(['-ccleansstate'] + targets)
-
-        bitbake(targets)
-        file_tracker = []
-        results = self.search_sstate('|'.join(map(str, targets)), distro_specific, distro_nonspecific)
-        if distro_nonspecific:
-            for r in results:
-                if r.endswith(("_populate_lic.tar.zst", "_populate_lic.tar.zst.siginfo", "_fetch.tar.zst.siginfo", "_unpack.tar.zst.siginfo", "_patch.tar.zst.siginfo")):
-                    continue
-                file_tracker.append(r)
-        else:
-            file_tracker = results
-
-        if should_pass:
-            self.assertTrue(file_tracker , msg="Could not find sstate files for: %s" % ', '.join(map(str, targets)))
-        else:
-            self.assertTrue(not file_tracker , msg="Found sstate files in the wrong place for: %s (found %s)" % (', '.join(map(str, targets)), str(file_tracker)))
-
+class SStateCreation(SStateBase):
     def test_sstate_creation_distro_specific_pass(self):
         self.run_test_sstate_creation(['binutils-cross-'+ self.tune_arch, 'binutils-native'], distro_specific=True, distro_nonspecific=False, temp_sstate_location=True)
 
@@ -93,23 +230,7 @@
     def test_sstate_creation_distro_nonspecific_fail(self):
         self.run_test_sstate_creation(['linux-libc-headers'], distro_specific=True, distro_nonspecific=False, temp_sstate_location=True, should_pass=False)
 
-    # Test the sstate files deletion part of the do_cleansstate task
-    def run_test_cleansstate_task(self, targets, distro_specific=True, distro_nonspecific=True, temp_sstate_location=True):
-        self.config_sstate(temp_sstate_location, [self.sstate_path])
-
-        bitbake(['-ccleansstate'] + targets)
-
-        bitbake(targets)
-        archives_created = self.search_sstate('|'.join(map(str, [s + r'.*?\.tar.zst$' for s in targets])), distro_specific, distro_nonspecific)
-        self.assertTrue(archives_created, msg="Could not find sstate .tar.zst files for: %s (%s)" % (', '.join(map(str, targets)), str(archives_created)))
-
-        siginfo_created = self.search_sstate('|'.join(map(str, [s + r'.*?\.siginfo$' for s in targets])), distro_specific, distro_nonspecific)
-        self.assertTrue(siginfo_created, msg="Could not find sstate .siginfo files for: %s (%s)" % (', '.join(map(str, targets)), str(siginfo_created)))
-
-        bitbake(['-ccleansstate'] + targets)
-        archives_removed = self.search_sstate('|'.join(map(str, [s + r'.*?\.tar.zst$' for s in targets])), distro_specific, distro_nonspecific)
-        self.assertTrue(not archives_removed, msg="do_cleansstate didn't remove .tar.zst sstate files for: %s (%s)" % (', '.join(map(str, targets)), str(archives_removed)))
-
+class SStateCleanup(SStateBase):
     def test_cleansstate_task_distro_specific_nonspecific(self):
         targets = ['binutils-cross-'+ self.tune_arch, 'binutils-native']
         targets.append('linux-libc-headers')
@@ -123,39 +244,7 @@
         targets.append('linux-libc-headers')
         self.run_test_cleansstate_task(targets, distro_specific=True, distro_nonspecific=False, temp_sstate_location=True)
 
-
-    # Test rebuilding of distro-specific sstate files
-    def run_test_rebuild_distro_specific_sstate(self, targets, temp_sstate_location=True):
-        self.config_sstate(temp_sstate_location, [self.sstate_path])
-
-        bitbake(['-ccleansstate'] + targets)
-
-        bitbake(targets)
-        results = self.search_sstate('|'.join(map(str, [s + r'.*?\.tar.zst$' for s in targets])), distro_specific=False, distro_nonspecific=True)
-        filtered_results = []
-        for r in results:
-            if r.endswith(("_populate_lic.tar.zst", "_populate_lic.tar.zst.siginfo")):
-                continue
-            filtered_results.append(r)
-        self.assertTrue(filtered_results == [], msg="Found distro non-specific sstate for: %s (%s)" % (', '.join(map(str, targets)), str(filtered_results)))
-        file_tracker_1 = self.search_sstate('|'.join(map(str, [s + r'.*?\.tar.zst$' for s in targets])), distro_specific=True, distro_nonspecific=False)
-        self.assertTrue(len(file_tracker_1) >= len(targets), msg = "Not all sstate files were created for: %s" % ', '.join(map(str, targets)))
-
-        self.track_for_cleanup(self.distro_specific_sstate + "_old")
-        shutil.copytree(self.distro_specific_sstate, self.distro_specific_sstate + "_old")
-        shutil.rmtree(self.distro_specific_sstate)
-
-        bitbake(['-cclean'] + targets)
-        bitbake(targets)
-        file_tracker_2 = self.search_sstate('|'.join(map(str, [s + r'.*?\.tar.zst$' for s in targets])), distro_specific=True, distro_nonspecific=False)
-        self.assertTrue(len(file_tracker_2) >= len(targets), msg = "Not all sstate files were created for: %s" % ', '.join(map(str, targets)))
-
-        not_recreated = [x for x in file_tracker_1 if x not in file_tracker_2]
-        self.assertTrue(not_recreated == [], msg="The following sstate files were not recreated: %s" % ', '.join(map(str, not_recreated)))
-
-        created_once = [x for x in file_tracker_2 if x not in file_tracker_1]
-        self.assertTrue(created_once == [], msg="The following sstate files were created only in the second run: %s" % ', '.join(map(str, created_once)))
-
+class SStateDistroTests(SStateBase):
     def test_rebuild_distro_specific_sstate_cross_native_targets(self):
         self.run_test_rebuild_distro_specific_sstate(['binutils-cross-' + self.tune_arch, 'binutils-native'], temp_sstate_location=True)
 
@@ -165,7 +254,7 @@
     def test_rebuild_distro_specific_sstate_native_target(self):
         self.run_test_rebuild_distro_specific_sstate(['binutils-native'], temp_sstate_location=True)
 
-
+class SStateCacheManagement(SStateBase):
     # Test the sstate-cache-management script. Each element in the global_config list is used with the corresponding element in the target_config list
     # global_config elements are expected to not generate any sstate files that would be removed by sstate-cache-management.sh (such as changing the value of MACHINE)
     def run_test_sstate_cache_management_script(self, target, global_config=[''], target_config=[''], ignore_patterns=[]):
@@ -244,6 +333,7 @@
         target_config.append('')
         self.run_test_sstate_cache_management_script('m4', global_config,  target_config, ignore_patterns=['populate_lic'])
 
+class SStateHashSameSigs(SStateBase):
     def test_sstate_32_64_same_hash(self):
         """
         The sstate checksums for both native and target should not vary whether
@@ -329,6 +419,7 @@
         self.maxDiff = None
         self.assertCountEqual(files1, files2)
 
+class SStateHashSameSigs2(SStateBase):
     def test_sstate_allarch_samesigs(self):
         """
         The sstate checksums of allarch packages should be independent of whichever
@@ -377,39 +468,7 @@
 """
         self.sstate_common_samesigs(configA, configB)
 
-    def sstate_common_samesigs(self, configA, configB, allarch=False):
-
-        self.write_config(configA)
-        self.track_for_cleanup(self.topdir + "/tmp-sstatesamehash")
-        bitbake("world meta-toolchain -S none")
-        self.write_config(configB)
-        self.track_for_cleanup(self.topdir + "/tmp-sstatesamehash2")
-        bitbake("world meta-toolchain -S none")
-
-        def get_files(d, result):
-            for root, dirs, files in os.walk(d):
-                for name in files:
-                    if "meta-environment" in root or "cross-canadian" in root:
-                        continue
-                    if "do_build" not in name:
-                        # 1.4.1+gitAUTOINC+302fca9f4c-r0.do_package_write_ipk.sigdata.f3a2a38697da743f0dbed8b56aafcf79
-                        (_, task, _, shash) = name.rsplit(".", 3)
-                        result[os.path.join(os.path.basename(root), task)] = shash
-
-        files1 = {}
-        files2 = {}
-        subdirs = sorted(glob.glob(self.topdir + "/tmp-sstatesamehash/stamps/*-nativesdk*-linux"))
-        if allarch:
-            subdirs.extend(sorted(glob.glob(self.topdir + "/tmp-sstatesamehash/stamps/all-*-linux")))
-
-        for subdir in subdirs:
-            nativesdkdir = os.path.basename(subdir)
-            get_files(self.topdir + "/tmp-sstatesamehash/stamps/" + nativesdkdir, files1)
-            get_files(self.topdir + "/tmp-sstatesamehash2/stamps/" + nativesdkdir, files2)
-
-        self.maxDiff = None
-        self.assertEqual(files1, files2)
-
+class SStateHashSameSigs3(SStateBase):
     def test_sstate_sametune_samesigs(self):
         """
         The sstate checksums of two identical machines (using the same tune) should be the
@@ -497,7 +556,7 @@
         self.maxDiff = None
         self.assertCountEqual(files1, files2)
 
-
+class SStateHashSameSigs4(SStateBase):
     def test_sstate_noop_samesigs(self):
         """
         The sstate checksums of two builds with these variables changed or
diff --git a/poky/meta/lib/oeqa/selftest/cases/wic.py b/poky/meta/lib/oeqa/selftest/cases/wic.py
index b9430cd..b26b649 100644
--- a/poky/meta/lib/oeqa/selftest/cases/wic.py
+++ b/poky/meta/lib/oeqa/selftest/cases/wic.py
@@ -805,12 +805,13 @@
         config = 'IMAGE_FSTYPES += "wic"\nWKS_FILE = "wic-image-minimal"\n'\
                  'MACHINE_FEATURES:append = " efi"\n'
         self.append_config(config)
-        bitbake('wic-image-minimal')
+        image = 'wic-image-minimal'
+        bitbake(image)
         self.remove_config(config)
 
-        deploy_dir = get_bb_var('DEPLOY_DIR_IMAGE')
-        machine = self.td['MACHINE']
-        prefix = os.path.join(deploy_dir, 'wic-image-minimal-%s.' % machine)
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'], image)
+        prefix = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], '%s.' % bb_vars['IMAGE_LINK_NAME'])
+
         # check if we have result image and manifests symlinks
         # pointing to existing files
         for suffix in ('wic', 'manifest'):
@@ -1033,9 +1034,13 @@
         config = 'IMAGE_FSTYPES = "ext4"\n'
         self.append_config(config)
         bitbake('core-image-minimal')
+        image_link_name = get_bb_var('IMAGE_LINK_NAME', 'core-image-minimal')
         self.remove_config(config)
 
-        config = 'IMAGE_FSTYPES = "wic"\nWKS_FILE = "test_rawcopy_plugin.wks.in"\n'
+        config = 'IMAGE_FSTYPES = "wic"\n' \
+                 'IMAGE_LINK_NAME_CORE_IMAGE_MINIMAL = "%s"\n'\
+                 'WKS_FILE = "test_rawcopy_plugin.wks.in"\n'\
+                 % image_link_name
         self.append_config(config)
         bitbake('core-image-minimal-mtdutils')
         self.remove_config(config)
@@ -1049,14 +1054,14 @@
 
     def _rawcopy_plugin(self, fstype):
         """Test rawcopy plugin"""
-        img = 'core-image-minimal'
-        machine = self.td["MACHINE"]
+        image = 'core-image-minimal'
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'], image)
         params = ',unpack' if fstype.endswith('.gz') else ''
         with NamedTemporaryFile("w", suffix=".wks") as wks:
-            wks.write('part / --source rawcopy --sourceparams="file=%s-%s.%s%s"\n'\
-                      % (img, machine, fstype, params))
+            wks.write('part / --source rawcopy --sourceparams="file=%s.%s%s"\n'\
+                      % (bb_vars['IMAGE_LINK_NAME'], fstype, params))
             wks.flush()
-            cmd = "wic create %s -e %s -o %s" % (wks.name, img, self.resultdir)
+            cmd = "wic create %s -e %s -o %s" % (wks.name, image, self.resultdir)
             runCmd(cmd)
             wksname = os.path.splitext(os.path.basename(wks.name))[0]
             out = glob(os.path.join(self.resultdir, "%s-*direct" % wksname))
@@ -1077,12 +1082,11 @@
         """Test empty plugin"""
         config = 'IMAGE_FSTYPES = "wic"\nWKS_FILE = "test_empty_plugin.wks"\n'
         self.append_config(config)
-        bitbake('core-image-minimal')
+        image = 'core-image-minimal'
+        bitbake(image)
         self.remove_config(config)
-        deploy_dir = get_bb_var('DEPLOY_DIR_IMAGE')
-        machine = self.td['MACHINE']
-
-        image_path = os.path.join(deploy_dir, 'core-image-minimal-%s.wic' % machine)
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'], image)
+        image_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], '%s.wic' % bb_vars['IMAGE_LINK_NAME'])
         self.assertTrue(os.path.exists(image_path))
 
         sysroot = get_bb_var('RECIPE_SYSROOT_NATIVE', 'wic-tools')
@@ -1297,12 +1301,12 @@
         # build an image
         config = 'IMAGE_FSTYPES = "wic"\nWKS_FILE = "directdisk.wks"\n'
         self.append_config(config)
-        bitbake('core-image-minimal')
+        image = 'core-image-minimal'
+        bitbake(image)
 
         # get path to the image
-        deploy_dir = get_bb_var('DEPLOY_DIR_IMAGE')
-        machine = self.td['MACHINE']
-        image_path = os.path.join(deploy_dir, 'core-image-minimal-%s.wic' % machine)
+        bb_vars = get_bb_vars(['DEPLOY_DIR_IMAGE', 'IMAGE_LINK_NAME'], image)
+        image_path = os.path.join(bb_vars['DEPLOY_DIR_IMAGE'], '%s.wic' % bb_vars['IMAGE_LINK_NAME'])
 
         self.remove_config(config)
 
@@ -1310,7 +1314,7 @@
             # expand image to 1G
             new_image_path = None
             with NamedTemporaryFile(mode='wb', suffix='.wic.exp',
-                                    dir=deploy_dir, delete=False) as sparse:
+                                    dir=bb_vars['DEPLOY_DIR_IMAGE'], delete=False) as sparse:
                 sparse.truncate(1024 ** 3)
                 new_image_path = sparse.name
 
diff --git a/poky/meta/lib/oeqa/selftest/context.py b/poky/meta/lib/oeqa/selftest/context.py
index ab13131..0a7a9da 100644
--- a/poky/meta/lib/oeqa/selftest/context.py
+++ b/poky/meta/lib/oeqa/selftest/context.py
@@ -97,17 +97,27 @@
         oe.path.copytree(builddir + "/cache", newbuilddir + "/cache")
         oe.path.copytree(selftestdir, newselftestdir)
 
+        subprocess.check_output("git init; git add *; git commit -a -m 'initial'", cwd=newselftestdir, shell=True)
+
+        # Tried to used bitbake-layers add/remove but it requires recipe parsing and hence is too slow
+        subprocess.check_output("sed %s/conf/bblayers.conf -i -e 's#%s#%s#g'" % (newbuilddir, selftestdir, newselftestdir), cwd=newbuilddir, shell=True)
+
+        # Relative paths in BBLAYERS only works when the new build dir share the same ascending node
+        if self.newbuilddir:
+            bblayers = subprocess.check_output("bitbake-getvar --value BBLAYERS | tail -1", cwd=builddir, shell=True, text=True)
+            if '..' in bblayers:
+                bblayers_abspath = [os.path.abspath(path) for path in bblayers.split()]
+                with open("%s/conf/bblayers.conf" % newbuilddir, "a") as f:
+                    newbblayers = "# new bblayers to be used by selftest in the new build dir '%s'\n" % newbuilddir
+                    newbblayers += 'BBLAYERS = "%s"\n' % ' '.join(bblayers_abspath)
+                    f.write(newbblayers)
+
         for e in os.environ:
             if builddir + "/" in os.environ[e]:
                 os.environ[e] = os.environ[e].replace(builddir + "/", newbuilddir + "/")
             if os.environ[e].endswith(builddir):
                 os.environ[e] = os.environ[e].replace(builddir, newbuilddir)
 
-        subprocess.check_output("git init; git add *; git commit -a -m 'initial'", cwd=newselftestdir, shell=True)
-
-        # Tried to used bitbake-layers add/remove but it requires recipe parsing and hence is too slow
-        subprocess.check_output("sed %s/conf/bblayers.conf -i -e 's#%s#%s#g'" % (newbuilddir, selftestdir, newselftestdir), cwd=newbuilddir, shell=True)
-
         os.chdir(newbuilddir)
 
         def patch_test(t):