subtree updates

poky: 80f2b56ad8..d78650b980:
  Ahmed Hossam (1):
        go.bbclass: Allow adding parameters to go ldflags

  Alejandro Hernandez Samaniego (1):
        baremetal-image: Fix do_image dependencies

  Alexander Kanavin (153):
        meson: update 0.58.1 -> 0.59.1
        libcap: update 2.51 -> 2.54
        lua: add a recipe from meta-oe
        lua: update 5.3.6 -> 5.4.3
        rpm: update 4.16.1.3 -> 4.17.0
        libdnf: fix the rpm sqlite-only target setup
        libsolv: disable rpm bdb format support
        perl: do not build berkeley db module by default
        package_rpm: use zstd instead of xz
        qemu: update 6.0.0 -> 6.1.0
        runqemu: correct vga-virtio option to keep virgl enabled
        gnupg: update 2.3.1 -> 2.3.2
        pinentry: update 1.1.1 -> 1.2.0
        spirv-tools: update 2021.2 -> 2021.3
        glslang: update 11.5.0 -> 11.6.0
        shaderc: update 2021.1 -> 2021.2
        inetutils: update 2.1 -> 2.2
        systemd: update 249.3 -> 249.4
        lsof: update 4.91 -> 4.94.0
        libpam: update 1.5.1 -> 1.5.2
        rt-tests: update 2.1 -> 2.2
        libgit2: update 1.1.1 -> 1.2.0
        libssh2: update 1.9.0 -> 1.10.0
        libhandy: update 1.2.3 -> 1.4.0
        qemu: install qmp module without hardcoding the python version in oeqa scripts
        lttng-tools: replace ad hoc ptest fixup with upstream fixes
        rust: drop PV from include file names
        rust: update 1.54.0 -> 1.55.0
        librsvg: update 2.40.21 -> 2.52.0 (transition to rust!)
        librsvg: do not enable nativesdk
        librsvg: add backports to fix big endian targets (e.g. mips)
        librsvg: use only the target architecture to determine availability of atomic primitives
        librsvg: restore reproducibility
        adwaita-icon-theme: update 3.34/38 -> 41.0
        gstreamer1.0-plugins-bad: disable rsvg on x32
        rust/cargo: exclude UNINATIVE_LOADER from task signature
        rust-common.bbclass: rewrite toolchain wrappers in (native) python
        rust: do not write ar into target json definitions
        rust: generate target definitions from (arch, abi), not just arch
        openssl: update 1.1.1l -> 3.0.0
        cryptodev-tests: do not use -Werror with openssl 3
        serf: add a openssl 3 compatibility fix
        ruby: disable openssl extension
        glib-2.0: update 2.68.4 -> 2.70.0
        glib-networking: update 2.68.2 -> 2.70.0
        bison: update 3.7.6 -> 3.8.1
        libdnf: update 0.63.1 -> 0.64.0
        libexif: update 0.6.22 -> 0.6.23
        sudo: update 1.9.7p2 -> 1.9.8p1
        wget: update 1.21.1 -> 1.21.2
        coreutils: update 8.32 -> 9.0
        itstool: update 2.0.6 -> 2.0.7
        nghttp2: add recipe from meta-oe
        libsoup: add a 3.x recipe
        webkitgtk: trim down DEPENDS
        epiphany: trim down DEPENDS
        webkitgtk: update 2.32.3 -> 2.34.0
        epiphany: update 40.3 -> 41.0
        python3: update 3.9.7 -> 3.10.0
        libjitterentropy: update 3.1.0 -> 3.3.0
        kea: update 1.8.2 -> 2.0.0
        ghostscript: update 9.54.0 -> 9.55.0
        lighttpd: update 1.4.59 -> 1.4.60
        bluez5: update 5.61 -> 5.62
        ovmf: update 202105 -> 202108
        systemd: update 249.4 -> 249.5
        meson: update 0.59.1 -> 0.59.2
        python3-pip: update 21.2.4 -> 21.3
        valgrind: update 3.17.0 -> 3.18.1
        librsvg: update 2.52.0 -> 2.52.2
        libva: update 2.12.0 -> 2.13.0
        liberation-fonts: update 2.1.4 -> 2.1.5
        ca-certificates: update 20210119 -> 20211016
        curl: update 7.78.0 -> 7.79.1
        libgit2: update 1.2.0 -> 1.3.0
        libxcrypt: upgrade 4.4.25 -> 4.4.26
        bison: upgrade 3.8.1 -> 3.8.2
        cmake: update 3.21.2 -> 3.21.3
        git: upgrade 2.33.0 -> 2.33.1
        tzdata: upgrade 2021a -> 2021d
        ofono: upgrade 1.32 -> 1.33
        openssh: upgrade 8.7p1 -> 8.8p1
        sysvinit: upgrade 2.99 -> 3.00
        btrfs-tools: upgrade 5.13.1 -> 5.14.2
        ccache: upgrade 4.4 -> 4.4.2
        createrepo-c: upgrade 0.17.5 -> 0.17.6
        libcomps: upgrade 0.1.17 -> 0.1.18
        libedit: upgrade 20210714-3.1 -> 20210910-3.1
        librepo: upgrade 1.14.1 -> 1.14.2
        python3-jinja2: upgrade 3.0.1 -> 3.0.2
        python3-pygobject: upgrade 3.40.1 -> 3.42.0
        python3-setuptools: upgrade 58.0.4 -> 58.2.0
        vala: upgrade 0.52.5 -> 0.54.2
        acpica: upgrade 20210730 -> 20210930
        asciidoc: upgrade 9.1.0 -> 9.1.1
        libarchive: upgrade 3.5.1 -> 3.5.2
        msmtp: upgrade 1.8.15 -> 1.8.17
        sudo: upgrade 1.9.8p1 -> 1.9.8p2
        gobject-introspection: upgrade 1.68.0 -> 1.70.0
        gsettings-desktop-schemas: upgrade 40.0 -> 41.0
        json-glib: upgrade 1.6.4 -> 1.6.6
        libdazzle: upgrade 3.40.0 -> 3.42.0
        harfbuzz: upgrade 2.9.1 -> 3.0.0
        pango: upgrade 1.48.9 -> 1.48.10
        libinput: upgrade 1.19.0 -> 1.19.1
        linux-firmware: upgrade 20210818 -> 20210919
        wireless-regdb: upgrade 2021.07.14 -> 2021.08.28
        mpg123: upgrade 1.28.2 -> 1.29.0
        puzzles: upgrade to latest revision
        libwpe: upgrade 1.10.1 -> 1.12.0
        diffoscope: upgrade 182 -> 187
        fribidi: upgrade 1.0.10 -> 1.0.11
        iso-codes: upgrade 4.6.0 -> 4.7.0
        libatomic-ops: upgrade 7.6.10 -> 7.6.12
        libcap: upgrade 2.54 -> 2.59
        libmd: upgrade 1.0.3 -> 1.0.4
        libsoup-2.4: upgrade 2.72.0 -> 2.74.0
        gnupg: update 2.3.2 -> 2.3.3
        libssh2: skip one of the ptests until openssh 8.8 compatibility is fixed
        systemd: disable seccomp on mips32
        waffle: convert to git, website is down
        u-boot: upgrade 2021.07 -> 2021.10
        psplash: upgrade to latest revision
        stress-ng: convert to git, website is down
        json-c: correct upstream version check
        createrepo-c: upgrade 0.17.6 -> 0.17.7
        python3-numpy: upgrade 1.21.2 -> 1.21.3
        python3-pip: upgrade 21.3 -> 21.3.1
        python3-setuptools: upgrade 58.2.0 -> 58.3.0
        msmtp: upgrade 1.8.17 -> 1.8.18
        gi-docgen: upgrade 2021.7 -> 2021.8
        piglit: upgrade to latest revision
        libinput: upgrade 1.19.1 -> 1.19.2
        mpg123: upgrade 1.29.0 -> 1.29.2
        puzzles: upgrade to latest revision
        webkitgtk: upgrade 2.34.0 -> 2.34.1
        wpebackend-fdo: upgrade 1.10.0 -> 1.12.0
        diffoscope: upgrade 187 -> 188
        libcap: upgrade 2.59 -> 2.60
        vte: upgrade 0.64.2 -> 0.66.0
        ncurses: update 6.2 -> 6.3
        tzdata: update 2021d -> 2021e
        asciidoc: update 9.1.1 -> 10.0.0
        waffle: update 1.6.1 -> 1.7.0
        virgl: skip headless test on specific older distros and fail otherwise
        gptfdisk: address ncurses 6.3 compatibility
        powertop: address ncurses 6.3 compatibility
        systemtap: address ncurses 6.3 compatibility
        igt-gpu-tools: address meson 0.60 compatibility
        python3-pygobject: do not supply unknown g-i options
        gstreamer1.0-python: do not supply unknown g-i options
        webkitgtk: drop unnecessary SSE disabling patch
        cups: exclude beta/rc versions from version check

  Alexandre Belloni (5):
        inetutils: drop CVE-2021-40491 patch
        oeqa/selftest/sstatetests: fix typo ware -> were
        maintainers.inc: fix up rust-cross entry
        libevent,btrfs-tools: fix Upstream-Status tag
        ruby: fix Upstream-Status

  Andreas Müller (1):
        webkitgtk: add gperf-native to DEPENDS to fix build

  Andrei Gherzan (1):
        qemu: Define libnfs PACKAGECONFIG

  Andrej Valek (3):
        busybox: 1.34.0 -> 1.34.1
        featimage: refactor style
        kernel-fitimage: use correct kernel image

  Andres Beltran (1):
        buildhistory: Fix package output files for SDKs

  Bruce Ashfield (15):
        linux-yocto/5.14: scripts/gcc-plugins: consistently use HOSTCC
        linux-yocto/5.14: update to v5.14.8
        linux-yocto/5.14: bsp/qemuarm*-gfx: use virtio graphics
        linux-yocto/5.10: update to v5.10.69
        linux-yocto/5.10: update to v5.10.70
        linux-yocto/5.14: update to v5.14.9
        kernel-yocto: don't apply config metadata patches twice
        linux-yocto/5.14: revert: scripts/gcc-plugins: consistently use HOSTCC
        linux-yocto/5.10: update to v5.10.73
        linux-yocto/5.14: update to v5.14.12
        linux-yocto/5.14: update to v5.14.13
        linux-yocto/5.10: update to v5.10.74
        linux-yocto/5.14: common-pc: enable CONFIG_ATA_PIIX as built-in
        linux-yocto/5.14: update to v5.14.14
        linux-yocto/5.10: update to v5.10.75

  Caner Altinbasak (2):
        bitbake: npmsw: Avoid race condition with multiple npm fetchers
        bitbake: fetch2: Do not attempt to verify donestamp if download is not complete

  Changhyeok Bae (2):
        iproute2: update to 5.14.0
        ethtool: update to 5.14

  Changqing Li (1):
        lttng-ust: fix do_compile failure for arm32 with DEBUG_BUILD enabled

  Daiane Angolini (2):
        machine/qemuarm*: Fix UBOOT_MACHINE value
        ref-manual: Update how to set a useradd password

  Daniel McGregor (3):
        bison: prevent checking for textstyle.
        bitbake.conf: Add gpg-agent as a host tool
        sstate: Allow validation of sstate singatures against list of keys

  David Joyner (1):
        rust: add support for big endian 64-bit PowerPC

  Denys Dmytriyenko (2):
        wayland-protocols: upgrade 1.21 -> 1.22
        wayland-protocols: upgrade 1.22 -> 1.23

  Fred Liu (1):
        glibc: Drop libcidn package

  Henry Kleynhans (1):
        sstate: Switch to ZStandard compressor support

  Hsia-Jun(Randy) Li (1):
        meson: install native file in sdk

  Ian Ray (1):
        archiver: Configurable tarball compression

  Jon Mason (10):
        oeqa/manual: Fix no longer valid URLs
        bitbake: bitbake:toaster:test: Update SSTATE URL
        yocto-bsp/poky: replace http with https for URLs
        bitbake: bitbake: replace http with https for URLs
        documentation: update sources mirror URL
        documentation: replace http with https for URLs
        documentation: use YOCTO_DL_URL
        dev-manual: remove errant /
        runqemu: add DEPLOY_DIR_IMAGE replacement in QB_OPT_APPEND
        bitbake: bitbake-user-manual: update sources mirror URL

  Jose Quaresma (15):
        gstreamer1.0: 1.18.4 -> 1.18.5
        gstreamer1.0-plugins-base: 1.18.4 -> 1.18.5
        gstreamer1.0-plugins-good: 1.18.4 -> 1.18.5
        gstreamer1.0-plugins-bad: 1.18.4 -> 1.18.5
        gstreamer1.0-plugins-ugly: 1.18.4 -> 1.18.5
        gstreamer1.0-rtsp-server: 1.18.4 -> 1.18.5
        gstreamer1.0-libav: 1.18.4 -> 1.18.5
        gstreamer1.0-vaapi: 1.18.4 -> 1.18.5
        gstreamer1.0-omx: 1.18.4 -> 1.18.5
        gstreamer1.0-python: 1.18.4 -> 1.18.5
        gst-devtools: 1.18.4 -> 1.18.5
        gst-examples: 1.18.4 -> 1.18.5
        patch.bbclass: when the patch fails show more info on the fatal error
        sstate.bbclass: count the files on mirrors using the pre local files
        sstate: fix touching files inside pseudo

  Joshua Watt (4):
        bitbake: async: Close sync client event loop
        bitbake: hashserv: Add tests for diverging reports
        bitbake: hashserv: Fix diverging report race condition
        classes/populate_sdk_base: Add setscene tasks

  Kai Kang (1):
        sudo: update multilib patch for sudo.conf

  Khem Raj (11):
        pkgconfig: Update to latest
        libseccomp: Upgrade to 2.5.2 and beyond
        openssl: Drop riscv32 upstreamed patches
        opensbi-payloads.inc: Use strings for fallback
        mesa: Enable svga for x86 only
        qemu: Add knob for enabling PMDK pmem support
        opensbi-payloads: Add dependency on kernel if fdt is set
        librsvg: Fix vendored libc to work on riscv and musl
        librsvg: Bump to 2.52.0 -> 2.52.2
        rust: Upgrade to 1.56.0
        librsvg: Disable 64bit atomics in crossbeam for rv32

  Kiran Surendran (1):
        ffmpeg: fix CVE-2021-38114

  Konrad Weihmann (1):
        libical: fix append in DEPENDS

  Lukasz Majewski (1):
        glibc: Extract common code to build tests to glibc-tests.inc

  Marek Vasut (1):
        piglit: upgrade to latest revision

  Martin Jansa (2):
        webkitgtk: add PACKAGECONFIG for opengl-or-es
        boost: allow searching for python310

  Maximilian Blenk (1):
        mount-copybind: add rootcontext mountoption for overlayfs

  Michael Halstead (2):
        scripts/autobuilder-worker-prereq-tests: jinja2 check
        releases: update to include 3.4 honister

  Michael Opdenacker (18):
        manuals: font fixes
        ref-manual: document DEBUG_PREFIX_MAP
        manuals: replace "apt-get" by "apt"
        Makefile: allow epub and latexpdf outputs to use diagrams from SVG sources
        conf.py: use PNG first in EPUB output
        overview-manual: SVG diagram for the git workflow
        docs: add "make all" to build old types of docs (html, epub, pdf) at once
        manuals: introduce 'yocto_sstate' extlink
        overview-manual: simplify expression
        dev-manual: correct NO_GENERIC_LICENSE section title
        dev-manual: warn about license compliance issues when static libraries are used
        devpyshell: rename to pydevshell
        ref-manual: document TOOLCHAIN_HOST_TASK_ESDK
        manuals: rename "devpyshell" to "pydevshell"
        ref-manual: document SOURCE_DATE_EPOCH
        ref-manual: fix description of SOURCE_DATE_EPOCH
        releases.rst: fix release number for 3.3.3
        docs: poky.yaml: updates for 3.4

  Mike Crowe (2):
        lib/oe/qa,insane: Move extra error handling functions to library
        insane,license,license_image: Allow treating license problems as errors

  Mingli Yu (1):
        packagedata.py: silence a DeprecationWarning

  Oleh Matiusha (1):
        findutils: add ptest

  Oleksandr Kravchuk (15):
        python3: update to 3.9.7
        python3-git: update to 3.1.24
        python3-dbusmock: update to 0.24.0
        python3-setuptools: update to 58.0.4
        python3-setuptools: minor cleanup
        xf86-input-libinput: update to 1.2.0
        libinput: update to 1.19.0
        libxi: update to 1.8
        xorgproto: update to 2021.5
        xkeyboard-config: update to 2.34
        libxkbcommon: update to 1.3.1
        mirrors.bbclass: remove dead infozip mirrors
        man-pages: update to 5.13
        python3-smmap: update to 5.0.0
        python3-pyparsing: update to 3.0.0

  Pablo Saavedra Rodi?o (1):
        mesa: upgrade 21.2.1 -> 21.2.4

  Paul Barker (1):
        bitbake: doc: bitbake-user-manual: Document BB_GIT_SHALLOW and friends

  Paul Eggleton (7):
        migration-3.4: tweak overrides change section
        ref-manual: remove meta class
        poky.yaml: add lz4 and zstd to essential host packages
        migration-3.4: add additional migration info
        migration: tweak introduction section
        poky.yaml: fix lz4 package name for older Ubuntu versions
        migration-3.4: add some extra packaging notes

  Pavel Zhukov (1):
        weston: wrapper for weston modules argument

  Peter Hoyes (2):
        u-boot: Convert ${UBOOT_ENV}.cmd into ${UBOOT_ENV}.scr
        u-boot: Fix syntax error in ${UBOOT_ENV}.scr compilation

  Peter Kjellerstedt (2):
        meson.bblcass: Remove empty egg-info directories before running meson
        qemu.inc: Remove empty egg-info directories before running meson

  Petr Vorel (1):
        ltp: Update to 20210927

  Pgowda (2):
        Fix rust-native build issue when debug is enabled
        rust-cross: Fix directory not deleted for race glibc vs. musl

  Ralph Siemsen (1):
        tar: filter CVEs using vendor name

  Randy Li (1):
        meson: move lang args to the right section

  Richard Purdie (54):
        sstatesig: Only apply group/other permissions to pseudo files
        rpm: Deterministically set vendor macro entry
        abi_version/sstate: Bump to fix rpm corruption issues
        multilib: Avoid sysroot race issues when multilib enabled
        bitbake: knotty/uihelper: Show setscene task progress in summary output
        bitbake: bitbake-worker: Handle pseudo shutdown in Ctrl+C case
        poky.conf: Update tested distros list with recent changes
        bitbake: hashserv: Improve behaviour for better determinism/sstate reuse
        poky.conf: Bump version for 3.4 honister release
        build-appliance-image: Update to honister head revision
        bitbake: bitbake: Bump to version 1.52.0
        build-appliance-image: Update to honister head revision
        layer.conf: Extend recipes not to install without explict dependencies
        libxml2: Use python3targetconfig to fix reproducibility issue
        libnewt: Use python3targetconfig to fix reproducibility issue
        bootchart2: Don't compile python modules
        linux-yocto-dev: Ensure DEPENDS matches recent 5.14 kernel changes
        base/insane: Import oe.qa by default
        base: Clean up unneeded len() calls
        base: Use repr() for printing exceptions
        bitbake.conf: Add BB_CURRENTTASK to BB_HASHEXCLUDE
        reproducible_build: Drop obsolete sstate workaround
        python: Update now reproducibile builds are the default
        bitbake: bitbake-worker: Set BB_CURRENTTASK earlier
        bitbake: compress: Allow to operate on file descriptor
        bitbake: siggen: Change file format of siginfo files to use zstd compressed json
        sstate: Fixes for eSDK generation after zstd switch
        patch: Use repr() with exceptions instead of str()
        reproducible_build: Drop now unneeded compiler warning
        reproducible: Move class function code into library
        reproducible: Move variable definitions to bitbake.conf
        reproducible: Merge code into base.bbclass
        kernel: Add KERNEL_DEBUG_TIMESTAMPS variable
        reproducible: Drop BUILD_REPRODUCIBLE_BINARIES variable
        kernel: Rework kernel make flag to variable mappings
        oeqa: Update cleanup code to wait for hashserv exit
        poky: Reproducible builds are now the default
        bitbake: tests/runqueue: Ensure hashserv exits before deleting files
        bitbake: bitbake-worker: Add debug when unpickle fails
        bitbake: siggen: Fix type conversion issues
        bitbake: test/fetch: Update urls to match upstream branch name changes
        libtool: Update patchset to match those submitted upstream
        staging: Fix autoconf-native rebuild failure
        patch: Fix exception reporting with repr()
        bitbake: fetch2/perforce: Fix typo
        bitbake: bitbake: Bump to post release verion 1.53.0
        poky.conf: Post release version bump
        gcc: Merge three related patches together
        gcc: Drop sdt (dtrace) header patch
        gcc: Drop broken/unneeded patch
        bitbake: tests/runqueue: Drop python version test decorators
        gcc: Update patches submitted/merged upstream
        gcc: Drop testsuite failure fix patch
        gcc: Add missing patch Upstream-Status

  Ross Burton (21):
        bitbake: tests/utils: mark a regex as a raw string
        bitbake: tests/fetch: prefix the FetcherTest temporary directory
        bitbake: fetch2: clarify the command-no-found error message
        bitbake: fetch2/gitsm: remove the 'nugget' SRCREV caching
        linux-yocto: add libmpc-native to DEPENDS
        bitbake: fetch2: document checkstatus API
        curl: fix CVE-2021-22945 through -22947
        oe/license: implement ast.NodeVisitor.visit_Constant
        license.bbclass: implement ast.NodeVisitor.visit_Constant
        bitbake: codegen: implement ast.NodeVisitor.visit_Constant
        testimage: fix unclosed testdata file
        oe/utils: log exceptions in ThreadedWorker functions
        sstate: don't silently handle all exceptions in sstate_checkhashes
        gawk: replace AR patch with upstreamed patch
        gawk: reduce strictness of the time test
        strace: remove obsolete patch
        strace: remove TOOLCHAIN assignment
        oeqa/runtime: load modules using importlib
        oeqa/runtime: search sys.path explicitly for modules
        testimage: remove target_modules_path
        strace: show test suite log on failure

  Sakib Sajal (1):
        go: upgrade 1.16.7 -> 1.16.8

  Saul Wold (3):
        spdx.py: Add annotation to relationship
        create-spdx: add create_annotation function
        create-spdx: cross recipes are native also

  Stefan Herbrechtsmeier (17):
        bitbake: fetch2: npm: Support npm archives with missing search directory mode
        bitbake: fetch2: npm: Create config npmrc in environment instantiation
        bitbake: fetch2: npmsw: Add support for local tarball and link sources
        npm: Add support for EXTRA_OENPM arguments
        recipetool: Move license md5sums into CSV files
        recipetool: Skip common source files in guess_license
        recipetool: Change default paramter fallback_licenses of function split_pkg_licenses from None to []
        recipetool: ignore empty license files
        recipetool: Add logger info for missing license entries
        recipetool: Add support for linenumbers to licenses.csv
        recipetool: npm: Do not add package.json files to LIC_FILES_CHKSUM
        recipetool: npm: Use README as license fallback
        npm: Add variable NPM_NODEDIR with default value
        npm: Use configs for npm environment and args for npm run command
        recipetool: Rework crunch_license to recognize more variants
        recipetool: Simplify common source files skip in guess_license
        npm: Remove unnecessary configs argument from npm run command

  Teoh Jay Shen (1):
        oeqa/runtime/parselogs: modified drm error in common errors list

  Thomas Perrot (1):
        image_types: allow the creation of block devices on top of UBI volumes

  Tim Orling (17):
        ptest-runner: install -collect-system-data script
        python3-hypothesis: upgrade 6.15.0 -> 6.23.2
        python3-importlib-metadata: upgrade 4.6.4 -> 4.8.1
        python3-more-itertools: upgrade 8.9.0 -> 8.10.0
        python3-zipp: upgrade 3.5.0 -> 3.6.0
        libconvert-asn1-perl: upgrade 0.31 -> 0.33
        python3-pytest: upgrade 6.2.4 -> 6.2.5
        at-spi2-core: upgrade 2.40.3 -> 2.42.0
        python3-packaging: DEPENDS on python3-setuptools-native
        python3-packaging: BBCLASSEXTEND nativesdk
        python3-tomli: add recipe for 1.2.1
        python3-setuptools-scm: upgrade 6.0.1 -> 6.3.2
        python3-setuptools: _distutils/sysconfig fix
        python3-pyyaml: upgrade 5.4.1 -> 6.0
        python3-manifest: -pprint RDEPENDS on -profile
        python3-hypothesis: upgrade 6.23.2 -> 6.24.0
        python3-tomli: upgrade 1.2.1 -> 1.2.2

  Tobias Kaufmann (1):
        mount-copybind: add SELinux support

  Yureka (1):
        systemd: add missing include for musl

  Zoltán Böszörményi (1):
        libpam: Fix build with DISTRO_FEATURES usrmerge

  hongxu (1):
        libcap: fix nativesdk-libcap relocate failure

  wangmy (20):
        diffoscope: upgrade 181 -> 182
        cmake: upgrade 3.21.1 -> 3.21.2
        gzip: upgrade 1.10 -> 1.11
        harfbuzz: upgrade 2.9.0 -> 2.9.1
        vulkan-headers: upgrade 1.2.182 -> 1.2.191
        vulkan-loader: upgrade 1.2.182 -> 1.2.191
        vulkan-tools: upgrade 1.2.182 -> 1.2.191
        help2man: upgrade 1.48.4 -> 1.48.5
        python3-more-itertools: upgrade 8.8.0 -> 8.9.0
        acpid: upgrade 2.0.32 -> 2.0.33
        bind: upgrade 9.16.20 -> 9.16.21
        createrepo-c: upgrade 0.17.4 -> 0.17.5
        dnf: upgrade 4.8.0 -> 4.9.0
        ell: upgrade 0.43 -> 0.44
        libical: upgrade 3.0.10 -> 3.0.11
        dhcpcd: upgrade 9.4.0 -> 9.4.1
        dnf: upgrade 4.9.0 -> 4.10.0
        file: upgrade 5.40 -> 5.41
        libdnf: upgrade 0.64.0 -> 0.65.0
        lttng-tools: upgrade 2.13.0 -> 2.13.1

  zhengruoqin (2):
        libsolv: upgrade 0.7.19 -> 0.7.20
        python3-pycryptodome: upgrade 3.10.1 -> 3.11.0

meta-security: a85fbe980e..e81c15f851:
  Armin Kuster (1):
        python3-fail2ban: fix build failure and cleanup

  Kai Kang (1):
        sssd: re-package to fix QA issues

  Kristian Klausen (1):
        swtpm: update to 0.6.1

  Liwei Song (1):
        recipes-security/chipsec: platform security assessment framework

meta-openembedded: 23dc4f060f..2f6797d8d6:
  Alexander Kanavin (23):
        python3-yappi: add python 3.10 fix
        python3-gmpy2: update 2.0.8 -> 2.1.0rc1
        python3-m2crypto: address build failure with openssl 3.x
        lua: remove recipe as it is now in oe-core
        nghttp2: remove recipe as it is now in oe-core
        kronosnet: update 1.20 -> 1.22
        polkit: update 0.116 -> 0.119
        openflow: disable openssl PACKAGECONFIG
        openipmi: add a python 3.10 compatibility patch
        strongswan: disable openssl PACKAGECONFIG
        pkcs11-helper: backport a openssl 3.x patch
        nodejs: use -fpermissive
        nodejs: add a python 3.10 compatibility patch
        php: disable openssl PACKAGECONFIG
        libsigrokdecode: add a python 3.10 compatibility patch
        freerdp: backport openssl 3.x patches
        opensc: do not use -Werror
        cfengine: blacklist due to openssl 3.x incompatibility
        netplan: do not use -Werror
        boinc-client: blacklist due to openssl 3.x incompatibility
        ldns: blacklist due to openssl 3.x incompatibility
        surf: add a webkit 2.34 compatibility patch
        mozjs: update 60.9.0 -> 91.1.0

  Alexander Thoma (1):
        keyutils: fix install path

  Armin Kuster (1):
        Apache: Several CVE fixes

  Chen Qi (1):
        ntfs-3g-ntfsprogs: upgrade to 2021.8.22

  Gianfranco (2):
        vboxguestdrivers: upgrade 6.1.26 -> 6.1.28
        vboxguestdrivers: Fix build failure due to the last update.

  Ivan Maidanski (1):
        bdwgc: upgrade 8.0.4 -> 8.0.6

  Jeremy Kerr (1):
        mctp: Add MCTP control utilities

  Joshua Watt (2):
        colord-native: Inherit pkgconfig
        mutter: Move gsettings to a separate package

  Justin Bronder (2):
        python3-mccabe: fix LICENSE and RDEPENDS
        python3-pyflakes: fix LICENSE, HOMEPAGE and RDEPENDS

  Khem Raj (44):
        packagegroup-meta-oe: Add lv-drivers and lvgl
        python3-pystache: Remove need for python2x
        python3-behave: Switch to using github src_uri
        python3-simpleeval: Remove use_2to3
        python3-parse-type: Do not ask for 2to3
        python3-anyjson: Do not enable 2to3
        python3-pybluez: Do not set 2to3
        packagegroup-meta-networking: Remove nghttp2
        packagegroup-meta-oe: Remove lua
        gjs: Inherit pkgconfig
        luaposix: Use lua 5.4
        devilspie2: Switch to using github repo
        devilspie2: Add missing dependency on libxinerama
        kronosnet: Correct path to poll.h
        luaposix: Upgrade to 35.1
        xfce.bbclass: Mark string as raw in a regexp
        nodejs: add -fpermissive BUILD_CXXFLAGS
        pcimem: Add riscv64 into COMPATIBLE_HOST
        luaposix: Depend on libxcrypt-native
        libcrypt-openssl-rsa-perl: Upgrade to 0.32
        xrdp: Upgrade to 0.9.17
        yelp,yelp-xsl,yelp-tools: Upgrade to 41 release
        mozjs: Disable JIT on mips
        libcrypt-openssl-rsa-perl: Fix build with openssl3+
        nodejs: Upgrade to 14.18.1
        librest: Use master with libsoup3 support
        gnome-online-accounts: Upgrade to 3.43.1
        iwd: Fix  build with musl
        xrdp: Exclude from builds
        xorgxrdp: Add to exclusion list for now
        bluepy: Set PV and correct syntax for RDEPENDS
        python3-kivy: Use new override syntax in RDEPENDS
        bluepy: Fix permissions on tarball
        nodejs: Upgrade to 16.11.1
        mozjs: Fix build on mips/musl
        mozjs: Fix musl miscompiles with HAVE_THREAD_TLS_KEYWORD
        luaposix: Use virtual/crypt instread of hardcoding libxcrypt
        packagegroup-meta-oe: Add libjs-jquery-globalize and libjs-jquery-cookie
        mozjs: Add riscv32 support
        driverctl: Rename to have PV in recipe name
        tbb: Link with libatomic when using clang compiler on rv32
        gimp: Disable vector icons on mips/rv32 using clang
        mozjs: Update to 91.2.0
        mozjs: Fix build for 32bit systems disabling JIT

  Kurt Kiefer (2):
        mozjs: move large static library into staticdev package
        gyp: fix for compatibility with Python 3.10

  Leon Anavi (6):
        python3-aiohue: Upgrade 2.6.1 -> 2.6.3
        python3-paho-mqtt: Upgrade 1.5.1 -> 1.6.1
        python3-thrift: Upgrade 0.13.0 -> 0.15.0
        python3-prompt-toolkit: Upgrade 3.0.19 -> 3.0.21
        python3-traitlets: Upgrade 5.1.0 -> 5.1.1
        python3-prettytable: Upgrade 2.1.0 -> 2.2.1

  LiweiSong (1):
        Revert "chipsec: platform security assessment framework"

  Marco Cavallini (1):
        bluepy_git.bb: Added recipe for BluePy Python interface to Bluetooth LE on Linux (v2)

  Marek Vasut (3):
        apitrace: Upgrade to latest version
        apitrace: Conditionally enable X11 support
        yavta: Upgrade to latest version and drop downstream patch

  Martin Jansa (4):
        protobuf: import a patch from meta-webosose to fix building protobuf-c with gold linker
        grpc: revert GRPCPP_ABSEIL_SYNC change from 1.40.0 to fix undefined references to absl::lts_20210324::Mutex::~Mutex()
        luaposix: depend on target libxcrypt instead of native
        lv-lib-png: add wayland to REQUIRED_DISTRO_FEATURES

  Matthias Klein (1):
        gpsd: Install also the generated parts of the Python library

  Matthias Schiffer (1):
        byacc: switch to official HTTPS mirror

  Mingli Yu (1):
        opencv: remove setup_vars_opencv4.sh

  Oleksandr Kravchuk (72):
        iwd: update to 1.18
        nano: update to 5.9
        ostree: update to 2021.5
        pegtl: update to 3.2.1
        pmdk: update to 1.11.1
        protobuf-c: update to 1.4.0
        thingsboard-gateway: update to 2.8
        libbpf: fix PV
        libcdio-paranoia: update to 10.2+2.0.1
        ttf-abyssinica: update to 2.100
        ttf-dejavu: add UPSTREAM_CHECK_URI
        ttf-vlgothic: update to 20200720
        networkmanager: update to 1.32.12
        nng: update to 1.4.0
        opensaf: update to 5.21.09
        python3-absl: update 0.14.1
        python3-alembic: update to 1.7.4
        python3-astroid: update to 2.8.2
        python3-cantools: update to 36.4.0
        python3-certifi: update to 2021.10.8
        python3-cffi: update to 1.15.0
        python3-colorlog: update to 6.5.0
        python3-coverage: update to 6.0.2
        python3-cryptography-vectors: update to 35.0.0
        python3-dateparser: update to 1.1.0
        python3-elementpath: update to 2.3.2
        python3-eventlet: update to 0.32.0
        python3-google-api-core: update to 2.1.1
        python3-google-api-python-client: update to 2.26.1
        python3-google-auth: update to 2.3.0
        python3-grpcio-tools: update to 1.41.0
        python3-grpcio: update to 1.41.0
        python3-h2: update to 4.1.0
        python3-haversine: update to 2.5.1
        python3-httplib2: update to 0.20.1
        python3-idna: update to 3.3
        python3-iso3166: update to 2.0.2
        python3-joblib: update to 1.1.0
        python3-jsonrpcserver: update to 5.0.3
        python3-paramiko: update to 2.8.0
        python3-portion: update to 2.2.0
        python3-protobuf: update to 3.18.1
        python3-pulsectl: update to 21.10.4
        python3-pycodestyle: update to 2.8.0
        python3-pyephem: update to 4.1
        python3-pyflakes: update to 2.4.0
        python3-pyjwt: update to 2.2.0
        python3-pykickstart: update to 3.34
        python3-pyopenssl: update to 21.0.0
        python3-pyperf: update to 2.3.0
        python3-pytest-timeout: update 2.0.1
        python3-pytz: update to 2021.3
        python3-regex: update to 2021.10.8
        python3-sentry-sdk: update to 1.4.3
        python3-sympy: udpate to 1.9
        python3-twitter: update to 4.1.0
        python3-uritemplate: update to 4.1.1
        python3-websockets: update to 10.0
        python3-wrapt: update to 1.13.2
        python3-xlsxwriter: update to 3.0.1
        python3-xmlschema: update to 1.8.0
        python3-yarl: update to 1.7.0
        python3-typeguard: update to 2.13.0
        python3-pyatspi: update to 2.38.1
        python3-h5py: update to 3.5.0
        python3-pybind11-json: update to 0.2.11
        python3-pychromecast: update to 9.3.1
        python3-tzlocal: update to 4.0.1
        python3-zeroconf: update to 0.36.9
        leptonica: update to 1.82.0
        redis-plus-plus: update to 1.3.2
        hiredis: update to 1.0.2

  Peter Bergin (3):
        pipewire: remove manpages class
        pipewire: also handle pipewire-media-session in systemd class
        pipewire: rework PACKAGECONFIG for systemd service files

  Philippe Coval (5):
        lvgl: Add recipe for Lightweight Graphics Library
        lv-drivers: Add recipe for lvgl lib
        lv-lib-png: Add recipe for LVGL for handling PNG format
        lvgl: Add lv_lib_png to packagegroup
        lvgl: Lint recipe

  Roland Hieber (1):
        rapidjson: override hard-coded lib install dir

  Shiping Ji (1):
        Add recipe for driverctl

  Tim Orling (6):
        unicode-ucd: upgrade 12.1.0 -> 14.0.0
        gnome-screenshot: add recipe for 40.0
        libgweather: upgrade 3.36.2 -> 40.0
        colord: inherit pkgconfig
        gfbgraph: patch to build with latest rest
        gnome-calendar: upgrade 3.38.1 -> 41.0

  Trevor Gamblin (3):
        python3-posix-ipc: Add recipe for version 1.0.5
        python3-pyinotify: Add fcntl, logging to RDEPENDS
        python3-cvxopt: upgrade 1.2.6 -> 1.2.7

  Vyacheslav Yurkov (3):
        grpc: fix cross-compilation of grpc applications
        grpc: fix cross-compilation of grpc applications
        grpc: upgrade 1.38.1 -> 1.41.0

  Wang Mingyu (1):
        poppler: upgrade 21.09.0 -> 21.10.0

  Yi Zhao (3):
        samba: upgrade 4.14.7 -> 4.14.8
        audit: upgrade 3.0.5 -> 3.0.6
        strongswan: upgrade 5.9.3 -> 5.9.4

  Zoltán Böszörményi (1):
        python3-jsmin: Upgrade to version 3.0.0

  wangmy (11):
        openvpn: upgrade 2.5.3 -> 2.5.4
        redis: upgrade 6.2.5 -> 6.2.6
        span-lite: upgrade 0.10.1 -> 0.10.3
        bdwgc: upgrade 8.0.6 -> 8.2.0
        icewm: upgrade 2.7.0 -> 2.8.0
        ifenslave: upgrade 2.12 -> 2.13
        asio: upgrade 1.18.1.bb -> 1.20.0
        libgusb: upgrade 0.3.7 -> 0.3.8
        libxmlb: upgrade 0.3.2 -> 0.3.3
        xdebug: upgrade 2.9.5 -> 3.1.1
        cryptsetup: upgrade 2.3.6 -> 2.4.1

  zangrc (25):
        python3-ipython: upgrade 7.27.0 -> 7.28.0
        python3-jdatetime: upgrade 3.6.2 -> 3.6.4
        python3-multidict: upgrade 5.1.0 -> 5.2.0
        python3-openpyxl: upgrade 3.0.8 -> 3.0.9
        python3-pyscaffold: upgrade 4.0.2 -> 4.1
        python3-transitions: upgrade 0.8.9 -> 0.8.10
        networkmanager-openvpn: upgrade 1.8.14 -> 1.8.16
        ser2net: upgrade 4.3.3 -> 4.3.4
        python3-humanize: upgrade 3.11.0 -> 3.12.0
        python3-nmap: upgrade 1.5.0 -> 1.5.1
        libjs-jquery-cookie: Add recipe
        libjs-jquery-globalize: Add recipe
        python3-cachetools: upgrade 4.2.2 -> 4.2.4
        python3-cbor2: upgrade 5.4.1 -> 5.4.2
        python3-click: upgrade 8.0.1 -> 8.0.3
        python3-configargparse : upgrade 1.5.2 -> 1.5.3
        python3-flask: upgrade 2.0.1 -> 2.0.2
        python3-pyscaffold: upgrade 4.1 -> 4.1.1
        python3-werkzeug: upgrade 2.0.1 -> 2.0.2
        python3-absl: upgrade 0.14.1 -> 0.15.0
        python3-pandas: upgrade 1.3.3 -> 1.3.4
        python3-pulsectl: upgrade 21.10.4 -> 21.10.5
        python3-pyjwt: upgrade 2.2.0 -> 2.3.0
        python3-pytest-asyncio: upgrade 0.15.1 -> 0.16.0
        python3-robotframework: upgrade 4.1.1 -> 4.1.2

  zhengruoqin (15):
        python3-ujson: upgrade 4.1.0 -> 4.2.0
        python3-urllib3: upgrade 1.26.6 -> 1.26.7
        python3-watchdog: upgrade 2.1.5 -> 2.1.6
        gensio: upgrade 2.2.9 -> 2.3.1
        nlohmann-json: upgrade 3.10.2 -> 3.10.4
        libencode-perl: upgrade 3.12 -> 3.16
        python3-socketio: upgrade 5.4.0 -> 5.4.1
        python3-sqlalchemy: upgrade 1.4.23 -> 1.4.26
        python3-stevedore: upgrade 3.4.0 -> 3.5.0
        autofs: upgrade 5.1.7 -> 5.1.8
        links: upgrade 2.22 -> 2.25
        atftp: upgrade 0.7.4 -> 0.7.5
        python3-gmqtt: upgrade 0.6.10 -> 0.6.11
        python3-google-api-python-client: upgrade 2.26.1 -> 2.27.0
        python3-greenlet: upgrade 1.1.1 -> 1.1.2

meta-raspberrypi: 9eb4879cf4..90b3ac6fb3:
  Zygmunt Krynicki (1):
        rpi-config: warn on config.txt lines exceeding 80 bytes
Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
Change-Id: I9e75d5bd606a913fbe69e6735c9ecafc436441ba
diff --git a/poky/meta/classes/insane.bbclass b/poky/meta/classes/insane.bbclass
index f2d2ca3..1e2f1b7 100644
--- a/poky/meta/classes/insane.bbclass
+++ b/poky/meta/classes/insane.bbclass
@@ -18,8 +18,6 @@
 #   files under exec_prefix
 #  -Check if the package name is upper case
 
-QA_SANE = "True"
-
 # Elect whether a given type of error is a warning or error, they may
 # have been set by other files.
 WARN_QA ?= " libdir xorg-driver-abi \
@@ -28,6 +26,8 @@
             invalid-packageconfig host-user-contaminated uppercase-pn patch-fuzz \
             mime mime-xdg unlisted-pkg-lics unhandled-features-check \
             missing-update-alternatives native-last missing-ptest \
+            license-exists license-no-generic license-syntax license-format \
+            license-incompatible license-file-missing \
             "
 ERROR_QA ?= "dev-so debug-deps dev-deps debug-files arch pkgconfig la \
             perms dep-cmp pkgvarcheck perm-config perm-line perm-link \
@@ -59,32 +59,6 @@
         path = path.replace(os.path.join(d.getVar("PKGDEST"), pkg), "/")
     return path.replace(d.getVar("TMPDIR"), "/").replace("//", "/")
 
-def package_qa_write_error(type, error, d):
-    logfile = d.getVar('QA_LOGFILE')
-    if logfile:
-        p = d.getVar('P')
-        with open(logfile, "a+") as f:
-            f.write("%s: %s [%s]\n" % (p, error, type))
-
-def package_qa_handle_error(error_class, error_msg, d):
-    if error_class in (d.getVar("ERROR_QA") or "").split():
-        package_qa_write_error(error_class, error_msg, d)
-        bb.error("QA Issue: %s [%s]" % (error_msg, error_class))
-        d.setVar("QA_SANE", False)
-        return False
-    elif error_class in (d.getVar("WARN_QA") or "").split():
-        package_qa_write_error(error_class, error_msg, d)
-        bb.warn("QA Issue: %s [%s]" % (error_msg, error_class))
-    else:
-        bb.note("QA Issue: %s [%s]" % (error_msg, error_class))
-    return True
-
-def package_qa_add_message(messages, section, new_msg):
-    if section not in messages:
-        messages[section] = new_msg
-    else:
-        messages[section] = messages[section] + "\n" + new_msg
-
 QAPATHTEST[shebang-size] = "package_qa_check_shebang_size"
 def package_qa_check_shebang_size(path, name, d, elf, messages):
     import stat
@@ -106,7 +80,7 @@
             return
 
         if len(stanza) > 129:
-            package_qa_add_message(messages, "shebang-size", "%s: %s maximum shebang size exceeded, the maximum size is 128." % (name, package_qa_clean_path(path, d)))
+            oe.qa.add_message(messages, "shebang-size", "%s: %s maximum shebang size exceeded, the maximum size is 128." % (name, package_qa_clean_path(path, d)))
             return
 
 QAPATHTEST[libexec] = "package_qa_check_libexec"
@@ -118,7 +92,7 @@
         return True
 
     if 'libexec' in path.split(os.path.sep):
-        package_qa_add_message(messages, "libexec", "%s: %s is using libexec please relocate to %s" % (name, package_qa_clean_path(path, d), libexec))
+        oe.qa.add_message(messages, "libexec", "%s: %s is using libexec please relocate to %s" % (name, package_qa_clean_path(path, d), libexec))
         return False
 
     return True
@@ -146,7 +120,7 @@
             rpath = m.group(1)
             for dir in bad_dirs:
                 if dir in rpath:
-                    package_qa_add_message(messages, "rpaths", "package %s contains bad RPATH %s in file %s" % (name, rpath, file))
+                    oe.qa.add_message(messages, "rpaths", "package %s contains bad RPATH %s in file %s" % (name, rpath, file))
 
 QAPATHTEST[useless-rpaths] = "package_qa_check_useless_rpaths"
 def package_qa_check_useless_rpaths(file, name, d, elf, messages):
@@ -176,7 +150,7 @@
             if rpath_eq(rpath, libdir) or rpath_eq(rpath, base_libdir):
                 # The dynamic linker searches both these places anyway.  There is no point in
                 # looking there again.
-                package_qa_add_message(messages, "useless-rpaths", "%s: %s contains probably-redundant RPATH %s" % (name, package_qa_clean_path(file, d, name), rpath))
+                oe.qa.add_message(messages, "useless-rpaths", "%s: %s contains probably-redundant RPATH %s" % (name, package_qa_clean_path(file, d, name), rpath))
 
 QAPATHTEST[dev-so] = "package_qa_check_dev"
 def package_qa_check_dev(path, name, d, elf, messages):
@@ -185,7 +159,7 @@
     """
 
     if not name.endswith("-dev") and not name.endswith("-dbg") and not name.endswith("-ptest") and not name.startswith("nativesdk-") and path.endswith(".so") and os.path.islink(path):
-        package_qa_add_message(messages, "dev-so", "non -dev/-dbg/nativesdk- package %s contains symlink .so '%s'" % \
+        oe.qa.add_message(messages, "dev-so", "non -dev/-dbg/nativesdk- package %s contains symlink .so '%s'" % \
                  (name, package_qa_clean_path(path, d, name)))
 
 QAPATHTEST[dev-elf] = "package_qa_check_dev_elf"
@@ -196,7 +170,7 @@
     install link-time .so files that are linker scripts.
     """
     if name.endswith("-dev") and path.endswith(".so") and not os.path.islink(path) and elf:
-        package_qa_add_message(messages, "dev-elf", "-dev package %s contains non-symlink .so '%s'" % \
+        oe.qa.add_message(messages, "dev-elf", "-dev package %s contains non-symlink .so '%s'" % \
                  (name, package_qa_clean_path(path, d, name)))
 
 QAPATHTEST[staticdev] = "package_qa_check_staticdev"
@@ -209,7 +183,7 @@
     """
 
     if not name.endswith("-pic") and not name.endswith("-staticdev") and not name.endswith("-ptest") and path.endswith(".a") and not path.endswith("_nonshared.a") and not '/usr/lib/debug-static/' in path and not '/.debug-static/' in path:
-        package_qa_add_message(messages, "staticdev", "non -staticdev package contains static .a library: %s path '%s'" % \
+        oe.qa.add_message(messages, "staticdev", "non -staticdev package contains static .a library: %s path '%s'" % \
                  (name, package_qa_clean_path(path,d, name)))
 
 QAPATHTEST[mime] = "package_qa_check_mime"
@@ -220,7 +194,7 @@
     """
 
     if d.getVar("datadir") + "/mime/packages" in path and path.endswith('.xml') and not bb.data.inherits_class("mime", d):
-        package_qa_add_message(messages, "mime", "package contains mime types but does not inherit mime: %s path '%s'" % \
+        oe.qa.add_message(messages, "mime", "package contains mime types but does not inherit mime: %s path '%s'" % \
                  (name, package_qa_clean_path(path,d)))
 
 QAPATHTEST[mime-xdg] = "package_qa_check_mime_xdg"
@@ -247,9 +221,9 @@
             if name == d.getVar('PN'):
                 pkgname = '${PN}'
             wstr += "If yes: add \'inhert mime-xdg\' and \'MIME_XDG_PACKAGES += \"%s\"\' / if no add \'INSANE_SKIP:%s += \"mime-xdg\"\' to recipe." % (pkgname, pkgname)
-            package_qa_add_message(messages, "mime-xdg", wstr)
+            oe.qa.add_message(messages, "mime-xdg", wstr)
         if mime_type_found:
-            package_qa_add_message(messages, "mime-xdg", "package contains desktop file with key 'MimeType' but does not inhert mime-xdg: %s path '%s'" % \
+            oe.qa.add_message(messages, "mime-xdg", "package contains desktop file with key 'MimeType' but does not inhert mime-xdg: %s path '%s'" % \
                     (name, package_qa_clean_path(path,d)))
 
 def package_qa_check_libdir(d):
@@ -313,7 +287,7 @@
                             pass
 
     if messages:
-        package_qa_handle_error("libdir", "\n".join(messages), d)
+        oe.qa.handle_error("libdir", "\n".join(messages), d)
 
 QAPATHTEST[debug-files] = "package_qa_check_dbg"
 def package_qa_check_dbg(path, name, d, elf, messages):
@@ -323,7 +297,7 @@
 
     if not "-dbg" in name and not "-ptest" in name:
         if '.debug' in path.split(os.path.sep):
-            package_qa_add_message(messages, "debug-files", "non debug package contains .debug directory: %s path %s" % \
+            oe.qa.add_message(messages, "debug-files", "non debug package contains .debug directory: %s path %s" % \
                      (name, package_qa_clean_path(path,d)))
 
 QAPATHTEST[arch] = "package_qa_check_arch"
@@ -343,7 +317,7 @@
 
     if target_arch == "allarch":
         pn = d.getVar('PN')
-        package_qa_add_message(messages, "arch", pn + ": Recipe inherits the allarch class, but has packaged architecture-specific binaries")
+        oe.qa.add_message(messages, "arch", pn + ": Recipe inherits the allarch class, but has packaged architecture-specific binaries")
         return
 
     # FIXME: Cross package confuse this check, so just skip them
@@ -366,13 +340,13 @@
             target_os == "linux-gnu_ilp32" or re.match(r'mips64.*32', d.getVar('DEFAULTTUNE')))
     is_bpf = (oe.qa.elf_machine_to_string(elf.machine()) == "BPF")
     if not ((machine == elf.machine()) or is_32 or is_bpf):
-        package_qa_add_message(messages, "arch", "Architecture did not match (%s, expected %s) in %s" % \
+        oe.qa.add_message(messages, "arch", "Architecture did not match (%s, expected %s) in %s" % \
                  (oe.qa.elf_machine_to_string(elf.machine()), oe.qa.elf_machine_to_string(machine), package_qa_clean_path(path, d, name)))
     elif not ((bits == elf.abiSize()) or is_32 or is_bpf):
-        package_qa_add_message(messages, "arch", "Bit size did not match (%d, expected %d) in %s" % \
+        oe.qa.add_message(messages, "arch", "Bit size did not match (%d, expected %d) in %s" % \
                  (elf.abiSize(), bits, package_qa_clean_path(path, d, name)))
     elif not ((littleendian == elf.isLittleEndian()) or is_bpf):
-        package_qa_add_message(messages, "arch", "Endiannes did not match (%d, expected %d) in %s" % \
+        oe.qa.add_message(messages, "arch", "Endiannes did not match (%d, expected %d) in %s" % \
                  (elf.isLittleEndian(), littleendian, package_qa_clean_path(path,d, name)))
 
 QAPATHTEST[desktop] = "package_qa_check_desktop"
@@ -385,7 +359,7 @@
         output = os.popen("%s %s" % (desktop_file_validate, path))
         # This only produces output on errors
         for l in output:
-            package_qa_add_message(messages, "desktop", "Desktop file issue: " + l.strip())
+            oe.qa.add_message(messages, "desktop", "Desktop file issue: " + l.strip())
 
 QAPATHTEST[textrel] = "package_qa_textrel"
 def package_qa_textrel(path, name, d, elf, messages):
@@ -411,7 +385,7 @@
 
     if not sane:
         path = package_qa_clean_path(path, d, name)
-        package_qa_add_message(messages, "textrel", "%s: ELF binary %s has relocations in .text" % (name, path))
+        oe.qa.add_message(messages, "textrel", "%s: ELF binary %s has relocations in .text" % (name, path))
 
 QAPATHTEST[ldflags] = "package_qa_hash_style"
 def package_qa_hash_style(path, name, d, elf, messages):
@@ -446,7 +420,7 @@
             sane = True
     if has_syms and not sane:
         path = package_qa_clean_path(path, d, name)
-        package_qa_add_message(messages, "ldflags", "File %s in package %s doesn't have GNU_HASH (didn't pass LDFLAGS?)" % (path, name))
+        oe.qa.add_message(messages, "ldflags", "File %s in package %s doesn't have GNU_HASH (didn't pass LDFLAGS?)" % (path, name))
 
 
 QAPATHTEST[buildpaths] = "package_qa_check_buildpaths"
@@ -467,7 +441,7 @@
         file_content = f.read()
         if tmpdir in file_content:
             trimmed = path.replace(os.path.join (d.getVar("PKGDEST"), name), "")
-            package_qa_add_message(messages, "buildpaths", "File %s in package %s contains reference to TMPDIR" % (trimmed, name))
+            oe.qa.add_message(messages, "buildpaths", "File %s in package %s contains reference to TMPDIR" % (trimmed, name))
 
 
 QAPATHTEST[xorg-driver-abi] = "package_qa_check_xorg_driver_abi"
@@ -486,7 +460,7 @@
         for rdep in bb.utils.explode_deps(d.getVar('RDEPENDS:' + name) or ""):
             if rdep.startswith("%sxorg-abi-" % mlprefix):
                 return
-        package_qa_add_message(messages, "xorg-driver-abi", "Package %s contains Xorg driver (%s) but no xorg-abi- dependencies" % (name, os.path.basename(path)))
+        oe.qa.add_message(messages, "xorg-driver-abi", "Package %s contains Xorg driver (%s) but no xorg-abi- dependencies" % (name, os.path.basename(path)))
 
 QAPATHTEST[infodir] = "package_qa_check_infodir"
 def package_qa_check_infodir(path, name, d, elf, messages):
@@ -496,7 +470,7 @@
     infodir = d.expand("${infodir}/dir")
 
     if infodir in path:
-        package_qa_add_message(messages, "infodir", "The /usr/share/info/dir file is not meant to be shipped in a particular package.")
+        oe.qa.add_message(messages, "infodir", "The /usr/share/info/dir file is not meant to be shipped in a particular package.")
 
 QAPATHTEST[symlink-to-sysroot] = "package_qa_check_symlink_to_sysroot"
 def package_qa_check_symlink_to_sysroot(path, name, d, elf, messages):
@@ -509,7 +483,7 @@
             tmpdir = d.getVar('TMPDIR')
             if target.startswith(tmpdir):
                 trimmed = path.replace(os.path.join (d.getVar("PKGDEST"), name), "")
-                package_qa_add_message(messages, "symlink-to-sysroot", "Symlink %s in %s points to TMPDIR" % (trimmed, name))
+                oe.qa.add_message(messages, "symlink-to-sysroot", "Symlink %s in %s points to TMPDIR" % (trimmed, name))
 
 # Check license variables
 do_populate_lic[postfuncs] += "populate_lic_qa_checksum"
@@ -517,7 +491,6 @@
     """
     Check for changes in the license files.
     """
-    sane = True
 
     lic_files = d.getVar('LIC_FILES_CHKSUM') or ''
     lic = d.getVar('LICENSE')
@@ -527,7 +500,7 @@
         return
 
     if not lic_files and d.getVar('SRC_URI'):
-        sane &= package_qa_handle_error("license-checksum", pn + ": Recipe file fetches files and does not have license file information (LIC_FILES_CHKSUM)", d)
+        oe.qa.handle_error("license-checksum", pn + ": Recipe file fetches files and does not have license file information (LIC_FILES_CHKSUM)", d)
 
     srcdir = d.getVar('S')
     corebase_licensefile = d.getVar('COREBASE') + "/LICENSE"
@@ -535,11 +508,11 @@
         try:
             (type, host, path, user, pswd, parm) = bb.fetch.decodeurl(url)
         except bb.fetch.MalformedUrl:
-            sane &= package_qa_handle_error("license-checksum", pn + ": LIC_FILES_CHKSUM contains an invalid URL: " + url, d)
+            oe.qa.handle_error("license-checksum", pn + ": LIC_FILES_CHKSUM contains an invalid URL: " + url, d)
             continue
         srclicfile = os.path.join(srcdir, path)
         if not os.path.isfile(srclicfile):
-            sane &= package_qa_handle_error("license-checksum", pn + ": LIC_FILES_CHKSUM points to an invalid file: " + srclicfile, d)
+            oe.qa.handle_error("license-checksum", pn + ": LIC_FILES_CHKSUM points to an invalid file: " + srclicfile, d)
             continue
 
         if (srclicfile == corebase_licensefile):
@@ -607,10 +580,9 @@
             else:
                 msg = pn + ": LIC_FILES_CHKSUM is not specified for " +  url
                 msg = msg + "\n" + pn + ": The md5 checksum is " + md5chksum
-            sane &= package_qa_handle_error("license-checksum", msg, d)
+            oe.qa.handle_error("license-checksum", msg, d)
 
-    if not sane:
-        bb.fatal("Fatal QA errors found, failing task.")
+    oe.qa.exit_if_errors(d)
 }
 
 def qa_check_staged(path,d):
@@ -622,7 +594,6 @@
     responsible for the errors easily even if we look at every .pc and .la file.
     """
 
-    sane = True
     tmpdir = d.getVar('TMPDIR')
     workdir = os.path.join(tmpdir, "work")
     recipesysroot = d.getVar("RECIPE_SYSROOT")
@@ -655,16 +626,14 @@
                     file_content = file_content.replace(recipesysroot, "")
                     if workdir in file_content:
                         error_msg = "%s failed sanity test (workdir) in path %s" % (file,root)
-                        sane &= package_qa_handle_error("la", error_msg, d)
+                        oe.qa.handle_error("la", error_msg, d)
             elif file.endswith(".pc") and not skip_pkgconfig:
                 with open(path) as f:
                     file_content = f.read()
                     file_content = file_content.replace(recipesysroot, "")
                     if pkgconfigcheck in file_content:
                         error_msg = "%s failed sanity test (tmpdir) in path %s" % (file,root)
-                        sane &= package_qa_handle_error("pkgconfig", error_msg, d)
-
-    return sane
+                        oe.qa.handle_error("pkgconfig", error_msg, d)
 
 # Run all package-wide warnfuncs and errorfuncs
 def package_qa_package(warnfuncs, errorfuncs, package, d):
@@ -677,9 +646,9 @@
         func(package, d, errors)
 
     for w in warnings:
-        package_qa_handle_error(w, warnings[w], d)
+        oe.qa.handle_error(w, warnings[w], d)
     for e in errors:
-        package_qa_handle_error(e, errors[e], d)
+        oe.qa.handle_error(e, errors[e], d)
 
     return len(errors) == 0
 
@@ -694,16 +663,14 @@
         func(pn, d, errors)
 
     for w in warnings:
-        package_qa_handle_error(w, warnings[w], d)
+        oe.qa.handle_error(w, warnings[w], d)
     for e in errors:
-        package_qa_handle_error(e, errors[e], d)
+        oe.qa.handle_error(e, errors[e], d)
 
     return len(errors) == 0
 
 # Walk over all files in a directory and call func
 def package_qa_walk(warnfuncs, errorfuncs, package, d):
-    import oe.qa
-
     #if this will throw an exception, then fix the dict above
     target_os   = d.getVar('TARGET_OS')
     target_arch = d.getVar('TARGET_ARCH')
@@ -724,9 +691,9 @@
                 func(path, package, d, elf, errors)
 
     for w in warnings:
-        package_qa_handle_error(w, warnings[w], d)
+        oe.qa.handle_error(w, warnings[w], d)
     for e in errors:
-        package_qa_handle_error(e, errors[e], d)
+        oe.qa.handle_error(e, errors[e], d)
 
 def package_qa_check_rdepends(pkg, pkgdest, skip, taskdeps, packages, d):
     # Don't do this check for kernel/module recipes, there aren't too many debug/development
@@ -746,10 +713,10 @@
             for rdepend in rdepends:
                 if "-dbg" in rdepend and "debug-deps" not in skip:
                     error_msg = "%s rdepends on %s" % (pkg,rdepend)
-                    package_qa_handle_error("debug-deps", error_msg, d)
+                    oe.qa.handle_error("debug-deps", error_msg, d)
                 if (not "-dev" in pkg and not "-staticdev" in pkg) and rdepend.endswith("-dev") and "dev-deps" not in skip:
                     error_msg = "%s rdepends on %s" % (pkg, rdepend)
-                    package_qa_handle_error("dev-deps", error_msg, d)
+                    oe.qa.handle_error("dev-deps", error_msg, d)
                 if rdepend not in packages:
                     rdep_data = oe.packagedata.read_subpkgdata(rdepend, d)
                     if rdep_data and 'PN' in rdep_data and rdep_data['PN'] in taskdeps:
@@ -770,7 +737,7 @@
                         error_msg = "%s rdepends on %s, but it isn't a build dependency, missing %s in DEPENDS or PACKAGECONFIG?" % (pkg, rdepend, rdep_data['PN'])
                     else:
                         error_msg = "%s rdepends on %s, but it isn't a build dependency?" % (pkg, rdepend)
-                    package_qa_handle_error("build-deps", error_msg, d)
+                    oe.qa.handle_error("build-deps", error_msg, d)
 
         if "file-rdeps" not in skip:
             ignored_file_rdeps = set(['/bin/sh', '/usr/bin/env', 'rtld(GNU_HASH)'])
@@ -823,7 +790,7 @@
                 for key in filerdepends:
                     error_msg = "%s contained in package %s requires %s, but no providers found in RDEPENDS:%s?" % \
                             (filerdepends[key].replace(":%s" % pkg, "").replace("@underscore@", "_"), pkg, key, pkg)
-                    package_qa_handle_error("file-rdeps", error_msg, d)
+                    oe.qa.handle_error("file-rdeps", error_msg, d)
 package_qa_check_rdepends[vardepsexclude] = "OVERRIDES"
 
 def package_qa_check_deps(pkg, pkgdest, d):
@@ -840,7 +807,7 @@
             for v in rvar[dep]:
                 if v and not v.startswith(('< ', '= ', '> ', '<= ', '>=')):
                     error_msg = "%s:%s is invalid: %s (%s)   only comparisons <, =, >, <=, and >= are allowed" % (var, pkg, dep, v)
-                    package_qa_handle_error("dep-cmp", error_msg, d)
+                    oe.qa.handle_error("dep-cmp", error_msg, d)
 
     check_valid_deps('RDEPENDS')
     check_valid_deps('RRECOMMENDS')
@@ -851,13 +818,14 @@
 
 QAPKGTEST[usrmerge] = "package_qa_check_usrmerge"
 def package_qa_check_usrmerge(pkg, d, messages):
+
     pkgdest = d.getVar('PKGDEST')
     pkg_dir = pkgdest + os.sep + pkg + os.sep
     merged_dirs = ['bin', 'sbin', 'lib'] + d.getVar('MULTILIB_VARIANTS').split()
     for f in merged_dirs:
         if os.path.exists(pkg_dir + f) and not os.path.islink(pkg_dir + f):
             msg = "%s package is not obeying usrmerge distro feature. /%s should be relocated to /usr." % (pkg, f)
-            package_qa_add_message(messages, "usrmerge", msg)
+            oe.qa.add_message(messages, "usrmerge", msg)
             return False
     return True
 
@@ -876,7 +844,7 @@
     if matches:
         matches = [package_qa_clean_path(path, d, pkg) for path in matches]
         msg = "%s contains perllocal.pod (%s), should not be installed" % (pkg, " ".join(matches))
-        package_qa_add_message(messages, "perllocalpod", msg)
+        oe.qa.add_message(messages, "perllocalpod", msg)
 
 QAPKGTEST[expanded-d] = "package_qa_check_expanded_d"
 def package_qa_check_expanded_d(package, d, messages):
@@ -891,10 +859,10 @@
         bbvar = d.getVar(var + ":" + package) or ""
         if expanded_d in bbvar:
             if var == 'FILES':
-                package_qa_add_message(messages, "expanded-d", "FILES in %s recipe should not contain the ${D} variable as it references the local build directory not the target filesystem, best solution is to remove the ${D} reference" % package)
+                oe.qa.add_message(messages, "expanded-d", "FILES in %s recipe should not contain the ${D} variable as it references the local build directory not the target filesystem, best solution is to remove the ${D} reference" % package)
                 sane = False
             else:
-                package_qa_add_message(messages, "expanded-d", "%s in %s recipe contains ${D}, it should be replaced by $D instead" % (var, package))
+                oe.qa.add_message(messages, "expanded-d", "%s in %s recipe contains ${D}, it should be replaced by $D instead" % (var, package))
                 sane = False
     return sane
 
@@ -912,7 +880,7 @@
     if not unlisted:
         return True
 
-    package_qa_add_message(messages, "unlisted-pkg-lics",
+    oe.qa.add_message(messages, "unlisted-pkg-lics",
                            "LICENSE:%s includes licenses (%s) that are not "
                            "listed in LICENSE" % (package, ' '.join(unlisted)))
     return False
@@ -927,7 +895,7 @@
             except UnicodeDecodeError as e:
                 error_msg = "%s has non %s characters" % (key,enc)
                 sane = False
-                package_qa_handle_error("invalid-chars", error_msg, d)
+                oe.qa.handle_error("invalid-chars", error_msg, d)
         return sane
 
     for key in keys:
@@ -960,12 +928,12 @@
     else:
         check_uid = int(d.getVar('HOST_USER_UID'))
         if stat.st_uid == check_uid:
-            package_qa_add_message(messages, "host-user-contaminated", "%s: %s is owned by uid %d, which is the same as the user running bitbake. This may be due to host contamination" % (pn, package_qa_clean_path(path, d, name), check_uid))
+            oe.qa.add_message(messages, "host-user-contaminated", "%s: %s is owned by uid %d, which is the same as the user running bitbake. This may be due to host contamination" % (pn, package_qa_clean_path(path, d, name), check_uid))
             return False
 
         check_gid = int(d.getVar('HOST_USER_GID'))
         if stat.st_gid == check_gid:
-            package_qa_add_message(messages, "host-user-contaminated", "%s: %s is owned by gid %d, which is the same as the user running bitbake. This may be due to host contamination" % (pn, package_qa_clean_path(path, d, name), check_gid))
+            oe.qa.add_message(messages, "host-user-contaminated", "%s: %s is owned by gid %d, which is the same as the user running bitbake. This may be due to host contamination" % (pn, package_qa_clean_path(path, d, name), check_gid))
             return False
     return True
 
@@ -974,11 +942,11 @@
     import re
 
     if "${PN}" in d.getVar("SRC_URI", False):
-        package_qa_handle_error("src-uri-bad", "%s: SRC_URI uses PN not BPN" % pn, d)
+        oe.qa.handle_error("src-uri-bad", "%s: SRC_URI uses PN not BPN" % pn, d)
 
     for url in d.getVar("SRC_URI").split():
         if re.search(r"git(hu|la)b\.com/.+/.+/archive/.+", url):
-            package_qa_handle_error("src-uri-bad", "%s: SRC_URI uses unstable GitHub/GitLab archives, convert recipe to use git protocol" % pn, d)
+            oe.qa.handle_error("src-uri-bad", "%s: SRC_URI uses unstable GitHub/GitLab archives, convert recipe to use git protocol" % pn, d)
 
 QARECIPETEST[unhandled-features-check] = "package_qa_check_unhandled_features_check"
 def package_qa_check_unhandled_features_check(pn, d, messages):
@@ -989,7 +957,7 @@
                 if d.getVar(var) is not None or d.overridedata.get(var) is not None:
                     var_set = True
         if var_set:
-            package_qa_handle_error("unhandled-features-check", "%s: recipe doesn't inherit features_check" % pn, d)
+            oe.qa.handle_error("unhandled-features-check", "%s: recipe doesn't inherit features_check" % pn, d)
 
 QARECIPETEST[missing-update-alternatives] = "package_qa_check_missing_update_alternatives"
 def package_qa_check_missing_update_alternatives(pn, d, messages):
@@ -997,7 +965,7 @@
     # without inheriting update-alternatives class
     for pkg in (d.getVar('PACKAGES') or '').split():
         if d.getVar('ALTERNATIVE:%s' % pkg) and not bb.data.inherits_class('update-alternatives', d):
-            package_qa_handle_error("missing-update-alternatives", "%s: recipe defines ALTERNATIVE:%s but doesn't inherit update-alternatives. This might fail during do_rootfs later!" % (pn, pkg), d)
+            oe.qa.handle_error("missing-update-alternatives", "%s: recipe defines ALTERNATIVE:%s but doesn't inherit update-alternatives. This might fail during do_rootfs later!" % (pn, pkg), d)
 
 # The PACKAGE FUNC to scan each package
 python do_package_qa () {
@@ -1073,7 +1041,7 @@
         bb.note("Checking Package: %s" % package)
         # Check package name
         if not pkgname_pattern.match(package):
-            package_qa_handle_error("pkgname",
+            oe.qa.handle_error("pkgname",
                     "%s doesn't match the [a-z0-9.+-]+ regex" % package, d)
 
         warn_checks, error_checks = parse_test_matrix("QAPATHTEST")
@@ -1091,10 +1059,7 @@
     if 'libdir' in d.getVar("ALL_QA").split():
         package_qa_check_libdir(d)
 
-    qa_sane = d.getVar("QA_SANE")
-    if not qa_sane:
-        bb.fatal("QA run found fatal errors. Please consider fixing them.")
-    bb.note("DONE with PACKAGE QA")
+    oe.qa.exit_if_errors(d)
 }
 
 # binutils is used for most checks, so need to set as dependency
@@ -1121,8 +1086,8 @@
 
 python do_qa_staging() {
     bb.note("QA checking staging")
-    if not qa_check_staged(d.expand('${SYSROOT_DESTDIR}${libdir}'), d):
-        bb.fatal("QA staging was broken by the package built above")
+    qa_check_staged(d.expand('${SYSROOT_DESTDIR}${libdir}'), d)
+    oe.qa.exit_with_message_if_errors("QA staging was broken by the package built above", d)
 }
 
 python do_qa_patch() {
@@ -1170,7 +1135,7 @@
             elif 'patch-fuzz' in d.getVar('WARN_QA'):
                 bb.warn(msg)
             msg = "Patch log indicates that patches do not apply cleanly."
-            package_qa_handle_error("patch-fuzz", msg, d)
+            oe.qa.handle_error("patch-fuzz", msg, d)
 }
 
 python do_qa_configure() {
@@ -1198,7 +1163,7 @@
                 if subprocess.call(statement, shell=True) == 0:
                     error_msg = """This autoconf log indicates errors, it looked at host include and/or library paths while determining system capabilities.
 Rerun configure task after fixing this."""
-                    package_qa_handle_error("configure-unsafe", error_msg, d)
+                    oe.qa.handle_error("configure-unsafe", error_msg, d)
 
             if "configure.ac" in files:
                 configs.append(os.path.join(root,"configure.ac"))
@@ -1228,7 +1193,7 @@
                 gnu = "grep \"^[[:space:]]*AM_GNU_GETTEXT\" %s >/dev/null" % config
                 if subprocess.call(gnu, shell=True) == 0:
                     error_msg = "AM_GNU_GETTEXT used but no inherit gettext"
-                    package_qa_handle_error("configure-gettext", error_msg, d)
+                    oe.qa.handle_error("configure-gettext", error_msg, d)
 
     ###########################################################################
     # Check unrecognised configure options (with a white list)
@@ -1251,7 +1216,7 @@
             if options:
                 pn = d.getVar('PN')
                 error_msg = pn + ": configure was passed unrecognised options: " + " ".join(options)
-                package_qa_handle_error("unknown-configure-option", error_msg, d)
+                oe.qa.handle_error("unknown-configure-option", error_msg, d)
         except subprocess.CalledProcessError:
             pass
 
@@ -1263,11 +1228,9 @@
             if pconfig not in pkgconfigflags:
                 pn = d.getVar('PN')
                 error_msg = "%s: invalid PACKAGECONFIG: %s" % (pn, pconfig)
-                package_qa_handle_error("invalid-packageconfig", error_msg, d)
+                oe.qa.handle_error("invalid-packageconfig", error_msg, d)
 
-    qa_sane = d.getVar("QA_SANE")
-    if not qa_sane:
-        bb.fatal("Fatal QA errors found, failing task.")
+    oe.qa.exit_if_errors(d)
 }
 
 python do_qa_unpack() {
@@ -1320,15 +1283,15 @@
     pn = d.getVar('PN')
     if pn in overrides:
         msg = 'Recipe %s has PN of "%s" which is in OVERRIDES, this can result in unexpected behaviour.' % (d.getVar("FILE"), pn)
-        package_qa_handle_error("pn-overrides", msg, d)
+        oe.qa.handle_error("pn-overrides", msg, d)
     prog = re.compile(r'[A-Z]')
     if prog.search(pn):
-        package_qa_handle_error("uppercase-pn", 'PN: %s is upper case, this can result in unexpected behavior.' % pn, d)
+        oe.qa.handle_error("uppercase-pn", 'PN: %s is upper case, this can result in unexpected behavior.' % pn, d)
 
     # Some people mistakenly use DEPENDS:${PN} instead of DEPENDS and wonder
     # why it doesn't work.
     if (d.getVar(d.expand('DEPENDS:${PN}'))):
-        package_qa_handle_error("pkgvarcheck", "recipe uses DEPENDS:${PN}, should use DEPENDS", d)
+        oe.qa.handle_error("pkgvarcheck", "recipe uses DEPENDS:${PN}, should use DEPENDS", d)
 
     issues = []
     if (d.getVar('PACKAGES') or "").split():
@@ -1345,7 +1308,7 @@
     else:
         d.setVarFlag('do_package_qa', 'rdeptask', '')
     for i in issues:
-        package_qa_handle_error("pkgvarcheck", "%s: Variable %s is set as not being package specific, please fix this." % (d.getVar("FILE"), i), d)
+        oe.qa.handle_error("pkgvarcheck", "%s: Variable %s is set as not being package specific, please fix this." % (d.getVar("FILE"), i), d)
 
     if 'native-last' not in (d.getVar('INSANE_SKIP') or "").split():
         for native_class in ['native', 'nativesdk']:
@@ -1373,11 +1336,8 @@
                     else:
                         break
                 if broken_order:
-                    package_qa_handle_error("native-last", "%s: native/nativesdk class is not inherited last, this can result in unexpected behaviour. "
+                    oe.qa.handle_error("native-last", "%s: native/nativesdk class is not inherited last, this can result in unexpected behaviour. "
                                              "Classes inherited after native/nativesdk: %s" % (pn, " ".join(broken_order)), d)
 
-
-    qa_sane = d.getVar("QA_SANE")
-    if not qa_sane:
-        bb.fatal("Fatal QA errors found, failing task.")
+    oe.qa.exit_if_errors(d)
 }