[libvirt PATCH 2/2] ci: refresh with latest lcitool manifest

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This refresh switches the CI for contributors to be triggered by merge
requests. Pushing to a branch in a fork will no longer run CI pipelines,
in order to avoid consuming CI minutes. To regain the original behaviour
contributors can opt-in to a pipeline on push

   git push <remote> -o ci.variable=RUN_PIPELINE=1

This variable can also be set globally on the repository, though this is
not recommended. Upstream repo pushes to branches will run CI.

The use of containers has changed in this update, with only the upstream
repo creating containers, in order to avoid consuming contributors'
limited storage quotas. A fork with existing container images may delete
them. Containers will be rebuilt upstream when pushing commits with CI
changes to the default branch. Any other scenario with CI changes will
simply install build pre-requisite packages in a throaway environment,
using the ci/buildenv/ scripts. These scripts may also be used on a
contributor's local machines.

With pipelines triggered by merge requests, it is also now possible to
workaround the inability of contributors to run pipelines if they have
run out of CI quota. A project member can trigger a pipeline from the
merge request, which will run in context of upstream, however, note
this should only be done after reviewing the code for any malicious
CI changes.

Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx>
---
 .gitlab-ci.yml                                | 107 +++-
 ci/buildenv/almalinux-8.sh                    |  98 ++++
 ci/buildenv/alpine-315.sh                     |  80 +++
 ci/buildenv/alpine-edge.sh                    |  81 +++
 ci/buildenv/centos-stream-8.sh                |  99 ++++
 ci/buildenv/centos-stream-9.sh                |  98 ++++
 ci/buildenv/debian-11-cross-aarch64.sh        | 115 ++++
 ci/buildenv/debian-11-cross-armv6l.sh         | 114 ++++
 ci/buildenv/debian-11-cross-armv7l.sh         | 115 ++++
 ci/buildenv/debian-11-cross-i686.sh           | 114 ++++
 ci/buildenv/debian-11-cross-mips64el.sh       | 114 ++++
 ci/buildenv/debian-11-cross-mipsel.sh         | 114 ++++
 ci/buildenv/debian-11-cross-ppc64le.sh        | 114 ++++
 ci/buildenv/debian-11-cross-s390x.sh          | 114 ++++
 ci/buildenv/debian-11.sh                      |  98 ++++
 ci/buildenv/debian-sid-cross-aarch64.sh       | 115 ++++
 ci/buildenv/debian-sid-cross-armv6l.sh        | 114 ++++
 ci/buildenv/debian-sid-cross-armv7l.sh        | 115 ++++
 ci/buildenv/debian-sid-cross-i686.sh          | 114 ++++
 ci/buildenv/debian-sid-cross-mips64el.sh      | 114 ++++
 ci/buildenv/debian-sid-cross-mipsel.sh        | 114 ++++
 ci/buildenv/debian-sid-cross-ppc64le.sh       | 114 ++++
 ci/buildenv/debian-sid-cross-s390x.sh         | 114 ++++
 ci/buildenv/debian-sid.sh                     |  97 ++++
 ci/buildenv/fedora-35.sh                      |  97 ++++
 ci/buildenv/fedora-36-cross-mingw32.sh        |  74 +++
 ci/buildenv/fedora-36-cross-mingw64.sh        |  74 +++
 ci/buildenv/fedora-36.sh                      |  96 ++++
 ci/buildenv/fedora-rawhide-cross-mingw32.sh   |  75 +++
 ci/buildenv/fedora-rawhide-cross-mingw64.sh   |  75 +++
 ci/buildenv/fedora-rawhide.sh                 |  97 ++++
 ci/buildenv/opensuse-leap-153.sh              |  99 ++++
 ci/buildenv/opensuse-tumbleweed.sh            |  96 ++++
 ci/buildenv/ubuntu-2004.sh                    | 102 ++++
 ci/buildenv/ubuntu-2204.sh                    |  98 ++++
 ci/containers/almalinux-8.Dockerfile          |   2 +-
 ci/containers/alpine-315.Dockerfile           |   2 +-
 ci/containers/alpine-edge.Dockerfile          |   2 +-
 ci/containers/centos-stream-8.Dockerfile      |   2 +-
 ci/containers/centos-stream-9.Dockerfile      |   2 +-
 .../debian-11-cross-aarch64.Dockerfile        | 142 ++---
 .../debian-11-cross-armv6l.Dockerfile         | 140 ++---
 .../debian-11-cross-armv7l.Dockerfile         | 142 ++---
 ci/containers/debian-11-cross-i686.Dockerfile | 140 ++---
 .../debian-11-cross-mips64el.Dockerfile       | 140 ++---
 .../debian-11-cross-mipsel.Dockerfile         | 140 ++---
 .../debian-11-cross-ppc64le.Dockerfile        | 140 ++---
 .../debian-11-cross-s390x.Dockerfile          | 140 ++---
 ci/containers/debian-11.Dockerfile            | 148 ++---
 .../debian-sid-cross-aarch64.Dockerfile       | 142 ++---
 .../debian-sid-cross-armv6l.Dockerfile        | 140 ++---
 .../debian-sid-cross-armv7l.Dockerfile        | 142 ++---
 .../debian-sid-cross-i686.Dockerfile          | 140 ++---
 .../debian-sid-cross-mips64el.Dockerfile      | 140 ++---
 .../debian-sid-cross-mipsel.Dockerfile        | 140 ++---
 .../debian-sid-cross-ppc64le.Dockerfile       | 140 ++---
 .../debian-sid-cross-s390x.Dockerfile         | 140 ++---
 ci/containers/debian-sid.Dockerfile           | 146 ++---
 ci/containers/fedora-35.Dockerfile            | 154 ++---
 .../fedora-36-cross-mingw32.Dockerfile        | 102 ++--
 .../fedora-36-cross-mingw64.Dockerfile        | 102 ++--
 ci/containers/fedora-36.Dockerfile            | 152 ++---
 .../fedora-rawhide-cross-mingw32.Dockerfile   | 102 ++--
 .../fedora-rawhide-cross-mingw64.Dockerfile   | 102 ++--
 ci/containers/fedora-rawhide.Dockerfile       | 152 ++---
 ci/containers/opensuse-leap-153.Dockerfile    |   2 +-
 ci/containers/opensuse-tumbleweed.Dockerfile  |   4 +-
 ci/containers/ubuntu-2004.Dockerfile          | 154 ++---
 ci/containers/ubuntu-2204.Dockerfile          | 148 ++---
 ci/gitlab.yml                                 |  58 +-
 ci/gitlab/build-templates.yml                 | 245 +++++++-
 ci/gitlab/builds.yml                          | 524 +++++++++++++++---
 ci/gitlab/container-templates.yml             |  45 +-
 ci/gitlab/sanity-checks.yml                   |  16 +-
 ci/integration-template.yml                   |  27 +-
 ci/integration.yml                            | 125 ++++-
 76 files changed, 6291 insertions(+), 2044 deletions(-)
 create mode 100644 ci/buildenv/almalinux-8.sh
 create mode 100644 ci/buildenv/alpine-315.sh
 create mode 100644 ci/buildenv/alpine-edge.sh
 create mode 100644 ci/buildenv/centos-stream-8.sh
 create mode 100644 ci/buildenv/centos-stream-9.sh
 create mode 100644 ci/buildenv/debian-11-cross-aarch64.sh
 create mode 100644 ci/buildenv/debian-11-cross-armv6l.sh
 create mode 100644 ci/buildenv/debian-11-cross-armv7l.sh
 create mode 100644 ci/buildenv/debian-11-cross-i686.sh
 create mode 100644 ci/buildenv/debian-11-cross-mips64el.sh
 create mode 100644 ci/buildenv/debian-11-cross-mipsel.sh
 create mode 100644 ci/buildenv/debian-11-cross-ppc64le.sh
 create mode 100644 ci/buildenv/debian-11-cross-s390x.sh
 create mode 100644 ci/buildenv/debian-11.sh
 create mode 100644 ci/buildenv/debian-sid-cross-aarch64.sh
 create mode 100644 ci/buildenv/debian-sid-cross-armv6l.sh
 create mode 100644 ci/buildenv/debian-sid-cross-armv7l.sh
 create mode 100644 ci/buildenv/debian-sid-cross-i686.sh
 create mode 100644 ci/buildenv/debian-sid-cross-mips64el.sh
 create mode 100644 ci/buildenv/debian-sid-cross-mipsel.sh
 create mode 100644 ci/buildenv/debian-sid-cross-ppc64le.sh
 create mode 100644 ci/buildenv/debian-sid-cross-s390x.sh
 create mode 100644 ci/buildenv/debian-sid.sh
 create mode 100644 ci/buildenv/fedora-35.sh
 create mode 100644 ci/buildenv/fedora-36-cross-mingw32.sh
 create mode 100644 ci/buildenv/fedora-36-cross-mingw64.sh
 create mode 100644 ci/buildenv/fedora-36.sh
 create mode 100644 ci/buildenv/fedora-rawhide-cross-mingw32.sh
 create mode 100644 ci/buildenv/fedora-rawhide-cross-mingw64.sh
 create mode 100644 ci/buildenv/fedora-rawhide.sh
 create mode 100644 ci/buildenv/opensuse-leap-153.sh
 create mode 100644 ci/buildenv/opensuse-tumbleweed.sh
 create mode 100644 ci/buildenv/ubuntu-2004.sh
 create mode 100644 ci/buildenv/ubuntu-2204.sh

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f6ed14bf65..c05155ddd4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -20,15 +20,12 @@ include:
   - '/ci/integration.yml'
 
 .native_build_job:
-  extends: .gitlab_native_build_job
   cache:
     paths:
       - ccache/
     key: "$CI_JOB_NAME"
-  before_script:
-    - *script_variables
-    - cat /packages.txt
   script:
+    - *script_variables
     - meson setup build --werror $MESON_ARGS || (cat build/meson-logs/meson-log.txt && exit 1)
     - meson dist -C build --no-tests
     - if test -x /usr/bin/rpmbuild && test "$RPM" != "skip";
@@ -40,33 +37,44 @@ include:
         meson test -C build --no-suite syntax-check --print-errorlogs;
       fi
 
+.native_build_job_prebuilt_env:
+  extends:
+    - .native_build_job
+    - .gitlab_native_build_job_prebuilt_env
+
+.native_build_job_local_env:
+  extends:
+    - .native_build_job
+    - .gitlab_native_build_job_local_env
+
 .cross_build_job:
-  extends: .gitlab_cross_build_job
   cache:
     paths:
       - ccache/
     key: "$CI_JOB_NAME"
-  before_script:
-    - *script_variables
-    - cat /packages.txt
   script:
+    - *script_variables
     - meson setup build --werror $MESON_OPTS || (cat build/meson-logs/meson-log.txt && exit 1)
     - meson compile -C build
     - if test "$CROSS" = "i686" ; then meson test -C build --no-suite syntax-check --print-errorlogs ; fi
 
+.cross_build_job_prebuilt_env:
+  extends:
+    - .cross_build_job
+    - .gitlab_cross_build_job_prebuilt_env
+
+.cross_build_job_local_env:
+  extends:
+    - .cross_build_job
+    - .gitlab_cross_build_job_local_env
+
 
 # This artifact published by this job is downloaded by libvirt.org to
 # be deployed to the web root:
 #    https://gitlab.com/libvirt/libvirt/-/jobs/artifacts/master/download?job=website
-website:
-  stage: builds
-  image: $CI_REGISTRY_IMAGE/ci-almalinux-8:latest
-  needs:
-    - job: x86_64-almalinux-8-container
-      optional: true
-  before_script:
-    - *script_variables
+.website_job:
   script:
+    - *script_variables
     - meson setup build --werror -Dsystem=true || (cat build/meson-logs/meson-log.txt && exit 1)
     - DESTDIR=$(pwd)/install ninja -C build install-web
     - mv install/usr/share/doc/libvirt/html/ website
@@ -78,32 +86,67 @@ website:
     paths:
       - website
 
-
-codestyle:
-  stage: sanity_checks
-  image: $CI_REGISTRY_IMAGE/ci-opensuse-leap-153:latest
+website_prebuilt_env:
+  extends:
+    - .website_job
+    - .gitlab_native_build_job_prebuilt_env
   needs:
-    - job: x86_64-opensuse-leap-153-container
+    - job: x86_64-almalinux-8-container
       optional: true
-  before_script:
-    - *script_variables
+  variables:
+    NAME: almalinux-8
+
+website_local_env:
+  extends:
+    - .website_job
+    - .gitlab_native_build_job_local_env
+  variables:
+    IMAGE: docker.io/library/almalinux:8
+    NAME: almalinux-8
+
+
+.codestyle_job:
+  stage: sanity_checks
   script:
+    - *script_variables
     - meson setup build --werror || (cat build/meson-logs/meson-log.txt && exit 1)
     - ninja -C build libvirt-pot-dep
     - meson test -C build --suite syntax-check --no-rebuild --print-errorlogs
 
+codestyle_prebuilt_env:
+  extends:
+    - .codestyle_job
+    - .gitlab_native_build_job_prebuilt_env
+  needs:
+    - job: x86_64-opensuse-leap-153-container
+      optional: true
+  variables:
+    NAME: opensuse-leap-153
+
+codestyle_local_env:
+  extends:
+    - .codestyle_job
+    - .gitlab_native_build_job_local_env
+  variables:
+    IMAGE: registry.opensuse.org/opensuse/leap:15.3
+    NAME: opensuse-leap-153
+
 
 # This artifact published by this job is downloaded to push to Weblate
 # for translation usage:
 #    https://gitlab.com/libvirt/libvirt/-/jobs/artifacts/master/download?job=potfile
 potfile:
+  image: $CI_REGISTRY/$RUN_UPSTREAM_NAMESPACE/libvirt/ci-$NAME:latest
   stage: builds
-  image: $CI_REGISTRY_IMAGE/ci-almalinux-8:latest
+  before_script:
+    - cat /packages.txt
   needs:
     - job: x86_64-almalinux-8-container
       optional: true
   rules:
-    - if: "$CI_COMMIT_BRANCH == 'master'"
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+      when: on_success
+    - when: never
   before_script:
     - *script_variables
   script:
@@ -121,11 +164,13 @@ potfile:
 
 # Coverity job that is run only by schedules
 coverity:
-  image: $CI_REGISTRY_IMAGE/ci-almalinux-8:latest
+  image: $CI_REGISTRY/$RUN_UPSTREAM_NAMESPACE/libvirt/ci-$NAME:latest
+  stage: builds
   needs:
     - job: x86_64-almalinux-8-container
       optional: true
-  stage: builds
+  before_script:
+    - cat /packages.txt
   script:
     - curl https://scan.coverity.com/download/linux64 --form project=$COVERITY_SCAN_PROJECT_NAME --form token=$COVERITY_SCAN_TOKEN -o /tmp/cov-analysis-linux64.tgz
     - tar xfz /tmp/cov-analysis-linux64.tgz
@@ -133,5 +178,11 @@ coverity:
     - cov-analysis-linux64-*/bin/cov-build --dir cov-int meson compile -C build
     - tar cfz cov-int.tar.gz cov-int
     - curl https://scan.coverity.com/builds?project=$COVERITY_SCAN_PROJECT_NAME --form token=$COVERITY_SCAN_TOKEN --form email=$GITLAB_USER_EMAIL --form file=@cov-int.tar.gz --form version="$(git describe --tags)" --form description="$(git describe --tags) / $CI_COMMIT_TITLE / $CI_COMMIT_REF_NAME:$CI_PIPELINE_ID"
+  variables:
+    NAME: almalinux-8
   rules:
-    - if: "$CI_PIPELINE_SOURCE == 'schedule' && $COVERITY_SCAN_PROJECT_NAME && $COVERITY_SCAN_TOKEN"
+    - if: '$COVERITY_SCAN_PROJECT_NAME == null || $COVERITY_SCAN_TOKEN == null'
+      when: never
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH'
+      when: on_success
+    - when: never
diff --git a/ci/buildenv/almalinux-8.sh b/ci/buildenv/almalinux-8.sh
new file mode 100644
index 0000000000..086b4d946b
--- /dev/null
+++ b/ci/buildenv/almalinux-8.sh
@@ -0,0 +1,98 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    dnf update -y
+    dnf install 'dnf-command(config-manager)' -y
+    dnf config-manager --set-enabled -y powertools
+    dnf install -y centos-release-advanced-virtualization
+    dnf install -y epel-release
+    dnf install -y \
+        audit-libs-devel \
+        augeas \
+        bash-completion \
+        ca-certificates \
+        ccache \
+        clang \
+        cpp \
+        cyrus-sasl-devel \
+        device-mapper-devel \
+        diffutils \
+        dwarves \
+        ebtables \
+        firewalld-filesystem \
+        fuse-devel \
+        gcc \
+        gettext \
+        git \
+        glib2-devel \
+        glibc-devel \
+        glibc-langpack-en \
+        glusterfs-api-devel \
+        gnutls-devel \
+        grep \
+        iproute \
+        iproute-tc \
+        iptables \
+        iscsi-initiator-utils \
+        kmod \
+        libacl-devel \
+        libattr-devel \
+        libblkid-devel \
+        libcap-ng-devel \
+        libcurl-devel \
+        libiscsi-devel \
+        libnl3-devel \
+        libpcap-devel \
+        libpciaccess-devel \
+        librbd-devel \
+        libselinux-devel \
+        libssh-devel \
+        libssh2-devel \
+        libtirpc-devel \
+        libwsman-devel \
+        libxml2 \
+        libxml2-devel \
+        libxslt \
+        lvm2 \
+        make \
+        meson \
+        netcf-devel \
+        nfs-utils \
+        ninja-build \
+        numactl-devel \
+        numad \
+        parted-devel \
+        perl \
+        pkgconfig \
+        polkit \
+        python3 \
+        python3-docutils \
+        python3-flake8 \
+        qemu-img \
+        readline-devel \
+        rpcgen \
+        rpm-build \
+        sanlock-devel \
+        scrub \
+        sed \
+        systemd-devel \
+        systemd-rpm-macros \
+        systemtap-sdt-devel \
+        wireshark-devel \
+        yajl-devel
+    rpm -qa | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/buildenv/alpine-315.sh b/ci/buildenv/alpine-315.sh
new file mode 100644
index 0000000000..975914a7c2
--- /dev/null
+++ b/ci/buildenv/alpine-315.sh
@@ -0,0 +1,80 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    apk update
+    apk upgrade
+    apk add \
+        acl-dev \
+        attr-dev \
+        audit-dev \
+        augeas \
+        bash-completion \
+        ca-certificates \
+        ccache \
+        ceph-dev \
+        clang \
+        curl-dev \
+        cyrus-sasl-dev \
+        diffutils \
+        eudev-dev \
+        fuse-dev \
+        gcc \
+        gettext \
+        git \
+        glib-dev \
+        gnutls-dev \
+        grep \
+        iproute2 \
+        iptables \
+        kmod \
+        libcap-ng-dev \
+        libnl3-dev \
+        libpcap-dev \
+        libpciaccess-dev \
+        libselinux-dev \
+        libssh-dev \
+        libssh2-dev \
+        libtirpc-dev \
+        libxml2-dev \
+        libxml2-utils \
+        libxslt \
+        lvm2 \
+        lvm2-dev \
+        make \
+        meson \
+        musl-dev \
+        netcf-dev \
+        nfs-utils \
+        numactl-dev \
+        open-iscsi \
+        parted-dev \
+        perl \
+        pkgconf \
+        polkit \
+        py3-docutils \
+        py3-flake8 \
+        python3 \
+        qemu-img \
+        readline-dev \
+        samurai \
+        sed \
+        util-linux-dev \
+        wireshark-dev \
+        xen-dev \
+        yajl-dev
+    apk list | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/buildenv/alpine-edge.sh b/ci/buildenv/alpine-edge.sh
new file mode 100644
index 0000000000..e3f36ff8c6
--- /dev/null
+++ b/ci/buildenv/alpine-edge.sh
@@ -0,0 +1,81 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    apk update
+    apk upgrade
+    apk add \
+        acl-dev \
+        attr-dev \
+        audit-dev \
+        augeas \
+        bash-completion \
+        ca-certificates \
+        ccache \
+        ceph-dev \
+        clang \
+        curl-dev \
+        cyrus-sasl-dev \
+        diffutils \
+        eudev-dev \
+        fuse-dev \
+        gcc \
+        gettext \
+        git \
+        glib-dev \
+        gnutls-dev \
+        grep \
+        iproute2 \
+        iptables \
+        kmod \
+        libcap-ng-dev \
+        libnl3-dev \
+        libpcap-dev \
+        libpciaccess-dev \
+        libselinux-dev \
+        libssh-dev \
+        libssh2-dev \
+        libtirpc-dev \
+        libxml2-dev \
+        libxml2-utils \
+        libxslt \
+        lvm2 \
+        lvm2-dev \
+        make \
+        meson \
+        musl-dev \
+        netcf-dev \
+        nfs-utils \
+        numactl-dev \
+        open-iscsi \
+        parted-dev \
+        perl \
+        pkgconf \
+        polkit \
+        py3-docutils \
+        py3-flake8 \
+        python3 \
+        qemu-img \
+        readline-dev \
+        rpcgen \
+        samurai \
+        sed \
+        util-linux-dev \
+        wireshark-dev \
+        xen-dev \
+        yajl-dev
+    apk list | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/buildenv/centos-stream-8.sh b/ci/buildenv/centos-stream-8.sh
new file mode 100644
index 0000000000..6b3de502df
--- /dev/null
+++ b/ci/buildenv/centos-stream-8.sh
@@ -0,0 +1,99 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    dnf distro-sync -y
+    dnf install 'dnf-command(config-manager)' -y
+    dnf config-manager --set-enabled -y powertools
+    dnf install -y centos-release-advanced-virtualization
+    dnf install -y epel-release
+    dnf install -y epel-next-release
+    dnf install -y \
+        audit-libs-devel \
+        augeas \
+        bash-completion \
+        ca-certificates \
+        ccache \
+        clang \
+        cpp \
+        cyrus-sasl-devel \
+        device-mapper-devel \
+        diffutils \
+        dwarves \
+        ebtables \
+        firewalld-filesystem \
+        fuse-devel \
+        gcc \
+        gettext \
+        git \
+        glib2-devel \
+        glibc-devel \
+        glibc-langpack-en \
+        glusterfs-api-devel \
+        gnutls-devel \
+        grep \
+        iproute \
+        iproute-tc \
+        iptables \
+        iscsi-initiator-utils \
+        kmod \
+        libacl-devel \
+        libattr-devel \
+        libblkid-devel \
+        libcap-ng-devel \
+        libcurl-devel \
+        libiscsi-devel \
+        libnl3-devel \
+        libpcap-devel \
+        libpciaccess-devel \
+        librbd-devel \
+        libselinux-devel \
+        libssh-devel \
+        libssh2-devel \
+        libtirpc-devel \
+        libwsman-devel \
+        libxml2 \
+        libxml2-devel \
+        libxslt \
+        lvm2 \
+        make \
+        meson \
+        netcf-devel \
+        nfs-utils \
+        ninja-build \
+        numactl-devel \
+        numad \
+        parted-devel \
+        perl \
+        pkgconfig \
+        polkit \
+        python3 \
+        python3-docutils \
+        python3-flake8 \
+        qemu-img \
+        readline-devel \
+        rpcgen \
+        rpm-build \
+        sanlock-devel \
+        scrub \
+        sed \
+        systemd-devel \
+        systemd-rpm-macros \
+        systemtap-sdt-devel \
+        wireshark-devel \
+        yajl-devel
+    rpm -qa | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/buildenv/centos-stream-9.sh b/ci/buildenv/centos-stream-9.sh
new file mode 100644
index 0000000000..79d74d9b2b
--- /dev/null
+++ b/ci/buildenv/centos-stream-9.sh
@@ -0,0 +1,98 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    dnf distro-sync -y
+    dnf install 'dnf-command(config-manager)' -y
+    dnf config-manager --set-enabled -y crb
+    dnf install -y epel-release
+    dnf install -y epel-next-release
+    dnf install -y \
+        audit-libs-devel \
+        augeas \
+        bash-completion \
+        ca-certificates \
+        ccache \
+        clang \
+        cpp \
+        cyrus-sasl-devel \
+        device-mapper-devel \
+        diffutils \
+        dwarves \
+        ebtables \
+        firewalld-filesystem \
+        fuse-devel \
+        gcc \
+        gettext \
+        git \
+        glib2-devel \
+        glibc-devel \
+        glibc-langpack-en \
+        gnutls-devel \
+        grep \
+        iproute \
+        iproute-tc \
+        iptables \
+        iscsi-initiator-utils \
+        kmod \
+        libacl-devel \
+        libattr-devel \
+        libblkid-devel \
+        libcap-ng-devel \
+        libcurl-devel \
+        libnl3-devel \
+        libpcap-devel \
+        libpciaccess-devel \
+        librbd-devel \
+        libselinux-devel \
+        libssh-devel \
+        libssh2-devel \
+        libtirpc-devel \
+        libwsman-devel \
+        libxml2 \
+        libxml2-devel \
+        libxslt \
+        lvm2 \
+        make \
+        meson \
+        nfs-utils \
+        ninja-build \
+        numactl-devel \
+        numad \
+        parted-devel \
+        perl-base \
+        pkgconfig \
+        polkit \
+        python3 \
+        python3-docutils \
+        python3-pip \
+        python3-setuptools \
+        python3-wheel \
+        qemu-img \
+        readline-devel \
+        rpcgen \
+        rpm-build \
+        sanlock-devel \
+        scrub \
+        sed \
+        systemd-devel \
+        systemd-rpm-macros \
+        systemtap-sdt-devel \
+        wireshark-devel \
+        yajl-devel
+    rpm -qa | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+    /usr/bin/pip3 install flake8
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/buildenv/debian-11-cross-aarch64.sh b/ci/buildenv/debian-11-cross-aarch64.sh
new file mode 100644
index 0000000000..d33d95d965
--- /dev/null
+++ b/ci/buildenv/debian-11-cross-aarch64.sh
@@ -0,0 +1,115 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture arm64
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-aarch64-linux-gnu \
+            libacl1-dev:arm64 \
+            libapparmor-dev:arm64 \
+            libattr1-dev:arm64 \
+            libaudit-dev:arm64 \
+            libblkid-dev:arm64 \
+            libc6-dev:arm64 \
+            libcap-ng-dev:arm64 \
+            libcurl4-gnutls-dev:arm64 \
+            libdevmapper-dev:arm64 \
+            libfuse-dev:arm64 \
+            libglib2.0-dev:arm64 \
+            libglusterfs-dev:arm64 \
+            libgnutls28-dev:arm64 \
+            libiscsi-dev:arm64 \
+            libnl-3-dev:arm64 \
+            libnl-route-3-dev:arm64 \
+            libnuma-dev:arm64 \
+            libparted-dev:arm64 \
+            libpcap0.8-dev:arm64 \
+            libpciaccess-dev:arm64 \
+            librbd-dev:arm64 \
+            libreadline-dev:arm64 \
+            libsanlock-dev:arm64 \
+            libsasl2-dev:arm64 \
+            libselinux1-dev:arm64 \
+            libssh-gcrypt-dev:arm64 \
+            libssh2-1-dev:arm64 \
+            libtirpc-dev:arm64 \
+            libudev-dev:arm64 \
+            libxen-dev:arm64 \
+            libxml2-dev:arm64 \
+            libyajl-dev:arm64 \
+            systemtap-sdt-dev:arm64
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/aarch64-linux-gnu-gcc'\n\
+ar = '/usr/bin/aarch64-linux-gnu-gcc-ar'\n\
+strip = '/usr/bin/aarch64-linux-gnu-strip'\n\
+pkgconfig = '/usr/bin/aarch64-linux-gnu-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'aarch64'\n\
+cpu = 'aarch64'\n\
+endian = 'little'" > /usr/local/share/meson/cross/aarch64-linux-gnu
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/aarch64-linux-gnu-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/aarch64-linux-gnu-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="aarch64-linux-gnu"
+export MESON_OPTS="--cross-file=aarch64-linux-gnu"
diff --git a/ci/buildenv/debian-11-cross-armv6l.sh b/ci/buildenv/debian-11-cross-armv6l.sh
new file mode 100644
index 0000000000..00b978b946
--- /dev/null
+++ b/ci/buildenv/debian-11-cross-armv6l.sh
@@ -0,0 +1,114 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture armel
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-arm-linux-gnueabi \
+            libacl1-dev:armel \
+            libapparmor-dev:armel \
+            libattr1-dev:armel \
+            libaudit-dev:armel \
+            libblkid-dev:armel \
+            libc6-dev:armel \
+            libcap-ng-dev:armel \
+            libcurl4-gnutls-dev:armel \
+            libdevmapper-dev:armel \
+            libfuse-dev:armel \
+            libglib2.0-dev:armel \
+            libglusterfs-dev:armel \
+            libgnutls28-dev:armel \
+            libiscsi-dev:armel \
+            libnl-3-dev:armel \
+            libnl-route-3-dev:armel \
+            libnuma-dev:armel \
+            libparted-dev:armel \
+            libpcap0.8-dev:armel \
+            libpciaccess-dev:armel \
+            librbd-dev:armel \
+            libreadline-dev:armel \
+            libsanlock-dev:armel \
+            libsasl2-dev:armel \
+            libselinux1-dev:armel \
+            libssh-gcrypt-dev:armel \
+            libssh2-1-dev:armel \
+            libtirpc-dev:armel \
+            libudev-dev:armel \
+            libxml2-dev:armel \
+            libyajl-dev:armel \
+            systemtap-sdt-dev:armel
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/arm-linux-gnueabi-gcc'\n\
+ar = '/usr/bin/arm-linux-gnueabi-gcc-ar'\n\
+strip = '/usr/bin/arm-linux-gnueabi-strip'\n\
+pkgconfig = '/usr/bin/arm-linux-gnueabi-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'arm'\n\
+cpu = 'arm'\n\
+endian = 'little'" > /usr/local/share/meson/cross/arm-linux-gnueabi
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/arm-linux-gnueabi-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/arm-linux-gnueabi-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="arm-linux-gnueabi"
+export MESON_OPTS="--cross-file=arm-linux-gnueabi"
diff --git a/ci/buildenv/debian-11-cross-armv7l.sh b/ci/buildenv/debian-11-cross-armv7l.sh
new file mode 100644
index 0000000000..78f596a96f
--- /dev/null
+++ b/ci/buildenv/debian-11-cross-armv7l.sh
@@ -0,0 +1,115 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture armhf
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-arm-linux-gnueabihf \
+            libacl1-dev:armhf \
+            libapparmor-dev:armhf \
+            libattr1-dev:armhf \
+            libaudit-dev:armhf \
+            libblkid-dev:armhf \
+            libc6-dev:armhf \
+            libcap-ng-dev:armhf \
+            libcurl4-gnutls-dev:armhf \
+            libdevmapper-dev:armhf \
+            libfuse-dev:armhf \
+            libglib2.0-dev:armhf \
+            libglusterfs-dev:armhf \
+            libgnutls28-dev:armhf \
+            libiscsi-dev:armhf \
+            libnl-3-dev:armhf \
+            libnl-route-3-dev:armhf \
+            libnuma-dev:armhf \
+            libparted-dev:armhf \
+            libpcap0.8-dev:armhf \
+            libpciaccess-dev:armhf \
+            librbd-dev:armhf \
+            libreadline-dev:armhf \
+            libsanlock-dev:armhf \
+            libsasl2-dev:armhf \
+            libselinux1-dev:armhf \
+            libssh-gcrypt-dev:armhf \
+            libssh2-1-dev:armhf \
+            libtirpc-dev:armhf \
+            libudev-dev:armhf \
+            libxen-dev:armhf \
+            libxml2-dev:armhf \
+            libyajl-dev:armhf \
+            systemtap-sdt-dev:armhf
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/arm-linux-gnueabihf-gcc'\n\
+ar = '/usr/bin/arm-linux-gnueabihf-gcc-ar'\n\
+strip = '/usr/bin/arm-linux-gnueabihf-strip'\n\
+pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'arm'\n\
+cpu = 'armhf'\n\
+endian = 'little'" > /usr/local/share/meson/cross/arm-linux-gnueabihf
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/arm-linux-gnueabihf-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/arm-linux-gnueabihf-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="arm-linux-gnueabihf"
+export MESON_OPTS="--cross-file=arm-linux-gnueabihf"
diff --git a/ci/buildenv/debian-11-cross-i686.sh b/ci/buildenv/debian-11-cross-i686.sh
new file mode 100644
index 0000000000..0c08bb13a3
--- /dev/null
+++ b/ci/buildenv/debian-11-cross-i686.sh
@@ -0,0 +1,114 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture i386
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-i686-linux-gnu \
+            libacl1-dev:i386 \
+            libapparmor-dev:i386 \
+            libattr1-dev:i386 \
+            libaudit-dev:i386 \
+            libblkid-dev:i386 \
+            libc6-dev:i386 \
+            libcap-ng-dev:i386 \
+            libcurl4-gnutls-dev:i386 \
+            libdevmapper-dev:i386 \
+            libfuse-dev:i386 \
+            libglib2.0-dev:i386 \
+            libglusterfs-dev:i386 \
+            libgnutls28-dev:i386 \
+            libiscsi-dev:i386 \
+            libnl-3-dev:i386 \
+            libnl-route-3-dev:i386 \
+            libnuma-dev:i386 \
+            libparted-dev:i386 \
+            libpcap0.8-dev:i386 \
+            libpciaccess-dev:i386 \
+            librbd-dev:i386 \
+            libreadline-dev:i386 \
+            libsanlock-dev:i386 \
+            libsasl2-dev:i386 \
+            libselinux1-dev:i386 \
+            libssh-gcrypt-dev:i386 \
+            libssh2-1-dev:i386 \
+            libtirpc-dev:i386 \
+            libudev-dev:i386 \
+            libxml2-dev:i386 \
+            libyajl-dev:i386 \
+            systemtap-sdt-dev:i386
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/i686-linux-gnu-gcc'\n\
+ar = '/usr/bin/i686-linux-gnu-gcc-ar'\n\
+strip = '/usr/bin/i686-linux-gnu-strip'\n\
+pkgconfig = '/usr/bin/i686-linux-gnu-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'x86'\n\
+cpu = 'i686'\n\
+endian = 'little'" > /usr/local/share/meson/cross/i686-linux-gnu
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/i686-linux-gnu-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/i686-linux-gnu-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="i686-linux-gnu"
+export MESON_OPTS="--cross-file=i686-linux-gnu"
diff --git a/ci/buildenv/debian-11-cross-mips64el.sh b/ci/buildenv/debian-11-cross-mips64el.sh
new file mode 100644
index 0000000000..386b67ee08
--- /dev/null
+++ b/ci/buildenv/debian-11-cross-mips64el.sh
@@ -0,0 +1,114 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture mips64el
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-mips64el-linux-gnuabi64 \
+            libacl1-dev:mips64el \
+            libapparmor-dev:mips64el \
+            libattr1-dev:mips64el \
+            libaudit-dev:mips64el \
+            libblkid-dev:mips64el \
+            libc6-dev:mips64el \
+            libcap-ng-dev:mips64el \
+            libcurl4-gnutls-dev:mips64el \
+            libdevmapper-dev:mips64el \
+            libfuse-dev:mips64el \
+            libglib2.0-dev:mips64el \
+            libglusterfs-dev:mips64el \
+            libgnutls28-dev:mips64el \
+            libiscsi-dev:mips64el \
+            libnl-3-dev:mips64el \
+            libnl-route-3-dev:mips64el \
+            libnuma-dev:mips64el \
+            libparted-dev:mips64el \
+            libpcap0.8-dev:mips64el \
+            libpciaccess-dev:mips64el \
+            librbd-dev:mips64el \
+            libreadline-dev:mips64el \
+            libsanlock-dev:mips64el \
+            libsasl2-dev:mips64el \
+            libselinux1-dev:mips64el \
+            libssh-gcrypt-dev:mips64el \
+            libssh2-1-dev:mips64el \
+            libtirpc-dev:mips64el \
+            libudev-dev:mips64el \
+            libxml2-dev:mips64el \
+            libyajl-dev:mips64el \
+            systemtap-sdt-dev:mips64el
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/mips64el-linux-gnuabi64-gcc'\n\
+ar = '/usr/bin/mips64el-linux-gnuabi64-gcc-ar'\n\
+strip = '/usr/bin/mips64el-linux-gnuabi64-strip'\n\
+pkgconfig = '/usr/bin/mips64el-linux-gnuabi64-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'mips64'\n\
+cpu = 'mips64el'\n\
+endian = 'little'" > /usr/local/share/meson/cross/mips64el-linux-gnuabi64
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/mips64el-linux-gnuabi64-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/mips64el-linux-gnuabi64-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="mips64el-linux-gnuabi64"
+export MESON_OPTS="--cross-file=mips64el-linux-gnuabi64"
diff --git a/ci/buildenv/debian-11-cross-mipsel.sh b/ci/buildenv/debian-11-cross-mipsel.sh
new file mode 100644
index 0000000000..00138feee3
--- /dev/null
+++ b/ci/buildenv/debian-11-cross-mipsel.sh
@@ -0,0 +1,114 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture mipsel
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-mipsel-linux-gnu \
+            libacl1-dev:mipsel \
+            libapparmor-dev:mipsel \
+            libattr1-dev:mipsel \
+            libaudit-dev:mipsel \
+            libblkid-dev:mipsel \
+            libc6-dev:mipsel \
+            libcap-ng-dev:mipsel \
+            libcurl4-gnutls-dev:mipsel \
+            libdevmapper-dev:mipsel \
+            libfuse-dev:mipsel \
+            libglib2.0-dev:mipsel \
+            libglusterfs-dev:mipsel \
+            libgnutls28-dev:mipsel \
+            libiscsi-dev:mipsel \
+            libnl-3-dev:mipsel \
+            libnl-route-3-dev:mipsel \
+            libnuma-dev:mipsel \
+            libparted-dev:mipsel \
+            libpcap0.8-dev:mipsel \
+            libpciaccess-dev:mipsel \
+            librbd-dev:mipsel \
+            libreadline-dev:mipsel \
+            libsanlock-dev:mipsel \
+            libsasl2-dev:mipsel \
+            libselinux1-dev:mipsel \
+            libssh-gcrypt-dev:mipsel \
+            libssh2-1-dev:mipsel \
+            libtirpc-dev:mipsel \
+            libudev-dev:mipsel \
+            libxml2-dev:mipsel \
+            libyajl-dev:mipsel \
+            systemtap-sdt-dev:mipsel
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/mipsel-linux-gnu-gcc'\n\
+ar = '/usr/bin/mipsel-linux-gnu-gcc-ar'\n\
+strip = '/usr/bin/mipsel-linux-gnu-strip'\n\
+pkgconfig = '/usr/bin/mipsel-linux-gnu-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'mips'\n\
+cpu = 'mipsel'\n\
+endian = 'little'" > /usr/local/share/meson/cross/mipsel-linux-gnu
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/mipsel-linux-gnu-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/mipsel-linux-gnu-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="mipsel-linux-gnu"
+export MESON_OPTS="--cross-file=mipsel-linux-gnu"
diff --git a/ci/buildenv/debian-11-cross-ppc64le.sh b/ci/buildenv/debian-11-cross-ppc64le.sh
new file mode 100644
index 0000000000..30c8160f73
--- /dev/null
+++ b/ci/buildenv/debian-11-cross-ppc64le.sh
@@ -0,0 +1,114 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture ppc64el
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-powerpc64le-linux-gnu \
+            libacl1-dev:ppc64el \
+            libapparmor-dev:ppc64el \
+            libattr1-dev:ppc64el \
+            libaudit-dev:ppc64el \
+            libblkid-dev:ppc64el \
+            libc6-dev:ppc64el \
+            libcap-ng-dev:ppc64el \
+            libcurl4-gnutls-dev:ppc64el \
+            libdevmapper-dev:ppc64el \
+            libfuse-dev:ppc64el \
+            libglib2.0-dev:ppc64el \
+            libglusterfs-dev:ppc64el \
+            libgnutls28-dev:ppc64el \
+            libiscsi-dev:ppc64el \
+            libnl-3-dev:ppc64el \
+            libnl-route-3-dev:ppc64el \
+            libnuma-dev:ppc64el \
+            libparted-dev:ppc64el \
+            libpcap0.8-dev:ppc64el \
+            libpciaccess-dev:ppc64el \
+            librbd-dev:ppc64el \
+            libreadline-dev:ppc64el \
+            libsanlock-dev:ppc64el \
+            libsasl2-dev:ppc64el \
+            libselinux1-dev:ppc64el \
+            libssh-gcrypt-dev:ppc64el \
+            libssh2-1-dev:ppc64el \
+            libtirpc-dev:ppc64el \
+            libudev-dev:ppc64el \
+            libxml2-dev:ppc64el \
+            libyajl-dev:ppc64el \
+            systemtap-sdt-dev:ppc64el
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/powerpc64le-linux-gnu-gcc'\n\
+ar = '/usr/bin/powerpc64le-linux-gnu-gcc-ar'\n\
+strip = '/usr/bin/powerpc64le-linux-gnu-strip'\n\
+pkgconfig = '/usr/bin/powerpc64le-linux-gnu-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'ppc64'\n\
+cpu = 'powerpc64le'\n\
+endian = 'little'" > /usr/local/share/meson/cross/powerpc64le-linux-gnu
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/powerpc64le-linux-gnu-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/powerpc64le-linux-gnu-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="powerpc64le-linux-gnu"
+export MESON_OPTS="--cross-file=powerpc64le-linux-gnu"
diff --git a/ci/buildenv/debian-11-cross-s390x.sh b/ci/buildenv/debian-11-cross-s390x.sh
new file mode 100644
index 0000000000..1a4a5cf5c3
--- /dev/null
+++ b/ci/buildenv/debian-11-cross-s390x.sh
@@ -0,0 +1,114 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture s390x
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-s390x-linux-gnu \
+            libacl1-dev:s390x \
+            libapparmor-dev:s390x \
+            libattr1-dev:s390x \
+            libaudit-dev:s390x \
+            libblkid-dev:s390x \
+            libc6-dev:s390x \
+            libcap-ng-dev:s390x \
+            libcurl4-gnutls-dev:s390x \
+            libdevmapper-dev:s390x \
+            libfuse-dev:s390x \
+            libglib2.0-dev:s390x \
+            libglusterfs-dev:s390x \
+            libgnutls28-dev:s390x \
+            libiscsi-dev:s390x \
+            libnl-3-dev:s390x \
+            libnl-route-3-dev:s390x \
+            libnuma-dev:s390x \
+            libparted-dev:s390x \
+            libpcap0.8-dev:s390x \
+            libpciaccess-dev:s390x \
+            librbd-dev:s390x \
+            libreadline-dev:s390x \
+            libsanlock-dev:s390x \
+            libsasl2-dev:s390x \
+            libselinux1-dev:s390x \
+            libssh-gcrypt-dev:s390x \
+            libssh2-1-dev:s390x \
+            libtirpc-dev:s390x \
+            libudev-dev:s390x \
+            libxml2-dev:s390x \
+            libyajl-dev:s390x \
+            systemtap-sdt-dev:s390x
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/s390x-linux-gnu-gcc'\n\
+ar = '/usr/bin/s390x-linux-gnu-gcc-ar'\n\
+strip = '/usr/bin/s390x-linux-gnu-strip'\n\
+pkgconfig = '/usr/bin/s390x-linux-gnu-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 's390x'\n\
+cpu = 's390x'\n\
+endian = 'big'" > /usr/local/share/meson/cross/s390x-linux-gnu
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/s390x-linux-gnu-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/s390x-linux-gnu-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="s390x-linux-gnu"
+export MESON_OPTS="--cross-file=s390x-linux-gnu"
diff --git a/ci/buildenv/debian-11.sh b/ci/buildenv/debian-11.sh
new file mode 100644
index 0000000000..fce0b59f5d
--- /dev/null
+++ b/ci/buildenv/debian-11.sh
@@ -0,0 +1,98 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            clang \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gcc \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libacl1-dev \
+            libapparmor-dev \
+            libattr1-dev \
+            libaudit-dev \
+            libblkid-dev \
+            libc-dev-bin \
+            libc6-dev \
+            libcap-ng-dev \
+            libcurl4-gnutls-dev \
+            libdevmapper-dev \
+            libfuse-dev \
+            libglib2.0-dev \
+            libglusterfs-dev \
+            libgnutls28-dev \
+            libiscsi-dev \
+            libnetcf-dev \
+            libnl-3-dev \
+            libnl-route-3-dev \
+            libnuma-dev \
+            libparted-dev \
+            libpcap0.8-dev \
+            libpciaccess-dev \
+            librbd-dev \
+            libreadline-dev \
+            libsanlock-dev \
+            libsasl2-dev \
+            libselinux1-dev \
+            libssh-gcrypt-dev \
+            libssh2-1-dev \
+            libtirpc-dev \
+            libudev-dev \
+            libxen-dev \
+            libxml2-dev \
+            libxml2-utils \
+            libyajl-dev \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            systemtap-sdt-dev \
+            wireshark-dev \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/buildenv/debian-sid-cross-aarch64.sh b/ci/buildenv/debian-sid-cross-aarch64.sh
new file mode 100644
index 0000000000..d33d95d965
--- /dev/null
+++ b/ci/buildenv/debian-sid-cross-aarch64.sh
@@ -0,0 +1,115 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture arm64
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-aarch64-linux-gnu \
+            libacl1-dev:arm64 \
+            libapparmor-dev:arm64 \
+            libattr1-dev:arm64 \
+            libaudit-dev:arm64 \
+            libblkid-dev:arm64 \
+            libc6-dev:arm64 \
+            libcap-ng-dev:arm64 \
+            libcurl4-gnutls-dev:arm64 \
+            libdevmapper-dev:arm64 \
+            libfuse-dev:arm64 \
+            libglib2.0-dev:arm64 \
+            libglusterfs-dev:arm64 \
+            libgnutls28-dev:arm64 \
+            libiscsi-dev:arm64 \
+            libnl-3-dev:arm64 \
+            libnl-route-3-dev:arm64 \
+            libnuma-dev:arm64 \
+            libparted-dev:arm64 \
+            libpcap0.8-dev:arm64 \
+            libpciaccess-dev:arm64 \
+            librbd-dev:arm64 \
+            libreadline-dev:arm64 \
+            libsanlock-dev:arm64 \
+            libsasl2-dev:arm64 \
+            libselinux1-dev:arm64 \
+            libssh-gcrypt-dev:arm64 \
+            libssh2-1-dev:arm64 \
+            libtirpc-dev:arm64 \
+            libudev-dev:arm64 \
+            libxen-dev:arm64 \
+            libxml2-dev:arm64 \
+            libyajl-dev:arm64 \
+            systemtap-sdt-dev:arm64
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/aarch64-linux-gnu-gcc'\n\
+ar = '/usr/bin/aarch64-linux-gnu-gcc-ar'\n\
+strip = '/usr/bin/aarch64-linux-gnu-strip'\n\
+pkgconfig = '/usr/bin/aarch64-linux-gnu-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'aarch64'\n\
+cpu = 'aarch64'\n\
+endian = 'little'" > /usr/local/share/meson/cross/aarch64-linux-gnu
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/aarch64-linux-gnu-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/aarch64-linux-gnu-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="aarch64-linux-gnu"
+export MESON_OPTS="--cross-file=aarch64-linux-gnu"
diff --git a/ci/buildenv/debian-sid-cross-armv6l.sh b/ci/buildenv/debian-sid-cross-armv6l.sh
new file mode 100644
index 0000000000..00b978b946
--- /dev/null
+++ b/ci/buildenv/debian-sid-cross-armv6l.sh
@@ -0,0 +1,114 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture armel
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-arm-linux-gnueabi \
+            libacl1-dev:armel \
+            libapparmor-dev:armel \
+            libattr1-dev:armel \
+            libaudit-dev:armel \
+            libblkid-dev:armel \
+            libc6-dev:armel \
+            libcap-ng-dev:armel \
+            libcurl4-gnutls-dev:armel \
+            libdevmapper-dev:armel \
+            libfuse-dev:armel \
+            libglib2.0-dev:armel \
+            libglusterfs-dev:armel \
+            libgnutls28-dev:armel \
+            libiscsi-dev:armel \
+            libnl-3-dev:armel \
+            libnl-route-3-dev:armel \
+            libnuma-dev:armel \
+            libparted-dev:armel \
+            libpcap0.8-dev:armel \
+            libpciaccess-dev:armel \
+            librbd-dev:armel \
+            libreadline-dev:armel \
+            libsanlock-dev:armel \
+            libsasl2-dev:armel \
+            libselinux1-dev:armel \
+            libssh-gcrypt-dev:armel \
+            libssh2-1-dev:armel \
+            libtirpc-dev:armel \
+            libudev-dev:armel \
+            libxml2-dev:armel \
+            libyajl-dev:armel \
+            systemtap-sdt-dev:armel
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/arm-linux-gnueabi-gcc'\n\
+ar = '/usr/bin/arm-linux-gnueabi-gcc-ar'\n\
+strip = '/usr/bin/arm-linux-gnueabi-strip'\n\
+pkgconfig = '/usr/bin/arm-linux-gnueabi-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'arm'\n\
+cpu = 'arm'\n\
+endian = 'little'" > /usr/local/share/meson/cross/arm-linux-gnueabi
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/arm-linux-gnueabi-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/arm-linux-gnueabi-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="arm-linux-gnueabi"
+export MESON_OPTS="--cross-file=arm-linux-gnueabi"
diff --git a/ci/buildenv/debian-sid-cross-armv7l.sh b/ci/buildenv/debian-sid-cross-armv7l.sh
new file mode 100644
index 0000000000..78f596a96f
--- /dev/null
+++ b/ci/buildenv/debian-sid-cross-armv7l.sh
@@ -0,0 +1,115 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture armhf
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-arm-linux-gnueabihf \
+            libacl1-dev:armhf \
+            libapparmor-dev:armhf \
+            libattr1-dev:armhf \
+            libaudit-dev:armhf \
+            libblkid-dev:armhf \
+            libc6-dev:armhf \
+            libcap-ng-dev:armhf \
+            libcurl4-gnutls-dev:armhf \
+            libdevmapper-dev:armhf \
+            libfuse-dev:armhf \
+            libglib2.0-dev:armhf \
+            libglusterfs-dev:armhf \
+            libgnutls28-dev:armhf \
+            libiscsi-dev:armhf \
+            libnl-3-dev:armhf \
+            libnl-route-3-dev:armhf \
+            libnuma-dev:armhf \
+            libparted-dev:armhf \
+            libpcap0.8-dev:armhf \
+            libpciaccess-dev:armhf \
+            librbd-dev:armhf \
+            libreadline-dev:armhf \
+            libsanlock-dev:armhf \
+            libsasl2-dev:armhf \
+            libselinux1-dev:armhf \
+            libssh-gcrypt-dev:armhf \
+            libssh2-1-dev:armhf \
+            libtirpc-dev:armhf \
+            libudev-dev:armhf \
+            libxen-dev:armhf \
+            libxml2-dev:armhf \
+            libyajl-dev:armhf \
+            systemtap-sdt-dev:armhf
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/arm-linux-gnueabihf-gcc'\n\
+ar = '/usr/bin/arm-linux-gnueabihf-gcc-ar'\n\
+strip = '/usr/bin/arm-linux-gnueabihf-strip'\n\
+pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'arm'\n\
+cpu = 'armhf'\n\
+endian = 'little'" > /usr/local/share/meson/cross/arm-linux-gnueabihf
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/arm-linux-gnueabihf-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/arm-linux-gnueabihf-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="arm-linux-gnueabihf"
+export MESON_OPTS="--cross-file=arm-linux-gnueabihf"
diff --git a/ci/buildenv/debian-sid-cross-i686.sh b/ci/buildenv/debian-sid-cross-i686.sh
new file mode 100644
index 0000000000..0c08bb13a3
--- /dev/null
+++ b/ci/buildenv/debian-sid-cross-i686.sh
@@ -0,0 +1,114 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture i386
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-i686-linux-gnu \
+            libacl1-dev:i386 \
+            libapparmor-dev:i386 \
+            libattr1-dev:i386 \
+            libaudit-dev:i386 \
+            libblkid-dev:i386 \
+            libc6-dev:i386 \
+            libcap-ng-dev:i386 \
+            libcurl4-gnutls-dev:i386 \
+            libdevmapper-dev:i386 \
+            libfuse-dev:i386 \
+            libglib2.0-dev:i386 \
+            libglusterfs-dev:i386 \
+            libgnutls28-dev:i386 \
+            libiscsi-dev:i386 \
+            libnl-3-dev:i386 \
+            libnl-route-3-dev:i386 \
+            libnuma-dev:i386 \
+            libparted-dev:i386 \
+            libpcap0.8-dev:i386 \
+            libpciaccess-dev:i386 \
+            librbd-dev:i386 \
+            libreadline-dev:i386 \
+            libsanlock-dev:i386 \
+            libsasl2-dev:i386 \
+            libselinux1-dev:i386 \
+            libssh-gcrypt-dev:i386 \
+            libssh2-1-dev:i386 \
+            libtirpc-dev:i386 \
+            libudev-dev:i386 \
+            libxml2-dev:i386 \
+            libyajl-dev:i386 \
+            systemtap-sdt-dev:i386
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/i686-linux-gnu-gcc'\n\
+ar = '/usr/bin/i686-linux-gnu-gcc-ar'\n\
+strip = '/usr/bin/i686-linux-gnu-strip'\n\
+pkgconfig = '/usr/bin/i686-linux-gnu-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'x86'\n\
+cpu = 'i686'\n\
+endian = 'little'" > /usr/local/share/meson/cross/i686-linux-gnu
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/i686-linux-gnu-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/i686-linux-gnu-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="i686-linux-gnu"
+export MESON_OPTS="--cross-file=i686-linux-gnu"
diff --git a/ci/buildenv/debian-sid-cross-mips64el.sh b/ci/buildenv/debian-sid-cross-mips64el.sh
new file mode 100644
index 0000000000..386b67ee08
--- /dev/null
+++ b/ci/buildenv/debian-sid-cross-mips64el.sh
@@ -0,0 +1,114 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture mips64el
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-mips64el-linux-gnuabi64 \
+            libacl1-dev:mips64el \
+            libapparmor-dev:mips64el \
+            libattr1-dev:mips64el \
+            libaudit-dev:mips64el \
+            libblkid-dev:mips64el \
+            libc6-dev:mips64el \
+            libcap-ng-dev:mips64el \
+            libcurl4-gnutls-dev:mips64el \
+            libdevmapper-dev:mips64el \
+            libfuse-dev:mips64el \
+            libglib2.0-dev:mips64el \
+            libglusterfs-dev:mips64el \
+            libgnutls28-dev:mips64el \
+            libiscsi-dev:mips64el \
+            libnl-3-dev:mips64el \
+            libnl-route-3-dev:mips64el \
+            libnuma-dev:mips64el \
+            libparted-dev:mips64el \
+            libpcap0.8-dev:mips64el \
+            libpciaccess-dev:mips64el \
+            librbd-dev:mips64el \
+            libreadline-dev:mips64el \
+            libsanlock-dev:mips64el \
+            libsasl2-dev:mips64el \
+            libselinux1-dev:mips64el \
+            libssh-gcrypt-dev:mips64el \
+            libssh2-1-dev:mips64el \
+            libtirpc-dev:mips64el \
+            libudev-dev:mips64el \
+            libxml2-dev:mips64el \
+            libyajl-dev:mips64el \
+            systemtap-sdt-dev:mips64el
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/mips64el-linux-gnuabi64-gcc'\n\
+ar = '/usr/bin/mips64el-linux-gnuabi64-gcc-ar'\n\
+strip = '/usr/bin/mips64el-linux-gnuabi64-strip'\n\
+pkgconfig = '/usr/bin/mips64el-linux-gnuabi64-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'mips64'\n\
+cpu = 'mips64el'\n\
+endian = 'little'" > /usr/local/share/meson/cross/mips64el-linux-gnuabi64
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/mips64el-linux-gnuabi64-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/mips64el-linux-gnuabi64-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="mips64el-linux-gnuabi64"
+export MESON_OPTS="--cross-file=mips64el-linux-gnuabi64"
diff --git a/ci/buildenv/debian-sid-cross-mipsel.sh b/ci/buildenv/debian-sid-cross-mipsel.sh
new file mode 100644
index 0000000000..00138feee3
--- /dev/null
+++ b/ci/buildenv/debian-sid-cross-mipsel.sh
@@ -0,0 +1,114 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture mipsel
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-mipsel-linux-gnu \
+            libacl1-dev:mipsel \
+            libapparmor-dev:mipsel \
+            libattr1-dev:mipsel \
+            libaudit-dev:mipsel \
+            libblkid-dev:mipsel \
+            libc6-dev:mipsel \
+            libcap-ng-dev:mipsel \
+            libcurl4-gnutls-dev:mipsel \
+            libdevmapper-dev:mipsel \
+            libfuse-dev:mipsel \
+            libglib2.0-dev:mipsel \
+            libglusterfs-dev:mipsel \
+            libgnutls28-dev:mipsel \
+            libiscsi-dev:mipsel \
+            libnl-3-dev:mipsel \
+            libnl-route-3-dev:mipsel \
+            libnuma-dev:mipsel \
+            libparted-dev:mipsel \
+            libpcap0.8-dev:mipsel \
+            libpciaccess-dev:mipsel \
+            librbd-dev:mipsel \
+            libreadline-dev:mipsel \
+            libsanlock-dev:mipsel \
+            libsasl2-dev:mipsel \
+            libselinux1-dev:mipsel \
+            libssh-gcrypt-dev:mipsel \
+            libssh2-1-dev:mipsel \
+            libtirpc-dev:mipsel \
+            libudev-dev:mipsel \
+            libxml2-dev:mipsel \
+            libyajl-dev:mipsel \
+            systemtap-sdt-dev:mipsel
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/mipsel-linux-gnu-gcc'\n\
+ar = '/usr/bin/mipsel-linux-gnu-gcc-ar'\n\
+strip = '/usr/bin/mipsel-linux-gnu-strip'\n\
+pkgconfig = '/usr/bin/mipsel-linux-gnu-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'mips'\n\
+cpu = 'mipsel'\n\
+endian = 'little'" > /usr/local/share/meson/cross/mipsel-linux-gnu
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/mipsel-linux-gnu-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/mipsel-linux-gnu-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="mipsel-linux-gnu"
+export MESON_OPTS="--cross-file=mipsel-linux-gnu"
diff --git a/ci/buildenv/debian-sid-cross-ppc64le.sh b/ci/buildenv/debian-sid-cross-ppc64le.sh
new file mode 100644
index 0000000000..30c8160f73
--- /dev/null
+++ b/ci/buildenv/debian-sid-cross-ppc64le.sh
@@ -0,0 +1,114 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture ppc64el
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-powerpc64le-linux-gnu \
+            libacl1-dev:ppc64el \
+            libapparmor-dev:ppc64el \
+            libattr1-dev:ppc64el \
+            libaudit-dev:ppc64el \
+            libblkid-dev:ppc64el \
+            libc6-dev:ppc64el \
+            libcap-ng-dev:ppc64el \
+            libcurl4-gnutls-dev:ppc64el \
+            libdevmapper-dev:ppc64el \
+            libfuse-dev:ppc64el \
+            libglib2.0-dev:ppc64el \
+            libglusterfs-dev:ppc64el \
+            libgnutls28-dev:ppc64el \
+            libiscsi-dev:ppc64el \
+            libnl-3-dev:ppc64el \
+            libnl-route-3-dev:ppc64el \
+            libnuma-dev:ppc64el \
+            libparted-dev:ppc64el \
+            libpcap0.8-dev:ppc64el \
+            libpciaccess-dev:ppc64el \
+            librbd-dev:ppc64el \
+            libreadline-dev:ppc64el \
+            libsanlock-dev:ppc64el \
+            libsasl2-dev:ppc64el \
+            libselinux1-dev:ppc64el \
+            libssh-gcrypt-dev:ppc64el \
+            libssh2-1-dev:ppc64el \
+            libtirpc-dev:ppc64el \
+            libudev-dev:ppc64el \
+            libxml2-dev:ppc64el \
+            libyajl-dev:ppc64el \
+            systemtap-sdt-dev:ppc64el
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/powerpc64le-linux-gnu-gcc'\n\
+ar = '/usr/bin/powerpc64le-linux-gnu-gcc-ar'\n\
+strip = '/usr/bin/powerpc64le-linux-gnu-strip'\n\
+pkgconfig = '/usr/bin/powerpc64le-linux-gnu-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'ppc64'\n\
+cpu = 'powerpc64le'\n\
+endian = 'little'" > /usr/local/share/meson/cross/powerpc64le-linux-gnu
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/powerpc64le-linux-gnu-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/powerpc64le-linux-gnu-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="powerpc64le-linux-gnu"
+export MESON_OPTS="--cross-file=powerpc64le-linux-gnu"
diff --git a/ci/buildenv/debian-sid-cross-s390x.sh b/ci/buildenv/debian-sid-cross-s390x.sh
new file mode 100644
index 0000000000..1a4a5cf5c3
--- /dev/null
+++ b/ci/buildenv/debian-sid-cross-s390x.sh
@@ -0,0 +1,114 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libc-dev-bin \
+            libxml2-utils \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    export DEBIAN_FRONTEND=noninteractive
+    dpkg --add-architecture s390x
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y dpkg-dev
+    apt-get install --no-install-recommends -y \
+            gcc-s390x-linux-gnu \
+            libacl1-dev:s390x \
+            libapparmor-dev:s390x \
+            libattr1-dev:s390x \
+            libaudit-dev:s390x \
+            libblkid-dev:s390x \
+            libc6-dev:s390x \
+            libcap-ng-dev:s390x \
+            libcurl4-gnutls-dev:s390x \
+            libdevmapper-dev:s390x \
+            libfuse-dev:s390x \
+            libglib2.0-dev:s390x \
+            libglusterfs-dev:s390x \
+            libgnutls28-dev:s390x \
+            libiscsi-dev:s390x \
+            libnl-3-dev:s390x \
+            libnl-route-3-dev:s390x \
+            libnuma-dev:s390x \
+            libparted-dev:s390x \
+            libpcap0.8-dev:s390x \
+            libpciaccess-dev:s390x \
+            librbd-dev:s390x \
+            libreadline-dev:s390x \
+            libsanlock-dev:s390x \
+            libsasl2-dev:s390x \
+            libselinux1-dev:s390x \
+            libssh-gcrypt-dev:s390x \
+            libssh2-1-dev:s390x \
+            libtirpc-dev:s390x \
+            libudev-dev:s390x \
+            libxml2-dev:s390x \
+            libyajl-dev:s390x \
+            systemtap-sdt-dev:s390x
+    mkdir -p /usr/local/share/meson/cross
+    echo "[binaries]\n\
+c = '/usr/bin/s390x-linux-gnu-gcc'\n\
+ar = '/usr/bin/s390x-linux-gnu-gcc-ar'\n\
+strip = '/usr/bin/s390x-linux-gnu-strip'\n\
+pkgconfig = '/usr/bin/s390x-linux-gnu-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 's390x'\n\
+cpu = 's390x'\n\
+endian = 'big'" > /usr/local/share/meson/cross/s390x-linux-gnu
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/s390x-linux-gnu-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/s390x-linux-gnu-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="s390x-linux-gnu"
+export MESON_OPTS="--cross-file=s390x-linux-gnu"
diff --git a/ci/buildenv/debian-sid.sh b/ci/buildenv/debian-sid.sh
new file mode 100644
index 0000000000..a40e327db4
--- /dev/null
+++ b/ci/buildenv/debian-sid.sh
@@ -0,0 +1,97 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            clang \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gcc \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libacl1-dev \
+            libapparmor-dev \
+            libattr1-dev \
+            libaudit-dev \
+            libblkid-dev \
+            libc-dev-bin \
+            libc6-dev \
+            libcap-ng-dev \
+            libcurl4-gnutls-dev \
+            libdevmapper-dev \
+            libfuse-dev \
+            libglib2.0-dev \
+            libglusterfs-dev \
+            libgnutls28-dev \
+            libiscsi-dev \
+            libnl-3-dev \
+            libnl-route-3-dev \
+            libnuma-dev \
+            libparted-dev \
+            libpcap0.8-dev \
+            libpciaccess-dev \
+            librbd-dev \
+            libreadline-dev \
+            libsanlock-dev \
+            libsasl2-dev \
+            libselinux1-dev \
+            libssh-gcrypt-dev \
+            libssh2-1-dev \
+            libtirpc-dev \
+            libudev-dev \
+            libxen-dev \
+            libxml2-dev \
+            libxml2-utils \
+            libyajl-dev \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            systemtap-sdt-dev \
+            wireshark-dev \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/buildenv/fedora-35.sh b/ci/buildenv/fedora-35.sh
new file mode 100644
index 0000000000..2ee8c901e5
--- /dev/null
+++ b/ci/buildenv/fedora-35.sh
@@ -0,0 +1,97 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    dnf update -y
+    dnf install -y \
+        audit-libs-devel \
+        augeas \
+        bash-completion \
+        ca-certificates \
+        ccache \
+        clang \
+        codespell \
+        cpp \
+        cppi \
+        cyrus-sasl-devel \
+        device-mapper-devel \
+        diffutils \
+        dwarves \
+        ebtables \
+        firewalld-filesystem \
+        fuse-devel \
+        gcc \
+        gettext \
+        git \
+        glib2-devel \
+        glibc-devel \
+        glibc-langpack-en \
+        glusterfs-api-devel \
+        gnutls-devel \
+        grep \
+        iproute \
+        iproute-tc \
+        iptables \
+        iscsi-initiator-utils \
+        kmod \
+        libacl-devel \
+        libattr-devel \
+        libblkid-devel \
+        libcap-ng-devel \
+        libcurl-devel \
+        libiscsi-devel \
+        libnl3-devel \
+        libpcap-devel \
+        libpciaccess-devel \
+        librbd-devel \
+        libselinux-devel \
+        libssh-devel \
+        libssh2-devel \
+        libtirpc-devel \
+        libwsman-devel \
+        libxml2 \
+        libxml2-devel \
+        libxslt \
+        lvm2 \
+        make \
+        meson \
+        netcf-devel \
+        nfs-utils \
+        ninja-build \
+        numactl-devel \
+        numad \
+        parted-devel \
+        perl-base \
+        pkgconfig \
+        polkit \
+        python3 \
+        python3-docutils \
+        python3-flake8 \
+        qemu-img \
+        readline-devel \
+        rpcgen \
+        rpm-build \
+        sanlock-devel \
+        scrub \
+        sed \
+        systemd-devel \
+        systemd-rpm-macros \
+        systemtap-sdt-devel \
+        wireshark-devel \
+        xen-devel \
+        yajl-devel
+    rpm -qa | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/buildenv/fedora-36-cross-mingw32.sh b/ci/buildenv/fedora-36-cross-mingw32.sh
new file mode 100644
index 0000000000..a45c84802f
--- /dev/null
+++ b/ci/buildenv/fedora-36-cross-mingw32.sh
@@ -0,0 +1,74 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    dnf update -y
+    dnf install -y \
+        augeas \
+        bash-completion \
+        ca-certificates \
+        ccache \
+        codespell \
+        cpp \
+        cppi \
+        diffutils \
+        dwarves \
+        ebtables \
+        firewalld-filesystem \
+        git \
+        glibc-langpack-en \
+        grep \
+        iproute \
+        iproute-tc \
+        iptables \
+        iscsi-initiator-utils \
+        kmod \
+        libxml2 \
+        libxslt \
+        lvm2 \
+        make \
+        meson \
+        nfs-utils \
+        ninja-build \
+        numad \
+        perl-base \
+        polkit \
+        python3 \
+        python3-docutils \
+        python3-flake8 \
+        qemu-img \
+        rpcgen \
+        rpm-build \
+        scrub \
+        sed \
+        systemd-rpm-macros
+    dnf install -y \
+        mingw32-curl \
+        mingw32-dlfcn \
+        mingw32-gcc \
+        mingw32-gettext \
+        mingw32-glib2 \
+        mingw32-gnutls \
+        mingw32-headers \
+        mingw32-libssh2 \
+        mingw32-libxml2 \
+        mingw32-pkg-config \
+        mingw32-portablexdr \
+        mingw32-readline
+    rpm -qa | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/i686-w64-mingw32-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/i686-w64-mingw32-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="i686-w64-mingw32"
+export MESON_OPTS="--cross-file=/usr/share/mingw/toolchain-mingw32.meson"
diff --git a/ci/buildenv/fedora-36-cross-mingw64.sh b/ci/buildenv/fedora-36-cross-mingw64.sh
new file mode 100644
index 0000000000..1e2b2bace2
--- /dev/null
+++ b/ci/buildenv/fedora-36-cross-mingw64.sh
@@ -0,0 +1,74 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    dnf update -y
+    dnf install -y \
+        augeas \
+        bash-completion \
+        ca-certificates \
+        ccache \
+        codespell \
+        cpp \
+        cppi \
+        diffutils \
+        dwarves \
+        ebtables \
+        firewalld-filesystem \
+        git \
+        glibc-langpack-en \
+        grep \
+        iproute \
+        iproute-tc \
+        iptables \
+        iscsi-initiator-utils \
+        kmod \
+        libxml2 \
+        libxslt \
+        lvm2 \
+        make \
+        meson \
+        nfs-utils \
+        ninja-build \
+        numad \
+        perl-base \
+        polkit \
+        python3 \
+        python3-docutils \
+        python3-flake8 \
+        qemu-img \
+        rpcgen \
+        rpm-build \
+        scrub \
+        sed \
+        systemd-rpm-macros
+    dnf install -y \
+        mingw64-curl \
+        mingw64-dlfcn \
+        mingw64-gcc \
+        mingw64-gettext \
+        mingw64-glib2 \
+        mingw64-gnutls \
+        mingw64-headers \
+        mingw64-libssh2 \
+        mingw64-libxml2 \
+        mingw64-pkg-config \
+        mingw64-portablexdr \
+        mingw64-readline
+    rpm -qa | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/x86_64-w64-mingw32-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/x86_64-w64-mingw32-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="x86_64-w64-mingw32"
+export MESON_OPTS="--cross-file=/usr/share/mingw/toolchain-mingw64.meson"
diff --git a/ci/buildenv/fedora-36.sh b/ci/buildenv/fedora-36.sh
new file mode 100644
index 0000000000..23886ae77c
--- /dev/null
+++ b/ci/buildenv/fedora-36.sh
@@ -0,0 +1,96 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    dnf update -y
+    dnf install -y \
+        audit-libs-devel \
+        augeas \
+        bash-completion \
+        ca-certificates \
+        ccache \
+        clang \
+        codespell \
+        cpp \
+        cppi \
+        cyrus-sasl-devel \
+        device-mapper-devel \
+        diffutils \
+        dwarves \
+        ebtables \
+        firewalld-filesystem \
+        fuse-devel \
+        gcc \
+        gettext \
+        git \
+        glib2-devel \
+        glibc-devel \
+        glibc-langpack-en \
+        glusterfs-api-devel \
+        gnutls-devel \
+        grep \
+        iproute \
+        iproute-tc \
+        iptables \
+        iscsi-initiator-utils \
+        kmod \
+        libacl-devel \
+        libattr-devel \
+        libblkid-devel \
+        libcap-ng-devel \
+        libcurl-devel \
+        libiscsi-devel \
+        libnl3-devel \
+        libpcap-devel \
+        libpciaccess-devel \
+        librbd-devel \
+        libselinux-devel \
+        libssh-devel \
+        libssh2-devel \
+        libtirpc-devel \
+        libwsman-devel \
+        libxml2 \
+        libxml2-devel \
+        libxslt \
+        lvm2 \
+        make \
+        meson \
+        nfs-utils \
+        ninja-build \
+        numactl-devel \
+        numad \
+        parted-devel \
+        perl-base \
+        pkgconfig \
+        polkit \
+        python3 \
+        python3-docutils \
+        python3-flake8 \
+        qemu-img \
+        readline-devel \
+        rpcgen \
+        rpm-build \
+        sanlock-devel \
+        scrub \
+        sed \
+        systemd-devel \
+        systemd-rpm-macros \
+        systemtap-sdt-devel \
+        wireshark-devel \
+        xen-devel \
+        yajl-devel
+    rpm -qa | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/buildenv/fedora-rawhide-cross-mingw32.sh b/ci/buildenv/fedora-rawhide-cross-mingw32.sh
new file mode 100644
index 0000000000..ed87040be6
--- /dev/null
+++ b/ci/buildenv/fedora-rawhide-cross-mingw32.sh
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    dnf update -y --nogpgcheck fedora-gpg-keys
+    dnf distro-sync -y
+    dnf install -y \
+        augeas \
+        bash-completion \
+        ca-certificates \
+        ccache \
+        codespell \
+        cpp \
+        cppi \
+        diffutils \
+        dwarves \
+        ebtables \
+        firewalld-filesystem \
+        git \
+        glibc-langpack-en \
+        grep \
+        iproute \
+        iproute-tc \
+        iptables \
+        iscsi-initiator-utils \
+        kmod \
+        libxml2 \
+        libxslt \
+        lvm2 \
+        make \
+        meson \
+        nfs-utils \
+        ninja-build \
+        numad \
+        perl-base \
+        polkit \
+        python3 \
+        python3-docutils \
+        python3-flake8 \
+        qemu-img \
+        rpcgen \
+        rpm-build \
+        scrub \
+        sed \
+        systemd-rpm-macros
+    dnf install -y \
+        mingw32-curl \
+        mingw32-dlfcn \
+        mingw32-gcc \
+        mingw32-gettext \
+        mingw32-glib2 \
+        mingw32-gnutls \
+        mingw32-headers \
+        mingw32-libssh2 \
+        mingw32-libxml2 \
+        mingw32-pkg-config \
+        mingw32-portablexdr \
+        mingw32-readline
+    rpm -qa | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/i686-w64-mingw32-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/i686-w64-mingw32-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="i686-w64-mingw32"
+export MESON_OPTS="--cross-file=/usr/share/mingw/toolchain-mingw32.meson"
diff --git a/ci/buildenv/fedora-rawhide-cross-mingw64.sh b/ci/buildenv/fedora-rawhide-cross-mingw64.sh
new file mode 100644
index 0000000000..c57e81dea3
--- /dev/null
+++ b/ci/buildenv/fedora-rawhide-cross-mingw64.sh
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    dnf update -y --nogpgcheck fedora-gpg-keys
+    dnf distro-sync -y
+    dnf install -y \
+        augeas \
+        bash-completion \
+        ca-certificates \
+        ccache \
+        codespell \
+        cpp \
+        cppi \
+        diffutils \
+        dwarves \
+        ebtables \
+        firewalld-filesystem \
+        git \
+        glibc-langpack-en \
+        grep \
+        iproute \
+        iproute-tc \
+        iptables \
+        iscsi-initiator-utils \
+        kmod \
+        libxml2 \
+        libxslt \
+        lvm2 \
+        make \
+        meson \
+        nfs-utils \
+        ninja-build \
+        numad \
+        perl-base \
+        polkit \
+        python3 \
+        python3-docutils \
+        python3-flake8 \
+        qemu-img \
+        rpcgen \
+        rpm-build \
+        scrub \
+        sed \
+        systemd-rpm-macros
+    dnf install -y \
+        mingw64-curl \
+        mingw64-dlfcn \
+        mingw64-gcc \
+        mingw64-gettext \
+        mingw64-glib2 \
+        mingw64-gnutls \
+        mingw64-headers \
+        mingw64-libssh2 \
+        mingw64-libxml2 \
+        mingw64-pkg-config \
+        mingw64-portablexdr \
+        mingw64-readline
+    rpm -qa | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/x86_64-w64-mingw32-cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/x86_64-w64-mingw32-gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
+
+export ABI="x86_64-w64-mingw32"
+export MESON_OPTS="--cross-file=/usr/share/mingw/toolchain-mingw64.meson"
diff --git a/ci/buildenv/fedora-rawhide.sh b/ci/buildenv/fedora-rawhide.sh
new file mode 100644
index 0000000000..7a774c898c
--- /dev/null
+++ b/ci/buildenv/fedora-rawhide.sh
@@ -0,0 +1,97 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    dnf update -y --nogpgcheck fedora-gpg-keys
+    dnf distro-sync -y
+    dnf install -y \
+        audit-libs-devel \
+        augeas \
+        bash-completion \
+        ca-certificates \
+        ccache \
+        clang \
+        codespell \
+        cpp \
+        cppi \
+        cyrus-sasl-devel \
+        device-mapper-devel \
+        diffutils \
+        dwarves \
+        ebtables \
+        firewalld-filesystem \
+        fuse-devel \
+        gcc \
+        gettext \
+        git \
+        glib2-devel \
+        glibc-devel \
+        glibc-langpack-en \
+        glusterfs-api-devel \
+        gnutls-devel \
+        grep \
+        iproute \
+        iproute-tc \
+        iptables \
+        iscsi-initiator-utils \
+        kmod \
+        libacl-devel \
+        libattr-devel \
+        libblkid-devel \
+        libcap-ng-devel \
+        libcurl-devel \
+        libiscsi-devel \
+        libnl3-devel \
+        libpcap-devel \
+        libpciaccess-devel \
+        librbd-devel \
+        libselinux-devel \
+        libssh-devel \
+        libssh2-devel \
+        libtirpc-devel \
+        libwsman-devel \
+        libxml2 \
+        libxml2-devel \
+        libxslt \
+        lvm2 \
+        make \
+        meson \
+        nfs-utils \
+        ninja-build \
+        numactl-devel \
+        numad \
+        parted-devel \
+        perl-base \
+        pkgconfig \
+        polkit \
+        python3 \
+        python3-docutils \
+        python3-flake8 \
+        qemu-img \
+        readline-devel \
+        rpcgen \
+        rpm-build \
+        sanlock-devel \
+        scrub \
+        sed \
+        systemd-devel \
+        systemd-rpm-macros \
+        systemtap-sdt-devel \
+        wireshark-devel \
+        xen-devel \
+        yajl-devel
+    rpm -qa | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/buildenv/opensuse-leap-153.sh b/ci/buildenv/opensuse-leap-153.sh
new file mode 100644
index 0000000000..b78382470c
--- /dev/null
+++ b/ci/buildenv/opensuse-leap-153.sh
@@ -0,0 +1,99 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    zypper update -y
+    zypper install -y \
+           audit-devel \
+           augeas \
+           augeas-lenses \
+           bash-completion \
+           ca-certificates \
+           ccache \
+           clang \
+           codespell \
+           cpp \
+           cppi \
+           cyrus-sasl-devel \
+           device-mapper-devel \
+           diffutils \
+           dwarves \
+           ebtables \
+           fuse-devel \
+           gcc \
+           gettext-runtime \
+           git \
+           glib2-devel \
+           glibc-devel \
+           glibc-locale \
+           glusterfs-devel \
+           grep \
+           iproute2 \
+           iptables \
+           kmod \
+           libacl-devel \
+           libapparmor-devel \
+           libattr-devel \
+           libblkid-devel \
+           libcap-ng-devel \
+           libcurl-devel \
+           libgnutls-devel \
+           libiscsi-devel \
+           libnl3-devel \
+           libnuma-devel \
+           libpcap-devel \
+           libpciaccess-devel \
+           librbd-devel \
+           libselinux-devel \
+           libssh-devel \
+           libssh2-devel \
+           libtirpc-devel \
+           libudev-devel \
+           libwsman-devel \
+           libxml2 \
+           libxml2-devel \
+           libxslt \
+           libyajl-devel \
+           lvm2 \
+           make \
+           nfs-utils \
+           ninja \
+           numad \
+           open-iscsi \
+           parted-devel \
+           perl-base \
+           pkgconfig \
+           polkit \
+           python3-base \
+           python3-docutils \
+           python3-flake8 \
+           python3-pip \
+           python3-setuptools \
+           python3-wheel \
+           qemu-tools \
+           readline-devel \
+           rpcgen \
+           rpm-build \
+           sanlock-devel \
+           scrub \
+           sed \
+           systemd-rpm-macros \
+           systemtap-sdt-devel \
+           wireshark-devel \
+           xen-devel
+    rpm -qa | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+    /usr/bin/pip3 install meson==0.56.0
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/buildenv/opensuse-tumbleweed.sh b/ci/buildenv/opensuse-tumbleweed.sh
new file mode 100644
index 0000000000..0d064cc6ac
--- /dev/null
+++ b/ci/buildenv/opensuse-tumbleweed.sh
@@ -0,0 +1,96 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    zypper dist-upgrade -y
+    zypper install -y \
+           audit-devel \
+           augeas \
+           augeas-lenses \
+           bash-completion \
+           ca-certificates \
+           ccache \
+           clang \
+           codespell \
+           cpp \
+           cppi \
+           cyrus-sasl-devel \
+           device-mapper-devel \
+           diffutils \
+           dwarves \
+           ebtables \
+           fuse-devel \
+           gcc \
+           gettext-runtime \
+           git \
+           glib2-devel \
+           glibc-devel \
+           glibc-locale \
+           glusterfs-devel \
+           grep \
+           iproute2 \
+           iptables \
+           kmod \
+           libacl-devel \
+           libapparmor-devel \
+           libattr-devel \
+           libblkid-devel \
+           libcap-ng-devel \
+           libcurl-devel \
+           libgnutls-devel \
+           libiscsi-devel \
+           libnl3-devel \
+           libnuma-devel \
+           libpcap-devel \
+           libpciaccess-devel \
+           librbd-devel \
+           libselinux-devel \
+           libssh-devel \
+           libssh2-devel \
+           libtirpc-devel \
+           libudev-devel \
+           libwsman-devel \
+           libxml2 \
+           libxml2-devel \
+           libxslt \
+           libyajl-devel \
+           lvm2 \
+           make \
+           meson \
+           nfs-utils \
+           ninja \
+           numad \
+           open-iscsi \
+           parted-devel \
+           perl-base \
+           pkgconfig \
+           polkit \
+           python3-base \
+           python3-docutils \
+           python39-flake8 \
+           qemu-tools \
+           readline-devel \
+           rpcgen \
+           rpm-build \
+           sanlock-devel \
+           scrub \
+           sed \
+           systemd-rpm-macros \
+           systemtap-sdt-devel \
+           wireshark-devel \
+           xen-devel
+    rpm -qa | sort > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/buildenv/ubuntu-2004.sh b/ci/buildenv/ubuntu-2004.sh
new file mode 100644
index 0000000000..d28a16018d
--- /dev/null
+++ b/ci/buildenv/ubuntu-2004.sh
@@ -0,0 +1,102 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            clang \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gcc \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libacl1-dev \
+            libapparmor-dev \
+            libattr1-dev \
+            libaudit-dev \
+            libblkid-dev \
+            libc-dev-bin \
+            libc6-dev \
+            libcap-ng-dev \
+            libcurl4-gnutls-dev \
+            libdevmapper-dev \
+            libfuse-dev \
+            libglib2.0-dev \
+            libglusterfs-dev \
+            libgnutls28-dev \
+            libiscsi-dev \
+            libnetcf-dev \
+            libnl-3-dev \
+            libnl-route-3-dev \
+            libnuma-dev \
+            libopenwsman-dev \
+            libparted-dev \
+            libpcap0.8-dev \
+            libpciaccess-dev \
+            librbd-dev \
+            libreadline-dev \
+            libsanlock-dev \
+            libsasl2-dev \
+            libselinux1-dev \
+            libssh-dev \
+            libssh2-1-dev \
+            libtirpc-dev \
+            libudev-dev \
+            libxen-dev \
+            libxml2-dev \
+            libxml2-utils \
+            libyajl-dev \
+            locales \
+            lvm2 \
+            make \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            python3-pip \
+            python3-setuptools \
+            python3-wheel \
+            qemu-utils \
+            scrub \
+            sed \
+            systemtap-sdt-dev \
+            wireshark-dev \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+    /usr/bin/pip3 install meson==0.56.0
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/buildenv/ubuntu-2204.sh b/ci/buildenv/ubuntu-2204.sh
new file mode 100644
index 0000000000..bb041e8eca
--- /dev/null
+++ b/ci/buildenv/ubuntu-2204.sh
@@ -0,0 +1,98 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+#  $ lcitool manifest ci/manifest.yml
+#
+# https://gitlab.com/libvirt/libvirt-ci
+
+function install_buildenv() {
+    export DEBIAN_FRONTEND=noninteractive
+    apt-get update
+    apt-get dist-upgrade -y
+    apt-get install --no-install-recommends -y \
+            augeas-lenses \
+            augeas-tools \
+            bash-completion \
+            ca-certificates \
+            ccache \
+            clang \
+            codespell \
+            cpp \
+            diffutils \
+            dwarves \
+            ebtables \
+            flake8 \
+            gcc \
+            gettext \
+            git \
+            grep \
+            iproute2 \
+            iptables \
+            kmod \
+            libacl1-dev \
+            libapparmor-dev \
+            libattr1-dev \
+            libaudit-dev \
+            libblkid-dev \
+            libc-dev-bin \
+            libc6-dev \
+            libcap-ng-dev \
+            libcurl4-gnutls-dev \
+            libdevmapper-dev \
+            libfuse-dev \
+            libglib2.0-dev \
+            libglusterfs-dev \
+            libgnutls28-dev \
+            libiscsi-dev \
+            libnl-3-dev \
+            libnl-route-3-dev \
+            libnuma-dev \
+            libopenwsman-dev \
+            libparted-dev \
+            libpcap0.8-dev \
+            libpciaccess-dev \
+            librbd-dev \
+            libreadline-dev \
+            libsanlock-dev \
+            libsasl2-dev \
+            libselinux1-dev \
+            libssh-dev \
+            libssh2-1-dev \
+            libtirpc-dev \
+            libudev-dev \
+            libxen-dev \
+            libxml2-dev \
+            libxml2-utils \
+            libyajl-dev \
+            locales \
+            lvm2 \
+            make \
+            meson \
+            nfs-common \
+            ninja-build \
+            numad \
+            open-iscsi \
+            perl-base \
+            pkgconf \
+            policykit-1 \
+            python3 \
+            python3-docutils \
+            qemu-utils \
+            scrub \
+            sed \
+            systemtap-sdt-dev \
+            wireshark-dev \
+            xsltproc
+    sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen
+    dpkg-reconfigure locales
+    dpkg-query --showformat '${Package}_${Version}_${Architecture}\n' --show > /packages.txt
+    mkdir -p /usr/libexec/ccache-wrappers
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang
+    ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
+}
+
+export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers"
+export LANG="en_US.UTF-8"
+export MAKE="/usr/bin/make"
+export NINJA="/usr/bin/ninja"
+export PYTHON="/usr/bin/python3"
diff --git a/ci/containers/almalinux-8.Dockerfile b/ci/containers/almalinux-8.Dockerfile
index e6e5cdbf32..d27fae106c 100644
--- a/ci/containers/almalinux-8.Dockerfile
+++ b/ci/containers/almalinux-8.Dockerfile
@@ -93,8 +93,8 @@ RUN dnf update -y && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/alpine-315.Dockerfile b/ci/containers/alpine-315.Dockerfile
index 26d72f85a3..bad7e87c2b 100644
--- a/ci/containers/alpine-315.Dockerfile
+++ b/ci/containers/alpine-315.Dockerfile
@@ -73,8 +73,8 @@ RUN apk update && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/alpine-edge.Dockerfile b/ci/containers/alpine-edge.Dockerfile
index 76e85b4386..34e895573c 100644
--- a/ci/containers/alpine-edge.Dockerfile
+++ b/ci/containers/alpine-edge.Dockerfile
@@ -74,8 +74,8 @@ RUN apk update && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/centos-stream-8.Dockerfile b/ci/containers/centos-stream-8.Dockerfile
index 9b7287a416..bc4439b506 100644
--- a/ci/containers/centos-stream-8.Dockerfile
+++ b/ci/containers/centos-stream-8.Dockerfile
@@ -94,8 +94,8 @@ RUN dnf distro-sync -y && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/centos-stream-9.Dockerfile b/ci/containers/centos-stream-9.Dockerfile
index cc8e26d6ea..6478031379 100644
--- a/ci/containers/centos-stream-9.Dockerfile
+++ b/ci/containers/centos-stream-9.Dockerfile
@@ -94,8 +94,8 @@ RUN dnf distro-sync -y && \
 
 RUN /usr/bin/pip3 install flake8
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/debian-11-cross-aarch64.Dockerfile b/ci/containers/debian-11-cross-aarch64.Dockerfile
index 778eed4be1..d030a9a9df 100644
--- a/ci/containers/debian-11-cross-aarch64.Dockerfile
+++ b/ci/containers/debian-11-cross-aarch64.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture arm64 && \
@@ -64,40 +64,40 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-aarch64-linux-gnu \
-            libacl1-dev:arm64 \
-            libapparmor-dev:arm64 \
-            libattr1-dev:arm64 \
-            libaudit-dev:arm64 \
-            libblkid-dev:arm64 \
-            libc6-dev:arm64 \
-            libcap-ng-dev:arm64 \
-            libcurl4-gnutls-dev:arm64 \
-            libdevmapper-dev:arm64 \
-            libfuse-dev:arm64 \
-            libglib2.0-dev:arm64 \
-            libglusterfs-dev:arm64 \
-            libgnutls28-dev:arm64 \
-            libiscsi-dev:arm64 \
-            libnl-3-dev:arm64 \
-            libnl-route-3-dev:arm64 \
-            libnuma-dev:arm64 \
-            libparted-dev:arm64 \
-            libpcap0.8-dev:arm64 \
-            libpciaccess-dev:arm64 \
-            librbd-dev:arm64 \
-            libreadline-dev:arm64 \
-            libsanlock-dev:arm64 \
-            libsasl2-dev:arm64 \
-            libselinux1-dev:arm64 \
-            libssh-gcrypt-dev:arm64 \
-            libssh2-1-dev:arm64 \
-            libtirpc-dev:arm64 \
-            libudev-dev:arm64 \
-            libxen-dev:arm64 \
-            libxml2-dev:arm64 \
-            libyajl-dev:arm64 \
-            systemtap-sdt-dev:arm64 && \
+                      gcc-aarch64-linux-gnu \
+                      libacl1-dev:arm64 \
+                      libapparmor-dev:arm64 \
+                      libattr1-dev:arm64 \
+                      libaudit-dev:arm64 \
+                      libblkid-dev:arm64 \
+                      libc6-dev:arm64 \
+                      libcap-ng-dev:arm64 \
+                      libcurl4-gnutls-dev:arm64 \
+                      libdevmapper-dev:arm64 \
+                      libfuse-dev:arm64 \
+                      libglib2.0-dev:arm64 \
+                      libglusterfs-dev:arm64 \
+                      libgnutls28-dev:arm64 \
+                      libiscsi-dev:arm64 \
+                      libnl-3-dev:arm64 \
+                      libnl-route-3-dev:arm64 \
+                      libnuma-dev:arm64 \
+                      libparted-dev:arm64 \
+                      libpcap0.8-dev:arm64 \
+                      libpciaccess-dev:arm64 \
+                      librbd-dev:arm64 \
+                      libreadline-dev:arm64 \
+                      libsanlock-dev:arm64 \
+                      libsasl2-dev:arm64 \
+                      libselinux1-dev:arm64 \
+                      libssh-gcrypt-dev:arm64 \
+                      libssh2-1-dev:arm64 \
+                      libtirpc-dev:arm64 \
+                      libudev-dev:arm64 \
+                      libxen-dev:arm64 \
+                      libxml2-dev:arm64 \
+                      libyajl-dev:arm64 \
+                      systemtap-sdt-dev:arm64 && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-11-cross-armv6l.Dockerfile b/ci/containers/debian-11-cross-armv6l.Dockerfile
index 6c13a93b95..5958957aaa 100644
--- a/ci/containers/debian-11-cross-armv6l.Dockerfile
+++ b/ci/containers/debian-11-cross-armv6l.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture armel && \
@@ -64,39 +64,39 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-arm-linux-gnueabi \
-            libacl1-dev:armel \
-            libapparmor-dev:armel \
-            libattr1-dev:armel \
-            libaudit-dev:armel \
-            libblkid-dev:armel \
-            libc6-dev:armel \
-            libcap-ng-dev:armel \
-            libcurl4-gnutls-dev:armel \
-            libdevmapper-dev:armel \
-            libfuse-dev:armel \
-            libglib2.0-dev:armel \
-            libglusterfs-dev:armel \
-            libgnutls28-dev:armel \
-            libiscsi-dev:armel \
-            libnl-3-dev:armel \
-            libnl-route-3-dev:armel \
-            libnuma-dev:armel \
-            libparted-dev:armel \
-            libpcap0.8-dev:armel \
-            libpciaccess-dev:armel \
-            librbd-dev:armel \
-            libreadline-dev:armel \
-            libsanlock-dev:armel \
-            libsasl2-dev:armel \
-            libselinux1-dev:armel \
-            libssh-gcrypt-dev:armel \
-            libssh2-1-dev:armel \
-            libtirpc-dev:armel \
-            libudev-dev:armel \
-            libxml2-dev:armel \
-            libyajl-dev:armel \
-            systemtap-sdt-dev:armel && \
+                      gcc-arm-linux-gnueabi \
+                      libacl1-dev:armel \
+                      libapparmor-dev:armel \
+                      libattr1-dev:armel \
+                      libaudit-dev:armel \
+                      libblkid-dev:armel \
+                      libc6-dev:armel \
+                      libcap-ng-dev:armel \
+                      libcurl4-gnutls-dev:armel \
+                      libdevmapper-dev:armel \
+                      libfuse-dev:armel \
+                      libglib2.0-dev:armel \
+                      libglusterfs-dev:armel \
+                      libgnutls28-dev:armel \
+                      libiscsi-dev:armel \
+                      libnl-3-dev:armel \
+                      libnl-route-3-dev:armel \
+                      libnuma-dev:armel \
+                      libparted-dev:armel \
+                      libpcap0.8-dev:armel \
+                      libpciaccess-dev:armel \
+                      librbd-dev:armel \
+                      libreadline-dev:armel \
+                      libsanlock-dev:armel \
+                      libsasl2-dev:armel \
+                      libselinux1-dev:armel \
+                      libssh-gcrypt-dev:armel \
+                      libssh2-1-dev:armel \
+                      libtirpc-dev:armel \
+                      libudev-dev:armel \
+                      libxml2-dev:armel \
+                      libyajl-dev:armel \
+                      systemtap-sdt-dev:armel && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-11-cross-armv7l.Dockerfile b/ci/containers/debian-11-cross-armv7l.Dockerfile
index 66f95d5cd8..c963657daa 100644
--- a/ci/containers/debian-11-cross-armv7l.Dockerfile
+++ b/ci/containers/debian-11-cross-armv7l.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture armhf && \
@@ -64,40 +64,40 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-arm-linux-gnueabihf \
-            libacl1-dev:armhf \
-            libapparmor-dev:armhf \
-            libattr1-dev:armhf \
-            libaudit-dev:armhf \
-            libblkid-dev:armhf \
-            libc6-dev:armhf \
-            libcap-ng-dev:armhf \
-            libcurl4-gnutls-dev:armhf \
-            libdevmapper-dev:armhf \
-            libfuse-dev:armhf \
-            libglib2.0-dev:armhf \
-            libglusterfs-dev:armhf \
-            libgnutls28-dev:armhf \
-            libiscsi-dev:armhf \
-            libnl-3-dev:armhf \
-            libnl-route-3-dev:armhf \
-            libnuma-dev:armhf \
-            libparted-dev:armhf \
-            libpcap0.8-dev:armhf \
-            libpciaccess-dev:armhf \
-            librbd-dev:armhf \
-            libreadline-dev:armhf \
-            libsanlock-dev:armhf \
-            libsasl2-dev:armhf \
-            libselinux1-dev:armhf \
-            libssh-gcrypt-dev:armhf \
-            libssh2-1-dev:armhf \
-            libtirpc-dev:armhf \
-            libudev-dev:armhf \
-            libxen-dev:armhf \
-            libxml2-dev:armhf \
-            libyajl-dev:armhf \
-            systemtap-sdt-dev:armhf && \
+                      gcc-arm-linux-gnueabihf \
+                      libacl1-dev:armhf \
+                      libapparmor-dev:armhf \
+                      libattr1-dev:armhf \
+                      libaudit-dev:armhf \
+                      libblkid-dev:armhf \
+                      libc6-dev:armhf \
+                      libcap-ng-dev:armhf \
+                      libcurl4-gnutls-dev:armhf \
+                      libdevmapper-dev:armhf \
+                      libfuse-dev:armhf \
+                      libglib2.0-dev:armhf \
+                      libglusterfs-dev:armhf \
+                      libgnutls28-dev:armhf \
+                      libiscsi-dev:armhf \
+                      libnl-3-dev:armhf \
+                      libnl-route-3-dev:armhf \
+                      libnuma-dev:armhf \
+                      libparted-dev:armhf \
+                      libpcap0.8-dev:armhf \
+                      libpciaccess-dev:armhf \
+                      librbd-dev:armhf \
+                      libreadline-dev:armhf \
+                      libsanlock-dev:armhf \
+                      libsasl2-dev:armhf \
+                      libselinux1-dev:armhf \
+                      libssh-gcrypt-dev:armhf \
+                      libssh2-1-dev:armhf \
+                      libtirpc-dev:armhf \
+                      libudev-dev:armhf \
+                      libxen-dev:armhf \
+                      libxml2-dev:armhf \
+                      libyajl-dev:armhf \
+                      systemtap-sdt-dev:armhf && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-11-cross-i686.Dockerfile b/ci/containers/debian-11-cross-i686.Dockerfile
index a12e703f42..9fe55f4f17 100644
--- a/ci/containers/debian-11-cross-i686.Dockerfile
+++ b/ci/containers/debian-11-cross-i686.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture i386 && \
@@ -64,39 +64,39 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-i686-linux-gnu \
-            libacl1-dev:i386 \
-            libapparmor-dev:i386 \
-            libattr1-dev:i386 \
-            libaudit-dev:i386 \
-            libblkid-dev:i386 \
-            libc6-dev:i386 \
-            libcap-ng-dev:i386 \
-            libcurl4-gnutls-dev:i386 \
-            libdevmapper-dev:i386 \
-            libfuse-dev:i386 \
-            libglib2.0-dev:i386 \
-            libglusterfs-dev:i386 \
-            libgnutls28-dev:i386 \
-            libiscsi-dev:i386 \
-            libnl-3-dev:i386 \
-            libnl-route-3-dev:i386 \
-            libnuma-dev:i386 \
-            libparted-dev:i386 \
-            libpcap0.8-dev:i386 \
-            libpciaccess-dev:i386 \
-            librbd-dev:i386 \
-            libreadline-dev:i386 \
-            libsanlock-dev:i386 \
-            libsasl2-dev:i386 \
-            libselinux1-dev:i386 \
-            libssh-gcrypt-dev:i386 \
-            libssh2-1-dev:i386 \
-            libtirpc-dev:i386 \
-            libudev-dev:i386 \
-            libxml2-dev:i386 \
-            libyajl-dev:i386 \
-            systemtap-sdt-dev:i386 && \
+                      gcc-i686-linux-gnu \
+                      libacl1-dev:i386 \
+                      libapparmor-dev:i386 \
+                      libattr1-dev:i386 \
+                      libaudit-dev:i386 \
+                      libblkid-dev:i386 \
+                      libc6-dev:i386 \
+                      libcap-ng-dev:i386 \
+                      libcurl4-gnutls-dev:i386 \
+                      libdevmapper-dev:i386 \
+                      libfuse-dev:i386 \
+                      libglib2.0-dev:i386 \
+                      libglusterfs-dev:i386 \
+                      libgnutls28-dev:i386 \
+                      libiscsi-dev:i386 \
+                      libnl-3-dev:i386 \
+                      libnl-route-3-dev:i386 \
+                      libnuma-dev:i386 \
+                      libparted-dev:i386 \
+                      libpcap0.8-dev:i386 \
+                      libpciaccess-dev:i386 \
+                      librbd-dev:i386 \
+                      libreadline-dev:i386 \
+                      libsanlock-dev:i386 \
+                      libsasl2-dev:i386 \
+                      libselinux1-dev:i386 \
+                      libssh-gcrypt-dev:i386 \
+                      libssh2-1-dev:i386 \
+                      libtirpc-dev:i386 \
+                      libudev-dev:i386 \
+                      libxml2-dev:i386 \
+                      libyajl-dev:i386 \
+                      systemtap-sdt-dev:i386 && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-11-cross-mips64el.Dockerfile b/ci/containers/debian-11-cross-mips64el.Dockerfile
index 9c880ba1f1..d4bf055915 100644
--- a/ci/containers/debian-11-cross-mips64el.Dockerfile
+++ b/ci/containers/debian-11-cross-mips64el.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture mips64el && \
@@ -64,39 +64,39 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-mips64el-linux-gnuabi64 \
-            libacl1-dev:mips64el \
-            libapparmor-dev:mips64el \
-            libattr1-dev:mips64el \
-            libaudit-dev:mips64el \
-            libblkid-dev:mips64el \
-            libc6-dev:mips64el \
-            libcap-ng-dev:mips64el \
-            libcurl4-gnutls-dev:mips64el \
-            libdevmapper-dev:mips64el \
-            libfuse-dev:mips64el \
-            libglib2.0-dev:mips64el \
-            libglusterfs-dev:mips64el \
-            libgnutls28-dev:mips64el \
-            libiscsi-dev:mips64el \
-            libnl-3-dev:mips64el \
-            libnl-route-3-dev:mips64el \
-            libnuma-dev:mips64el \
-            libparted-dev:mips64el \
-            libpcap0.8-dev:mips64el \
-            libpciaccess-dev:mips64el \
-            librbd-dev:mips64el \
-            libreadline-dev:mips64el \
-            libsanlock-dev:mips64el \
-            libsasl2-dev:mips64el \
-            libselinux1-dev:mips64el \
-            libssh-gcrypt-dev:mips64el \
-            libssh2-1-dev:mips64el \
-            libtirpc-dev:mips64el \
-            libudev-dev:mips64el \
-            libxml2-dev:mips64el \
-            libyajl-dev:mips64el \
-            systemtap-sdt-dev:mips64el && \
+                      gcc-mips64el-linux-gnuabi64 \
+                      libacl1-dev:mips64el \
+                      libapparmor-dev:mips64el \
+                      libattr1-dev:mips64el \
+                      libaudit-dev:mips64el \
+                      libblkid-dev:mips64el \
+                      libc6-dev:mips64el \
+                      libcap-ng-dev:mips64el \
+                      libcurl4-gnutls-dev:mips64el \
+                      libdevmapper-dev:mips64el \
+                      libfuse-dev:mips64el \
+                      libglib2.0-dev:mips64el \
+                      libglusterfs-dev:mips64el \
+                      libgnutls28-dev:mips64el \
+                      libiscsi-dev:mips64el \
+                      libnl-3-dev:mips64el \
+                      libnl-route-3-dev:mips64el \
+                      libnuma-dev:mips64el \
+                      libparted-dev:mips64el \
+                      libpcap0.8-dev:mips64el \
+                      libpciaccess-dev:mips64el \
+                      librbd-dev:mips64el \
+                      libreadline-dev:mips64el \
+                      libsanlock-dev:mips64el \
+                      libsasl2-dev:mips64el \
+                      libselinux1-dev:mips64el \
+                      libssh-gcrypt-dev:mips64el \
+                      libssh2-1-dev:mips64el \
+                      libtirpc-dev:mips64el \
+                      libudev-dev:mips64el \
+                      libxml2-dev:mips64el \
+                      libyajl-dev:mips64el \
+                      systemtap-sdt-dev:mips64el && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-11-cross-mipsel.Dockerfile b/ci/containers/debian-11-cross-mipsel.Dockerfile
index b4d2b53f27..d9b5aa2798 100644
--- a/ci/containers/debian-11-cross-mipsel.Dockerfile
+++ b/ci/containers/debian-11-cross-mipsel.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture mipsel && \
@@ -64,39 +64,39 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-mipsel-linux-gnu \
-            libacl1-dev:mipsel \
-            libapparmor-dev:mipsel \
-            libattr1-dev:mipsel \
-            libaudit-dev:mipsel \
-            libblkid-dev:mipsel \
-            libc6-dev:mipsel \
-            libcap-ng-dev:mipsel \
-            libcurl4-gnutls-dev:mipsel \
-            libdevmapper-dev:mipsel \
-            libfuse-dev:mipsel \
-            libglib2.0-dev:mipsel \
-            libglusterfs-dev:mipsel \
-            libgnutls28-dev:mipsel \
-            libiscsi-dev:mipsel \
-            libnl-3-dev:mipsel \
-            libnl-route-3-dev:mipsel \
-            libnuma-dev:mipsel \
-            libparted-dev:mipsel \
-            libpcap0.8-dev:mipsel \
-            libpciaccess-dev:mipsel \
-            librbd-dev:mipsel \
-            libreadline-dev:mipsel \
-            libsanlock-dev:mipsel \
-            libsasl2-dev:mipsel \
-            libselinux1-dev:mipsel \
-            libssh-gcrypt-dev:mipsel \
-            libssh2-1-dev:mipsel \
-            libtirpc-dev:mipsel \
-            libudev-dev:mipsel \
-            libxml2-dev:mipsel \
-            libyajl-dev:mipsel \
-            systemtap-sdt-dev:mipsel && \
+                      gcc-mipsel-linux-gnu \
+                      libacl1-dev:mipsel \
+                      libapparmor-dev:mipsel \
+                      libattr1-dev:mipsel \
+                      libaudit-dev:mipsel \
+                      libblkid-dev:mipsel \
+                      libc6-dev:mipsel \
+                      libcap-ng-dev:mipsel \
+                      libcurl4-gnutls-dev:mipsel \
+                      libdevmapper-dev:mipsel \
+                      libfuse-dev:mipsel \
+                      libglib2.0-dev:mipsel \
+                      libglusterfs-dev:mipsel \
+                      libgnutls28-dev:mipsel \
+                      libiscsi-dev:mipsel \
+                      libnl-3-dev:mipsel \
+                      libnl-route-3-dev:mipsel \
+                      libnuma-dev:mipsel \
+                      libparted-dev:mipsel \
+                      libpcap0.8-dev:mipsel \
+                      libpciaccess-dev:mipsel \
+                      librbd-dev:mipsel \
+                      libreadline-dev:mipsel \
+                      libsanlock-dev:mipsel \
+                      libsasl2-dev:mipsel \
+                      libselinux1-dev:mipsel \
+                      libssh-gcrypt-dev:mipsel \
+                      libssh2-1-dev:mipsel \
+                      libtirpc-dev:mipsel \
+                      libudev-dev:mipsel \
+                      libxml2-dev:mipsel \
+                      libyajl-dev:mipsel \
+                      systemtap-sdt-dev:mipsel && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-11-cross-ppc64le.Dockerfile b/ci/containers/debian-11-cross-ppc64le.Dockerfile
index bd2d62b0bb..3ae70cfc51 100644
--- a/ci/containers/debian-11-cross-ppc64le.Dockerfile
+++ b/ci/containers/debian-11-cross-ppc64le.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture ppc64el && \
@@ -64,39 +64,39 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-powerpc64le-linux-gnu \
-            libacl1-dev:ppc64el \
-            libapparmor-dev:ppc64el \
-            libattr1-dev:ppc64el \
-            libaudit-dev:ppc64el \
-            libblkid-dev:ppc64el \
-            libc6-dev:ppc64el \
-            libcap-ng-dev:ppc64el \
-            libcurl4-gnutls-dev:ppc64el \
-            libdevmapper-dev:ppc64el \
-            libfuse-dev:ppc64el \
-            libglib2.0-dev:ppc64el \
-            libglusterfs-dev:ppc64el \
-            libgnutls28-dev:ppc64el \
-            libiscsi-dev:ppc64el \
-            libnl-3-dev:ppc64el \
-            libnl-route-3-dev:ppc64el \
-            libnuma-dev:ppc64el \
-            libparted-dev:ppc64el \
-            libpcap0.8-dev:ppc64el \
-            libpciaccess-dev:ppc64el \
-            librbd-dev:ppc64el \
-            libreadline-dev:ppc64el \
-            libsanlock-dev:ppc64el \
-            libsasl2-dev:ppc64el \
-            libselinux1-dev:ppc64el \
-            libssh-gcrypt-dev:ppc64el \
-            libssh2-1-dev:ppc64el \
-            libtirpc-dev:ppc64el \
-            libudev-dev:ppc64el \
-            libxml2-dev:ppc64el \
-            libyajl-dev:ppc64el \
-            systemtap-sdt-dev:ppc64el && \
+                      gcc-powerpc64le-linux-gnu \
+                      libacl1-dev:ppc64el \
+                      libapparmor-dev:ppc64el \
+                      libattr1-dev:ppc64el \
+                      libaudit-dev:ppc64el \
+                      libblkid-dev:ppc64el \
+                      libc6-dev:ppc64el \
+                      libcap-ng-dev:ppc64el \
+                      libcurl4-gnutls-dev:ppc64el \
+                      libdevmapper-dev:ppc64el \
+                      libfuse-dev:ppc64el \
+                      libglib2.0-dev:ppc64el \
+                      libglusterfs-dev:ppc64el \
+                      libgnutls28-dev:ppc64el \
+                      libiscsi-dev:ppc64el \
+                      libnl-3-dev:ppc64el \
+                      libnl-route-3-dev:ppc64el \
+                      libnuma-dev:ppc64el \
+                      libparted-dev:ppc64el \
+                      libpcap0.8-dev:ppc64el \
+                      libpciaccess-dev:ppc64el \
+                      librbd-dev:ppc64el \
+                      libreadline-dev:ppc64el \
+                      libsanlock-dev:ppc64el \
+                      libsasl2-dev:ppc64el \
+                      libselinux1-dev:ppc64el \
+                      libssh-gcrypt-dev:ppc64el \
+                      libssh2-1-dev:ppc64el \
+                      libtirpc-dev:ppc64el \
+                      libudev-dev:ppc64el \
+                      libxml2-dev:ppc64el \
+                      libyajl-dev:ppc64el \
+                      systemtap-sdt-dev:ppc64el && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-11-cross-s390x.Dockerfile b/ci/containers/debian-11-cross-s390x.Dockerfile
index aa73a79210..4a4a582990 100644
--- a/ci/containers/debian-11-cross-s390x.Dockerfile
+++ b/ci/containers/debian-11-cross-s390x.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture s390x && \
@@ -64,39 +64,39 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-s390x-linux-gnu \
-            libacl1-dev:s390x \
-            libapparmor-dev:s390x \
-            libattr1-dev:s390x \
-            libaudit-dev:s390x \
-            libblkid-dev:s390x \
-            libc6-dev:s390x \
-            libcap-ng-dev:s390x \
-            libcurl4-gnutls-dev:s390x \
-            libdevmapper-dev:s390x \
-            libfuse-dev:s390x \
-            libglib2.0-dev:s390x \
-            libglusterfs-dev:s390x \
-            libgnutls28-dev:s390x \
-            libiscsi-dev:s390x \
-            libnl-3-dev:s390x \
-            libnl-route-3-dev:s390x \
-            libnuma-dev:s390x \
-            libparted-dev:s390x \
-            libpcap0.8-dev:s390x \
-            libpciaccess-dev:s390x \
-            librbd-dev:s390x \
-            libreadline-dev:s390x \
-            libsanlock-dev:s390x \
-            libsasl2-dev:s390x \
-            libselinux1-dev:s390x \
-            libssh-gcrypt-dev:s390x \
-            libssh2-1-dev:s390x \
-            libtirpc-dev:s390x \
-            libudev-dev:s390x \
-            libxml2-dev:s390x \
-            libyajl-dev:s390x \
-            systemtap-sdt-dev:s390x && \
+                      gcc-s390x-linux-gnu \
+                      libacl1-dev:s390x \
+                      libapparmor-dev:s390x \
+                      libattr1-dev:s390x \
+                      libaudit-dev:s390x \
+                      libblkid-dev:s390x \
+                      libc6-dev:s390x \
+                      libcap-ng-dev:s390x \
+                      libcurl4-gnutls-dev:s390x \
+                      libdevmapper-dev:s390x \
+                      libfuse-dev:s390x \
+                      libglib2.0-dev:s390x \
+                      libglusterfs-dev:s390x \
+                      libgnutls28-dev:s390x \
+                      libiscsi-dev:s390x \
+                      libnl-3-dev:s390x \
+                      libnl-route-3-dev:s390x \
+                      libnuma-dev:s390x \
+                      libparted-dev:s390x \
+                      libpcap0.8-dev:s390x \
+                      libpciaccess-dev:s390x \
+                      librbd-dev:s390x \
+                      libreadline-dev:s390x \
+                      libsanlock-dev:s390x \
+                      libsasl2-dev:s390x \
+                      libselinux1-dev:s390x \
+                      libssh-gcrypt-dev:s390x \
+                      libssh2-1-dev:s390x \
+                      libtirpc-dev:s390x \
+                      libudev-dev:s390x \
+                      libxml2-dev:s390x \
+                      libyajl-dev:s390x \
+                      systemtap-sdt-dev:s390x && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-11.Dockerfile b/ci/containers/debian-11.Dockerfile
index 2609c83928..3de4061bf4 100644
--- a/ci/containers/debian-11.Dockerfile
+++ b/ci/containers/debian-11.Dockerfile
@@ -11,79 +11,79 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            clang \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gcc \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libacl1-dev \
-            libapparmor-dev \
-            libattr1-dev \
-            libaudit-dev \
-            libblkid-dev \
-            libc-dev-bin \
-            libc6-dev \
-            libcap-ng-dev \
-            libcurl4-gnutls-dev \
-            libdevmapper-dev \
-            libfuse-dev \
-            libglib2.0-dev \
-            libglusterfs-dev \
-            libgnutls28-dev \
-            libiscsi-dev \
-            libnetcf-dev \
-            libnl-3-dev \
-            libnl-route-3-dev \
-            libnuma-dev \
-            libparted-dev \
-            libpcap0.8-dev \
-            libpciaccess-dev \
-            librbd-dev \
-            libreadline-dev \
-            libsanlock-dev \
-            libsasl2-dev \
-            libselinux1-dev \
-            libssh-gcrypt-dev \
-            libssh2-1-dev \
-            libtirpc-dev \
-            libudev-dev \
-            libxen-dev \
-            libxml2-dev \
-            libxml2-utils \
-            libyajl-dev \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            systemtap-sdt-dev \
-            wireshark-dev \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      clang \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gcc \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libacl1-dev \
+                      libapparmor-dev \
+                      libattr1-dev \
+                      libaudit-dev \
+                      libblkid-dev \
+                      libc-dev-bin \
+                      libc6-dev \
+                      libcap-ng-dev \
+                      libcurl4-gnutls-dev \
+                      libdevmapper-dev \
+                      libfuse-dev \
+                      libglib2.0-dev \
+                      libglusterfs-dev \
+                      libgnutls28-dev \
+                      libiscsi-dev \
+                      libnetcf-dev \
+                      libnl-3-dev \
+                      libnl-route-3-dev \
+                      libnuma-dev \
+                      libparted-dev \
+                      libpcap0.8-dev \
+                      libpciaccess-dev \
+                      librbd-dev \
+                      libreadline-dev \
+                      libsanlock-dev \
+                      libsasl2-dev \
+                      libselinux1-dev \
+                      libssh-gcrypt-dev \
+                      libssh2-1-dev \
+                      libtirpc-dev \
+                      libudev-dev \
+                      libxen-dev \
+                      libxml2-dev \
+                      libxml2-utils \
+                      libyajl-dev \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      systemtap-sdt-dev \
+                      wireshark-dev \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
@@ -94,8 +94,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/debian-sid-cross-aarch64.Dockerfile b/ci/containers/debian-sid-cross-aarch64.Dockerfile
index 7e4e5d0b7c..f129d6f3bf 100644
--- a/ci/containers/debian-sid-cross-aarch64.Dockerfile
+++ b/ci/containers/debian-sid-cross-aarch64.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture arm64 && \
@@ -64,40 +64,40 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-aarch64-linux-gnu \
-            libacl1-dev:arm64 \
-            libapparmor-dev:arm64 \
-            libattr1-dev:arm64 \
-            libaudit-dev:arm64 \
-            libblkid-dev:arm64 \
-            libc6-dev:arm64 \
-            libcap-ng-dev:arm64 \
-            libcurl4-gnutls-dev:arm64 \
-            libdevmapper-dev:arm64 \
-            libfuse-dev:arm64 \
-            libglib2.0-dev:arm64 \
-            libglusterfs-dev:arm64 \
-            libgnutls28-dev:arm64 \
-            libiscsi-dev:arm64 \
-            libnl-3-dev:arm64 \
-            libnl-route-3-dev:arm64 \
-            libnuma-dev:arm64 \
-            libparted-dev:arm64 \
-            libpcap0.8-dev:arm64 \
-            libpciaccess-dev:arm64 \
-            librbd-dev:arm64 \
-            libreadline-dev:arm64 \
-            libsanlock-dev:arm64 \
-            libsasl2-dev:arm64 \
-            libselinux1-dev:arm64 \
-            libssh-gcrypt-dev:arm64 \
-            libssh2-1-dev:arm64 \
-            libtirpc-dev:arm64 \
-            libudev-dev:arm64 \
-            libxen-dev:arm64 \
-            libxml2-dev:arm64 \
-            libyajl-dev:arm64 \
-            systemtap-sdt-dev:arm64 && \
+                      gcc-aarch64-linux-gnu \
+                      libacl1-dev:arm64 \
+                      libapparmor-dev:arm64 \
+                      libattr1-dev:arm64 \
+                      libaudit-dev:arm64 \
+                      libblkid-dev:arm64 \
+                      libc6-dev:arm64 \
+                      libcap-ng-dev:arm64 \
+                      libcurl4-gnutls-dev:arm64 \
+                      libdevmapper-dev:arm64 \
+                      libfuse-dev:arm64 \
+                      libglib2.0-dev:arm64 \
+                      libglusterfs-dev:arm64 \
+                      libgnutls28-dev:arm64 \
+                      libiscsi-dev:arm64 \
+                      libnl-3-dev:arm64 \
+                      libnl-route-3-dev:arm64 \
+                      libnuma-dev:arm64 \
+                      libparted-dev:arm64 \
+                      libpcap0.8-dev:arm64 \
+                      libpciaccess-dev:arm64 \
+                      librbd-dev:arm64 \
+                      libreadline-dev:arm64 \
+                      libsanlock-dev:arm64 \
+                      libsasl2-dev:arm64 \
+                      libselinux1-dev:arm64 \
+                      libssh-gcrypt-dev:arm64 \
+                      libssh2-1-dev:arm64 \
+                      libtirpc-dev:arm64 \
+                      libudev-dev:arm64 \
+                      libxen-dev:arm64 \
+                      libxml2-dev:arm64 \
+                      libyajl-dev:arm64 \
+                      systemtap-sdt-dev:arm64 && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-sid-cross-armv6l.Dockerfile b/ci/containers/debian-sid-cross-armv6l.Dockerfile
index c64bf14f67..7fb8b62528 100644
--- a/ci/containers/debian-sid-cross-armv6l.Dockerfile
+++ b/ci/containers/debian-sid-cross-armv6l.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture armel && \
@@ -64,39 +64,39 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-arm-linux-gnueabi \
-            libacl1-dev:armel \
-            libapparmor-dev:armel \
-            libattr1-dev:armel \
-            libaudit-dev:armel \
-            libblkid-dev:armel \
-            libc6-dev:armel \
-            libcap-ng-dev:armel \
-            libcurl4-gnutls-dev:armel \
-            libdevmapper-dev:armel \
-            libfuse-dev:armel \
-            libglib2.0-dev:armel \
-            libglusterfs-dev:armel \
-            libgnutls28-dev:armel \
-            libiscsi-dev:armel \
-            libnl-3-dev:armel \
-            libnl-route-3-dev:armel \
-            libnuma-dev:armel \
-            libparted-dev:armel \
-            libpcap0.8-dev:armel \
-            libpciaccess-dev:armel \
-            librbd-dev:armel \
-            libreadline-dev:armel \
-            libsanlock-dev:armel \
-            libsasl2-dev:armel \
-            libselinux1-dev:armel \
-            libssh-gcrypt-dev:armel \
-            libssh2-1-dev:armel \
-            libtirpc-dev:armel \
-            libudev-dev:armel \
-            libxml2-dev:armel \
-            libyajl-dev:armel \
-            systemtap-sdt-dev:armel && \
+                      gcc-arm-linux-gnueabi \
+                      libacl1-dev:armel \
+                      libapparmor-dev:armel \
+                      libattr1-dev:armel \
+                      libaudit-dev:armel \
+                      libblkid-dev:armel \
+                      libc6-dev:armel \
+                      libcap-ng-dev:armel \
+                      libcurl4-gnutls-dev:armel \
+                      libdevmapper-dev:armel \
+                      libfuse-dev:armel \
+                      libglib2.0-dev:armel \
+                      libglusterfs-dev:armel \
+                      libgnutls28-dev:armel \
+                      libiscsi-dev:armel \
+                      libnl-3-dev:armel \
+                      libnl-route-3-dev:armel \
+                      libnuma-dev:armel \
+                      libparted-dev:armel \
+                      libpcap0.8-dev:armel \
+                      libpciaccess-dev:armel \
+                      librbd-dev:armel \
+                      libreadline-dev:armel \
+                      libsanlock-dev:armel \
+                      libsasl2-dev:armel \
+                      libselinux1-dev:armel \
+                      libssh-gcrypt-dev:armel \
+                      libssh2-1-dev:armel \
+                      libtirpc-dev:armel \
+                      libudev-dev:armel \
+                      libxml2-dev:armel \
+                      libyajl-dev:armel \
+                      systemtap-sdt-dev:armel && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-sid-cross-armv7l.Dockerfile b/ci/containers/debian-sid-cross-armv7l.Dockerfile
index 81604816f7..105fe3cb93 100644
--- a/ci/containers/debian-sid-cross-armv7l.Dockerfile
+++ b/ci/containers/debian-sid-cross-armv7l.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture armhf && \
@@ -64,40 +64,40 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-arm-linux-gnueabihf \
-            libacl1-dev:armhf \
-            libapparmor-dev:armhf \
-            libattr1-dev:armhf \
-            libaudit-dev:armhf \
-            libblkid-dev:armhf \
-            libc6-dev:armhf \
-            libcap-ng-dev:armhf \
-            libcurl4-gnutls-dev:armhf \
-            libdevmapper-dev:armhf \
-            libfuse-dev:armhf \
-            libglib2.0-dev:armhf \
-            libglusterfs-dev:armhf \
-            libgnutls28-dev:armhf \
-            libiscsi-dev:armhf \
-            libnl-3-dev:armhf \
-            libnl-route-3-dev:armhf \
-            libnuma-dev:armhf \
-            libparted-dev:armhf \
-            libpcap0.8-dev:armhf \
-            libpciaccess-dev:armhf \
-            librbd-dev:armhf \
-            libreadline-dev:armhf \
-            libsanlock-dev:armhf \
-            libsasl2-dev:armhf \
-            libselinux1-dev:armhf \
-            libssh-gcrypt-dev:armhf \
-            libssh2-1-dev:armhf \
-            libtirpc-dev:armhf \
-            libudev-dev:armhf \
-            libxen-dev:armhf \
-            libxml2-dev:armhf \
-            libyajl-dev:armhf \
-            systemtap-sdt-dev:armhf && \
+                      gcc-arm-linux-gnueabihf \
+                      libacl1-dev:armhf \
+                      libapparmor-dev:armhf \
+                      libattr1-dev:armhf \
+                      libaudit-dev:armhf \
+                      libblkid-dev:armhf \
+                      libc6-dev:armhf \
+                      libcap-ng-dev:armhf \
+                      libcurl4-gnutls-dev:armhf \
+                      libdevmapper-dev:armhf \
+                      libfuse-dev:armhf \
+                      libglib2.0-dev:armhf \
+                      libglusterfs-dev:armhf \
+                      libgnutls28-dev:armhf \
+                      libiscsi-dev:armhf \
+                      libnl-3-dev:armhf \
+                      libnl-route-3-dev:armhf \
+                      libnuma-dev:armhf \
+                      libparted-dev:armhf \
+                      libpcap0.8-dev:armhf \
+                      libpciaccess-dev:armhf \
+                      librbd-dev:armhf \
+                      libreadline-dev:armhf \
+                      libsanlock-dev:armhf \
+                      libsasl2-dev:armhf \
+                      libselinux1-dev:armhf \
+                      libssh-gcrypt-dev:armhf \
+                      libssh2-1-dev:armhf \
+                      libtirpc-dev:armhf \
+                      libudev-dev:armhf \
+                      libxen-dev:armhf \
+                      libxml2-dev:armhf \
+                      libyajl-dev:armhf \
+                      systemtap-sdt-dev:armhf && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-sid-cross-i686.Dockerfile b/ci/containers/debian-sid-cross-i686.Dockerfile
index 4f0f1a992a..74e21c3d06 100644
--- a/ci/containers/debian-sid-cross-i686.Dockerfile
+++ b/ci/containers/debian-sid-cross-i686.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture i386 && \
@@ -64,39 +64,39 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-i686-linux-gnu \
-            libacl1-dev:i386 \
-            libapparmor-dev:i386 \
-            libattr1-dev:i386 \
-            libaudit-dev:i386 \
-            libblkid-dev:i386 \
-            libc6-dev:i386 \
-            libcap-ng-dev:i386 \
-            libcurl4-gnutls-dev:i386 \
-            libdevmapper-dev:i386 \
-            libfuse-dev:i386 \
-            libglib2.0-dev:i386 \
-            libglusterfs-dev:i386 \
-            libgnutls28-dev:i386 \
-            libiscsi-dev:i386 \
-            libnl-3-dev:i386 \
-            libnl-route-3-dev:i386 \
-            libnuma-dev:i386 \
-            libparted-dev:i386 \
-            libpcap0.8-dev:i386 \
-            libpciaccess-dev:i386 \
-            librbd-dev:i386 \
-            libreadline-dev:i386 \
-            libsanlock-dev:i386 \
-            libsasl2-dev:i386 \
-            libselinux1-dev:i386 \
-            libssh-gcrypt-dev:i386 \
-            libssh2-1-dev:i386 \
-            libtirpc-dev:i386 \
-            libudev-dev:i386 \
-            libxml2-dev:i386 \
-            libyajl-dev:i386 \
-            systemtap-sdt-dev:i386 && \
+                      gcc-i686-linux-gnu \
+                      libacl1-dev:i386 \
+                      libapparmor-dev:i386 \
+                      libattr1-dev:i386 \
+                      libaudit-dev:i386 \
+                      libblkid-dev:i386 \
+                      libc6-dev:i386 \
+                      libcap-ng-dev:i386 \
+                      libcurl4-gnutls-dev:i386 \
+                      libdevmapper-dev:i386 \
+                      libfuse-dev:i386 \
+                      libglib2.0-dev:i386 \
+                      libglusterfs-dev:i386 \
+                      libgnutls28-dev:i386 \
+                      libiscsi-dev:i386 \
+                      libnl-3-dev:i386 \
+                      libnl-route-3-dev:i386 \
+                      libnuma-dev:i386 \
+                      libparted-dev:i386 \
+                      libpcap0.8-dev:i386 \
+                      libpciaccess-dev:i386 \
+                      librbd-dev:i386 \
+                      libreadline-dev:i386 \
+                      libsanlock-dev:i386 \
+                      libsasl2-dev:i386 \
+                      libselinux1-dev:i386 \
+                      libssh-gcrypt-dev:i386 \
+                      libssh2-1-dev:i386 \
+                      libtirpc-dev:i386 \
+                      libudev-dev:i386 \
+                      libxml2-dev:i386 \
+                      libyajl-dev:i386 \
+                      systemtap-sdt-dev:i386 && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-sid-cross-mips64el.Dockerfile b/ci/containers/debian-sid-cross-mips64el.Dockerfile
index c6186a2454..4af1ccd2e5 100644
--- a/ci/containers/debian-sid-cross-mips64el.Dockerfile
+++ b/ci/containers/debian-sid-cross-mips64el.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture mips64el && \
@@ -64,39 +64,39 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-mips64el-linux-gnuabi64 \
-            libacl1-dev:mips64el \
-            libapparmor-dev:mips64el \
-            libattr1-dev:mips64el \
-            libaudit-dev:mips64el \
-            libblkid-dev:mips64el \
-            libc6-dev:mips64el \
-            libcap-ng-dev:mips64el \
-            libcurl4-gnutls-dev:mips64el \
-            libdevmapper-dev:mips64el \
-            libfuse-dev:mips64el \
-            libglib2.0-dev:mips64el \
-            libglusterfs-dev:mips64el \
-            libgnutls28-dev:mips64el \
-            libiscsi-dev:mips64el \
-            libnl-3-dev:mips64el \
-            libnl-route-3-dev:mips64el \
-            libnuma-dev:mips64el \
-            libparted-dev:mips64el \
-            libpcap0.8-dev:mips64el \
-            libpciaccess-dev:mips64el \
-            librbd-dev:mips64el \
-            libreadline-dev:mips64el \
-            libsanlock-dev:mips64el \
-            libsasl2-dev:mips64el \
-            libselinux1-dev:mips64el \
-            libssh-gcrypt-dev:mips64el \
-            libssh2-1-dev:mips64el \
-            libtirpc-dev:mips64el \
-            libudev-dev:mips64el \
-            libxml2-dev:mips64el \
-            libyajl-dev:mips64el \
-            systemtap-sdt-dev:mips64el && \
+                      gcc-mips64el-linux-gnuabi64 \
+                      libacl1-dev:mips64el \
+                      libapparmor-dev:mips64el \
+                      libattr1-dev:mips64el \
+                      libaudit-dev:mips64el \
+                      libblkid-dev:mips64el \
+                      libc6-dev:mips64el \
+                      libcap-ng-dev:mips64el \
+                      libcurl4-gnutls-dev:mips64el \
+                      libdevmapper-dev:mips64el \
+                      libfuse-dev:mips64el \
+                      libglib2.0-dev:mips64el \
+                      libglusterfs-dev:mips64el \
+                      libgnutls28-dev:mips64el \
+                      libiscsi-dev:mips64el \
+                      libnl-3-dev:mips64el \
+                      libnl-route-3-dev:mips64el \
+                      libnuma-dev:mips64el \
+                      libparted-dev:mips64el \
+                      libpcap0.8-dev:mips64el \
+                      libpciaccess-dev:mips64el \
+                      librbd-dev:mips64el \
+                      libreadline-dev:mips64el \
+                      libsanlock-dev:mips64el \
+                      libsasl2-dev:mips64el \
+                      libselinux1-dev:mips64el \
+                      libssh-gcrypt-dev:mips64el \
+                      libssh2-1-dev:mips64el \
+                      libtirpc-dev:mips64el \
+                      libudev-dev:mips64el \
+                      libxml2-dev:mips64el \
+                      libyajl-dev:mips64el \
+                      systemtap-sdt-dev:mips64el && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-sid-cross-mipsel.Dockerfile b/ci/containers/debian-sid-cross-mipsel.Dockerfile
index eece32d2da..3227c9b948 100644
--- a/ci/containers/debian-sid-cross-mipsel.Dockerfile
+++ b/ci/containers/debian-sid-cross-mipsel.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture mipsel && \
@@ -64,39 +64,39 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-mipsel-linux-gnu \
-            libacl1-dev:mipsel \
-            libapparmor-dev:mipsel \
-            libattr1-dev:mipsel \
-            libaudit-dev:mipsel \
-            libblkid-dev:mipsel \
-            libc6-dev:mipsel \
-            libcap-ng-dev:mipsel \
-            libcurl4-gnutls-dev:mipsel \
-            libdevmapper-dev:mipsel \
-            libfuse-dev:mipsel \
-            libglib2.0-dev:mipsel \
-            libglusterfs-dev:mipsel \
-            libgnutls28-dev:mipsel \
-            libiscsi-dev:mipsel \
-            libnl-3-dev:mipsel \
-            libnl-route-3-dev:mipsel \
-            libnuma-dev:mipsel \
-            libparted-dev:mipsel \
-            libpcap0.8-dev:mipsel \
-            libpciaccess-dev:mipsel \
-            librbd-dev:mipsel \
-            libreadline-dev:mipsel \
-            libsanlock-dev:mipsel \
-            libsasl2-dev:mipsel \
-            libselinux1-dev:mipsel \
-            libssh-gcrypt-dev:mipsel \
-            libssh2-1-dev:mipsel \
-            libtirpc-dev:mipsel \
-            libudev-dev:mipsel \
-            libxml2-dev:mipsel \
-            libyajl-dev:mipsel \
-            systemtap-sdt-dev:mipsel && \
+                      gcc-mipsel-linux-gnu \
+                      libacl1-dev:mipsel \
+                      libapparmor-dev:mipsel \
+                      libattr1-dev:mipsel \
+                      libaudit-dev:mipsel \
+                      libblkid-dev:mipsel \
+                      libc6-dev:mipsel \
+                      libcap-ng-dev:mipsel \
+                      libcurl4-gnutls-dev:mipsel \
+                      libdevmapper-dev:mipsel \
+                      libfuse-dev:mipsel \
+                      libglib2.0-dev:mipsel \
+                      libglusterfs-dev:mipsel \
+                      libgnutls28-dev:mipsel \
+                      libiscsi-dev:mipsel \
+                      libnl-3-dev:mipsel \
+                      libnl-route-3-dev:mipsel \
+                      libnuma-dev:mipsel \
+                      libparted-dev:mipsel \
+                      libpcap0.8-dev:mipsel \
+                      libpciaccess-dev:mipsel \
+                      librbd-dev:mipsel \
+                      libreadline-dev:mipsel \
+                      libsanlock-dev:mipsel \
+                      libsasl2-dev:mipsel \
+                      libselinux1-dev:mipsel \
+                      libssh-gcrypt-dev:mipsel \
+                      libssh2-1-dev:mipsel \
+                      libtirpc-dev:mipsel \
+                      libudev-dev:mipsel \
+                      libxml2-dev:mipsel \
+                      libyajl-dev:mipsel \
+                      systemtap-sdt-dev:mipsel && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-sid-cross-ppc64le.Dockerfile b/ci/containers/debian-sid-cross-ppc64le.Dockerfile
index 1605ca2771..83d7c87ffe 100644
--- a/ci/containers/debian-sid-cross-ppc64le.Dockerfile
+++ b/ci/containers/debian-sid-cross-ppc64le.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture ppc64el && \
@@ -64,39 +64,39 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-powerpc64le-linux-gnu \
-            libacl1-dev:ppc64el \
-            libapparmor-dev:ppc64el \
-            libattr1-dev:ppc64el \
-            libaudit-dev:ppc64el \
-            libblkid-dev:ppc64el \
-            libc6-dev:ppc64el \
-            libcap-ng-dev:ppc64el \
-            libcurl4-gnutls-dev:ppc64el \
-            libdevmapper-dev:ppc64el \
-            libfuse-dev:ppc64el \
-            libglib2.0-dev:ppc64el \
-            libglusterfs-dev:ppc64el \
-            libgnutls28-dev:ppc64el \
-            libiscsi-dev:ppc64el \
-            libnl-3-dev:ppc64el \
-            libnl-route-3-dev:ppc64el \
-            libnuma-dev:ppc64el \
-            libparted-dev:ppc64el \
-            libpcap0.8-dev:ppc64el \
-            libpciaccess-dev:ppc64el \
-            librbd-dev:ppc64el \
-            libreadline-dev:ppc64el \
-            libsanlock-dev:ppc64el \
-            libsasl2-dev:ppc64el \
-            libselinux1-dev:ppc64el \
-            libssh-gcrypt-dev:ppc64el \
-            libssh2-1-dev:ppc64el \
-            libtirpc-dev:ppc64el \
-            libudev-dev:ppc64el \
-            libxml2-dev:ppc64el \
-            libyajl-dev:ppc64el \
-            systemtap-sdt-dev:ppc64el && \
+                      gcc-powerpc64le-linux-gnu \
+                      libacl1-dev:ppc64el \
+                      libapparmor-dev:ppc64el \
+                      libattr1-dev:ppc64el \
+                      libaudit-dev:ppc64el \
+                      libblkid-dev:ppc64el \
+                      libc6-dev:ppc64el \
+                      libcap-ng-dev:ppc64el \
+                      libcurl4-gnutls-dev:ppc64el \
+                      libdevmapper-dev:ppc64el \
+                      libfuse-dev:ppc64el \
+                      libglib2.0-dev:ppc64el \
+                      libglusterfs-dev:ppc64el \
+                      libgnutls28-dev:ppc64el \
+                      libiscsi-dev:ppc64el \
+                      libnl-3-dev:ppc64el \
+                      libnl-route-3-dev:ppc64el \
+                      libnuma-dev:ppc64el \
+                      libparted-dev:ppc64el \
+                      libpcap0.8-dev:ppc64el \
+                      libpciaccess-dev:ppc64el \
+                      librbd-dev:ppc64el \
+                      libreadline-dev:ppc64el \
+                      libsanlock-dev:ppc64el \
+                      libsasl2-dev:ppc64el \
+                      libselinux1-dev:ppc64el \
+                      libssh-gcrypt-dev:ppc64el \
+                      libssh2-1-dev:ppc64el \
+                      libtirpc-dev:ppc64el \
+                      libudev-dev:ppc64el \
+                      libxml2-dev:ppc64el \
+                      libyajl-dev:ppc64el \
+                      systemtap-sdt-dev:ppc64el && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-sid-cross-s390x.Dockerfile b/ci/containers/debian-sid-cross-s390x.Dockerfile
index 7b5a6b4b79..735790cbcd 100644
--- a/ci/containers/debian-sid-cross-s390x.Dockerfile
+++ b/ci/containers/debian-sid-cross-s390x.Dockerfile
@@ -11,52 +11,52 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libc-dev-bin \
-            libxml2-utils \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libc-dev-bin \
+                      libxml2-utils \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
     dpkg-reconfigure locales
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN export DEBIAN_FRONTEND=noninteractive && \
     dpkg --add-architecture s390x && \
@@ -64,39 +64,39 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y dpkg-dev && \
     eatmydata apt-get install --no-install-recommends -y \
-            gcc-s390x-linux-gnu \
-            libacl1-dev:s390x \
-            libapparmor-dev:s390x \
-            libattr1-dev:s390x \
-            libaudit-dev:s390x \
-            libblkid-dev:s390x \
-            libc6-dev:s390x \
-            libcap-ng-dev:s390x \
-            libcurl4-gnutls-dev:s390x \
-            libdevmapper-dev:s390x \
-            libfuse-dev:s390x \
-            libglib2.0-dev:s390x \
-            libglusterfs-dev:s390x \
-            libgnutls28-dev:s390x \
-            libiscsi-dev:s390x \
-            libnl-3-dev:s390x \
-            libnl-route-3-dev:s390x \
-            libnuma-dev:s390x \
-            libparted-dev:s390x \
-            libpcap0.8-dev:s390x \
-            libpciaccess-dev:s390x \
-            librbd-dev:s390x \
-            libreadline-dev:s390x \
-            libsanlock-dev:s390x \
-            libsasl2-dev:s390x \
-            libselinux1-dev:s390x \
-            libssh-gcrypt-dev:s390x \
-            libssh2-1-dev:s390x \
-            libtirpc-dev:s390x \
-            libudev-dev:s390x \
-            libxml2-dev:s390x \
-            libyajl-dev:s390x \
-            systemtap-sdt-dev:s390x && \
+                      gcc-s390x-linux-gnu \
+                      libacl1-dev:s390x \
+                      libapparmor-dev:s390x \
+                      libattr1-dev:s390x \
+                      libaudit-dev:s390x \
+                      libblkid-dev:s390x \
+                      libc6-dev:s390x \
+                      libcap-ng-dev:s390x \
+                      libcurl4-gnutls-dev:s390x \
+                      libdevmapper-dev:s390x \
+                      libfuse-dev:s390x \
+                      libglib2.0-dev:s390x \
+                      libglusterfs-dev:s390x \
+                      libgnutls28-dev:s390x \
+                      libiscsi-dev:s390x \
+                      libnl-3-dev:s390x \
+                      libnl-route-3-dev:s390x \
+                      libnuma-dev:s390x \
+                      libparted-dev:s390x \
+                      libpcap0.8-dev:s390x \
+                      libpciaccess-dev:s390x \
+                      librbd-dev:s390x \
+                      libreadline-dev:s390x \
+                      libsanlock-dev:s390x \
+                      libsasl2-dev:s390x \
+                      libselinux1-dev:s390x \
+                      libssh-gcrypt-dev:s390x \
+                      libssh2-1-dev:s390x \
+                      libtirpc-dev:s390x \
+                      libudev-dev:s390x \
+                      libxml2-dev:s390x \
+                      libyajl-dev:s390x \
+                      systemtap-sdt-dev:s390x && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     mkdir -p /usr/local/share/meson/cross && \
diff --git a/ci/containers/debian-sid.Dockerfile b/ci/containers/debian-sid.Dockerfile
index 52f1724415..9c08afdb3d 100644
--- a/ci/containers/debian-sid.Dockerfile
+++ b/ci/containers/debian-sid.Dockerfile
@@ -11,78 +11,78 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            clang \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gcc \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libacl1-dev \
-            libapparmor-dev \
-            libattr1-dev \
-            libaudit-dev \
-            libblkid-dev \
-            libc-dev-bin \
-            libc6-dev \
-            libcap-ng-dev \
-            libcurl4-gnutls-dev \
-            libdevmapper-dev \
-            libfuse-dev \
-            libglib2.0-dev \
-            libglusterfs-dev \
-            libgnutls28-dev \
-            libiscsi-dev \
-            libnl-3-dev \
-            libnl-route-3-dev \
-            libnuma-dev \
-            libparted-dev \
-            libpcap0.8-dev \
-            libpciaccess-dev \
-            librbd-dev \
-            libreadline-dev \
-            libsanlock-dev \
-            libsasl2-dev \
-            libselinux1-dev \
-            libssh-gcrypt-dev \
-            libssh2-1-dev \
-            libtirpc-dev \
-            libudev-dev \
-            libxen-dev \
-            libxml2-dev \
-            libxml2-utils \
-            libyajl-dev \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            systemtap-sdt-dev \
-            wireshark-dev \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      clang \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gcc \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libacl1-dev \
+                      libapparmor-dev \
+                      libattr1-dev \
+                      libaudit-dev \
+                      libblkid-dev \
+                      libc-dev-bin \
+                      libc6-dev \
+                      libcap-ng-dev \
+                      libcurl4-gnutls-dev \
+                      libdevmapper-dev \
+                      libfuse-dev \
+                      libglib2.0-dev \
+                      libglusterfs-dev \
+                      libgnutls28-dev \
+                      libiscsi-dev \
+                      libnl-3-dev \
+                      libnl-route-3-dev \
+                      libnuma-dev \
+                      libparted-dev \
+                      libpcap0.8-dev \
+                      libpciaccess-dev \
+                      librbd-dev \
+                      libreadline-dev \
+                      libsanlock-dev \
+                      libsasl2-dev \
+                      libselinux1-dev \
+                      libssh-gcrypt-dev \
+                      libssh2-1-dev \
+                      libtirpc-dev \
+                      libudev-dev \
+                      libxen-dev \
+                      libxml2-dev \
+                      libxml2-utils \
+                      libyajl-dev \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      systemtap-sdt-dev \
+                      wireshark-dev \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
@@ -93,8 +93,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/fedora-35.Dockerfile b/ci/containers/fedora-35.Dockerfile
index 7f39e9b424..f517cf9443 100644
--- a/ci/containers/fedora-35.Dockerfile
+++ b/ci/containers/fedora-35.Dockerfile
@@ -18,82 +18,82 @@ exec "$@"' > /usr/bin/nosync && \
     chmod +x /usr/bin/nosync && \
     nosync dnf update -y && \
     nosync dnf install -y \
-        audit-libs-devel \
-        augeas \
-        bash-completion \
-        ca-certificates \
-        ccache \
-        clang \
-        codespell \
-        cpp \
-        cppi \
-        cyrus-sasl-devel \
-        device-mapper-devel \
-        diffutils \
-        dwarves \
-        ebtables \
-        firewalld-filesystem \
-        fuse-devel \
-        gcc \
-        gettext \
-        git \
-        glib2-devel \
-        glibc-devel \
-        glibc-langpack-en \
-        glusterfs-api-devel \
-        gnutls-devel \
-        grep \
-        iproute \
-        iproute-tc \
-        iptables \
-        iscsi-initiator-utils \
-        kmod \
-        libacl-devel \
-        libattr-devel \
-        libblkid-devel \
-        libcap-ng-devel \
-        libcurl-devel \
-        libiscsi-devel \
-        libnl3-devel \
-        libpcap-devel \
-        libpciaccess-devel \
-        librbd-devel \
-        libselinux-devel \
-        libssh-devel \
-        libssh2-devel \
-        libtirpc-devel \
-        libwsman-devel \
-        libxml2 \
-        libxml2-devel \
-        libxslt \
-        lvm2 \
-        make \
-        meson \
-        netcf-devel \
-        nfs-utils \
-        ninja-build \
-        numactl-devel \
-        numad \
-        parted-devel \
-        perl-base \
-        pkgconfig \
-        polkit \
-        python3 \
-        python3-docutils \
-        python3-flake8 \
-        qemu-img \
-        readline-devel \
-        rpcgen \
-        rpm-build \
-        sanlock-devel \
-        scrub \
-        sed \
-        systemd-devel \
-        systemd-rpm-macros \
-        systemtap-sdt-devel \
-        wireshark-devel \
-        xen-devel \
-        yajl-devel && \
+               audit-libs-devel \
+               augeas \
+               bash-completion \
+               ca-certificates \
+               ccache \
+               clang \
+               codespell \
+               cpp \
+               cppi \
+               cyrus-sasl-devel \
+               device-mapper-devel \
+               diffutils \
+               dwarves \
+               ebtables \
+               firewalld-filesystem \
+               fuse-devel \
+               gcc \
+               gettext \
+               git \
+               glib2-devel \
+               glibc-devel \
+               glibc-langpack-en \
+               glusterfs-api-devel \
+               gnutls-devel \
+               grep \
+               iproute \
+               iproute-tc \
+               iptables \
+               iscsi-initiator-utils \
+               kmod \
+               libacl-devel \
+               libattr-devel \
+               libblkid-devel \
+               libcap-ng-devel \
+               libcurl-devel \
+               libiscsi-devel \
+               libnl3-devel \
+               libpcap-devel \
+               libpciaccess-devel \
+               librbd-devel \
+               libselinux-devel \
+               libssh-devel \
+               libssh2-devel \
+               libtirpc-devel \
+               libwsman-devel \
+               libxml2 \
+               libxml2-devel \
+               libxslt \
+               lvm2 \
+               make \
+               meson \
+               netcf-devel \
+               nfs-utils \
+               ninja-build \
+               numactl-devel \
+               numad \
+               parted-devel \
+               perl-base \
+               pkgconfig \
+               polkit \
+               python3 \
+               python3-docutils \
+               python3-flake8 \
+               qemu-img \
+               readline-devel \
+               rpcgen \
+               rpm-build \
+               sanlock-devel \
+               scrub \
+               sed \
+               systemd-devel \
+               systemd-rpm-macros \
+               systemtap-sdt-devel \
+               wireshark-devel \
+               xen-devel \
+               yajl-devel && \
     nosync dnf autoremove -y && \
     nosync dnf clean all -y && \
     rpm -qa | sort > /packages.txt && \
@@ -102,8 +102,8 @@ exec "$@"' > /usr/bin/nosync && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/fedora-36-cross-mingw32.Dockerfile b/ci/containers/fedora-36-cross-mingw32.Dockerfile
index 3fec6a3ee8..24b2760c18 100644
--- a/ci/containers/fedora-36-cross-mingw32.Dockerfile
+++ b/ci/containers/fedora-36-cross-mingw32.Dockerfile
@@ -18,66 +18,66 @@ exec "$@"' > /usr/bin/nosync && \
     chmod +x /usr/bin/nosync && \
     nosync dnf update -y && \
     nosync dnf install -y \
-        augeas \
-        bash-completion \
-        ca-certificates \
-        ccache \
-        codespell \
-        cpp \
-        cppi \
-        diffutils \
-        dwarves \
-        ebtables \
-        firewalld-filesystem \
-        git \
-        glibc-langpack-en \
-        grep \
-        iproute \
-        iproute-tc \
-        iptables \
-        iscsi-initiator-utils \
-        kmod \
-        libxml2 \
-        libxslt \
-        lvm2 \
-        make \
-        meson \
-        nfs-utils \
-        ninja-build \
-        numad \
-        perl-base \
-        polkit \
-        python3 \
-        python3-docutils \
-        python3-flake8 \
-        qemu-img \
-        rpcgen \
-        rpm-build \
-        scrub \
-        sed \
-        systemd-rpm-macros && \
+               augeas \
+               bash-completion \
+               ca-certificates \
+               ccache \
+               codespell \
+               cpp \
+               cppi \
+               diffutils \
+               dwarves \
+               ebtables \
+               firewalld-filesystem \
+               git \
+               glibc-langpack-en \
+               grep \
+               iproute \
+               iproute-tc \
+               iptables \
+               iscsi-initiator-utils \
+               kmod \
+               libxml2 \
+               libxslt \
+               lvm2 \
+               make \
+               meson \
+               nfs-utils \
+               ninja-build \
+               numad \
+               perl-base \
+               polkit \
+               python3 \
+               python3-docutils \
+               python3-flake8 \
+               qemu-img \
+               rpcgen \
+               rpm-build \
+               scrub \
+               sed \
+               systemd-rpm-macros && \
     nosync dnf autoremove -y && \
     nosync dnf clean all -y
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN nosync dnf install -y \
-        mingw32-curl \
-        mingw32-dlfcn \
-        mingw32-gcc \
-        mingw32-gettext \
-        mingw32-glib2 \
-        mingw32-gnutls \
-        mingw32-headers \
-        mingw32-libssh2 \
-        mingw32-libxml2 \
-        mingw32-pkg-config \
-        mingw32-portablexdr \
-        mingw32-readline && \
+               mingw32-curl \
+               mingw32-dlfcn \
+               mingw32-gcc \
+               mingw32-gettext \
+               mingw32-glib2 \
+               mingw32-gnutls \
+               mingw32-headers \
+               mingw32-libssh2 \
+               mingw32-libxml2 \
+               mingw32-pkg-config \
+               mingw32-portablexdr \
+               mingw32-readline && \
     nosync dnf clean all -y && \
     rpm -qa | sort > /packages.txt && \
     mkdir -p /usr/libexec/ccache-wrappers && \
diff --git a/ci/containers/fedora-36-cross-mingw64.Dockerfile b/ci/containers/fedora-36-cross-mingw64.Dockerfile
index 3874f61557..a3369209da 100644
--- a/ci/containers/fedora-36-cross-mingw64.Dockerfile
+++ b/ci/containers/fedora-36-cross-mingw64.Dockerfile
@@ -18,66 +18,66 @@ exec "$@"' > /usr/bin/nosync && \
     chmod +x /usr/bin/nosync && \
     nosync dnf update -y && \
     nosync dnf install -y \
-        augeas \
-        bash-completion \
-        ca-certificates \
-        ccache \
-        codespell \
-        cpp \
-        cppi \
-        diffutils \
-        dwarves \
-        ebtables \
-        firewalld-filesystem \
-        git \
-        glibc-langpack-en \
-        grep \
-        iproute \
-        iproute-tc \
-        iptables \
-        iscsi-initiator-utils \
-        kmod \
-        libxml2 \
-        libxslt \
-        lvm2 \
-        make \
-        meson \
-        nfs-utils \
-        ninja-build \
-        numad \
-        perl-base \
-        polkit \
-        python3 \
-        python3-docutils \
-        python3-flake8 \
-        qemu-img \
-        rpcgen \
-        rpm-build \
-        scrub \
-        sed \
-        systemd-rpm-macros && \
+               augeas \
+               bash-completion \
+               ca-certificates \
+               ccache \
+               codespell \
+               cpp \
+               cppi \
+               diffutils \
+               dwarves \
+               ebtables \
+               firewalld-filesystem \
+               git \
+               glibc-langpack-en \
+               grep \
+               iproute \
+               iproute-tc \
+               iptables \
+               iscsi-initiator-utils \
+               kmod \
+               libxml2 \
+               libxslt \
+               lvm2 \
+               make \
+               meson \
+               nfs-utils \
+               ninja-build \
+               numad \
+               perl-base \
+               polkit \
+               python3 \
+               python3-docutils \
+               python3-flake8 \
+               qemu-img \
+               rpcgen \
+               rpm-build \
+               scrub \
+               sed \
+               systemd-rpm-macros && \
     nosync dnf autoremove -y && \
     nosync dnf clean all -y
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN nosync dnf install -y \
-        mingw64-curl \
-        mingw64-dlfcn \
-        mingw64-gcc \
-        mingw64-gettext \
-        mingw64-glib2 \
-        mingw64-gnutls \
-        mingw64-headers \
-        mingw64-libssh2 \
-        mingw64-libxml2 \
-        mingw64-pkg-config \
-        mingw64-portablexdr \
-        mingw64-readline && \
+               mingw64-curl \
+               mingw64-dlfcn \
+               mingw64-gcc \
+               mingw64-gettext \
+               mingw64-glib2 \
+               mingw64-gnutls \
+               mingw64-headers \
+               mingw64-libssh2 \
+               mingw64-libxml2 \
+               mingw64-pkg-config \
+               mingw64-portablexdr \
+               mingw64-readline && \
     nosync dnf clean all -y && \
     rpm -qa | sort > /packages.txt && \
     mkdir -p /usr/libexec/ccache-wrappers && \
diff --git a/ci/containers/fedora-36.Dockerfile b/ci/containers/fedora-36.Dockerfile
index 895f2649fd..3fa19e3c2c 100644
--- a/ci/containers/fedora-36.Dockerfile
+++ b/ci/containers/fedora-36.Dockerfile
@@ -18,81 +18,81 @@ exec "$@"' > /usr/bin/nosync && \
     chmod +x /usr/bin/nosync && \
     nosync dnf update -y && \
     nosync dnf install -y \
-        audit-libs-devel \
-        augeas \
-        bash-completion \
-        ca-certificates \
-        ccache \
-        clang \
-        codespell \
-        cpp \
-        cppi \
-        cyrus-sasl-devel \
-        device-mapper-devel \
-        diffutils \
-        dwarves \
-        ebtables \
-        firewalld-filesystem \
-        fuse-devel \
-        gcc \
-        gettext \
-        git \
-        glib2-devel \
-        glibc-devel \
-        glibc-langpack-en \
-        glusterfs-api-devel \
-        gnutls-devel \
-        grep \
-        iproute \
-        iproute-tc \
-        iptables \
-        iscsi-initiator-utils \
-        kmod \
-        libacl-devel \
-        libattr-devel \
-        libblkid-devel \
-        libcap-ng-devel \
-        libcurl-devel \
-        libiscsi-devel \
-        libnl3-devel \
-        libpcap-devel \
-        libpciaccess-devel \
-        librbd-devel \
-        libselinux-devel \
-        libssh-devel \
-        libssh2-devel \
-        libtirpc-devel \
-        libwsman-devel \
-        libxml2 \
-        libxml2-devel \
-        libxslt \
-        lvm2 \
-        make \
-        meson \
-        nfs-utils \
-        ninja-build \
-        numactl-devel \
-        numad \
-        parted-devel \
-        perl-base \
-        pkgconfig \
-        polkit \
-        python3 \
-        python3-docutils \
-        python3-flake8 \
-        qemu-img \
-        readline-devel \
-        rpcgen \
-        rpm-build \
-        sanlock-devel \
-        scrub \
-        sed \
-        systemd-devel \
-        systemd-rpm-macros \
-        systemtap-sdt-devel \
-        wireshark-devel \
-        xen-devel \
-        yajl-devel && \
+               audit-libs-devel \
+               augeas \
+               bash-completion \
+               ca-certificates \
+               ccache \
+               clang \
+               codespell \
+               cpp \
+               cppi \
+               cyrus-sasl-devel \
+               device-mapper-devel \
+               diffutils \
+               dwarves \
+               ebtables \
+               firewalld-filesystem \
+               fuse-devel \
+               gcc \
+               gettext \
+               git \
+               glib2-devel \
+               glibc-devel \
+               glibc-langpack-en \
+               glusterfs-api-devel \
+               gnutls-devel \
+               grep \
+               iproute \
+               iproute-tc \
+               iptables \
+               iscsi-initiator-utils \
+               kmod \
+               libacl-devel \
+               libattr-devel \
+               libblkid-devel \
+               libcap-ng-devel \
+               libcurl-devel \
+               libiscsi-devel \
+               libnl3-devel \
+               libpcap-devel \
+               libpciaccess-devel \
+               librbd-devel \
+               libselinux-devel \
+               libssh-devel \
+               libssh2-devel \
+               libtirpc-devel \
+               libwsman-devel \
+               libxml2 \
+               libxml2-devel \
+               libxslt \
+               lvm2 \
+               make \
+               meson \
+               nfs-utils \
+               ninja-build \
+               numactl-devel \
+               numad \
+               parted-devel \
+               perl-base \
+               pkgconfig \
+               polkit \
+               python3 \
+               python3-docutils \
+               python3-flake8 \
+               qemu-img \
+               readline-devel \
+               rpcgen \
+               rpm-build \
+               sanlock-devel \
+               scrub \
+               sed \
+               systemd-devel \
+               systemd-rpm-macros \
+               systemtap-sdt-devel \
+               wireshark-devel \
+               xen-devel \
+               yajl-devel && \
     nosync dnf autoremove -y && \
     nosync dnf clean all -y && \
     rpm -qa | sort > /packages.txt && \
@@ -101,8 +101,8 @@ exec "$@"' > /usr/bin/nosync && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/fedora-rawhide-cross-mingw32.Dockerfile b/ci/containers/fedora-rawhide-cross-mingw32.Dockerfile
index 522ee668e7..a574acfde4 100644
--- a/ci/containers/fedora-rawhide-cross-mingw32.Dockerfile
+++ b/ci/containers/fedora-rawhide-cross-mingw32.Dockerfile
@@ -19,66 +19,66 @@ exec "$@"' > /usr/bin/nosync && \
     chmod +x /usr/bin/nosync && \
     nosync dnf distro-sync -y && \
     nosync dnf install -y \
-        augeas \
-        bash-completion \
-        ca-certificates \
-        ccache \
-        codespell \
-        cpp \
-        cppi \
-        diffutils \
-        dwarves \
-        ebtables \
-        firewalld-filesystem \
-        git \
-        glibc-langpack-en \
-        grep \
-        iproute \
-        iproute-tc \
-        iptables \
-        iscsi-initiator-utils \
-        kmod \
-        libxml2 \
-        libxslt \
-        lvm2 \
-        make \
-        meson \
-        nfs-utils \
-        ninja-build \
-        numad \
-        perl-base \
-        polkit \
-        python3 \
-        python3-docutils \
-        python3-flake8 \
-        qemu-img \
-        rpcgen \
-        rpm-build \
-        scrub \
-        sed \
-        systemd-rpm-macros && \
+               augeas \
+               bash-completion \
+               ca-certificates \
+               ccache \
+               codespell \
+               cpp \
+               cppi \
+               diffutils \
+               dwarves \
+               ebtables \
+               firewalld-filesystem \
+               git \
+               glibc-langpack-en \
+               grep \
+               iproute \
+               iproute-tc \
+               iptables \
+               iscsi-initiator-utils \
+               kmod \
+               libxml2 \
+               libxslt \
+               lvm2 \
+               make \
+               meson \
+               nfs-utils \
+               ninja-build \
+               numad \
+               perl-base \
+               polkit \
+               python3 \
+               python3-docutils \
+               python3-flake8 \
+               qemu-img \
+               rpcgen \
+               rpm-build \
+               scrub \
+               sed \
+               systemd-rpm-macros && \
     nosync dnf autoremove -y && \
     nosync dnf clean all -y
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN nosync dnf install -y \
-        mingw32-curl \
-        mingw32-dlfcn \
-        mingw32-gcc \
-        mingw32-gettext \
-        mingw32-glib2 \
-        mingw32-gnutls \
-        mingw32-headers \
-        mingw32-libssh2 \
-        mingw32-libxml2 \
-        mingw32-pkg-config \
-        mingw32-portablexdr \
-        mingw32-readline && \
+               mingw32-curl \
+               mingw32-dlfcn \
+               mingw32-gcc \
+               mingw32-gettext \
+               mingw32-glib2 \
+               mingw32-gnutls \
+               mingw32-headers \
+               mingw32-libssh2 \
+               mingw32-libxml2 \
+               mingw32-pkg-config \
+               mingw32-portablexdr \
+               mingw32-readline && \
     nosync dnf clean all -y && \
     rpm -qa | sort > /packages.txt && \
     mkdir -p /usr/libexec/ccache-wrappers && \
diff --git a/ci/containers/fedora-rawhide-cross-mingw64.Dockerfile b/ci/containers/fedora-rawhide-cross-mingw64.Dockerfile
index 860aecfe86..b2690b42e1 100644
--- a/ci/containers/fedora-rawhide-cross-mingw64.Dockerfile
+++ b/ci/containers/fedora-rawhide-cross-mingw64.Dockerfile
@@ -19,66 +19,66 @@ exec "$@"' > /usr/bin/nosync && \
     chmod +x /usr/bin/nosync && \
     nosync dnf distro-sync -y && \
     nosync dnf install -y \
-        augeas \
-        bash-completion \
-        ca-certificates \
-        ccache \
-        codespell \
-        cpp \
-        cppi \
-        diffutils \
-        dwarves \
-        ebtables \
-        firewalld-filesystem \
-        git \
-        glibc-langpack-en \
-        grep \
-        iproute \
-        iproute-tc \
-        iptables \
-        iscsi-initiator-utils \
-        kmod \
-        libxml2 \
-        libxslt \
-        lvm2 \
-        make \
-        meson \
-        nfs-utils \
-        ninja-build \
-        numad \
-        perl-base \
-        polkit \
-        python3 \
-        python3-docutils \
-        python3-flake8 \
-        qemu-img \
-        rpcgen \
-        rpm-build \
-        scrub \
-        sed \
-        systemd-rpm-macros && \
+               augeas \
+               bash-completion \
+               ca-certificates \
+               ccache \
+               codespell \
+               cpp \
+               cppi \
+               diffutils \
+               dwarves \
+               ebtables \
+               firewalld-filesystem \
+               git \
+               glibc-langpack-en \
+               grep \
+               iproute \
+               iproute-tc \
+               iptables \
+               iscsi-initiator-utils \
+               kmod \
+               libxml2 \
+               libxslt \
+               lvm2 \
+               make \
+               meson \
+               nfs-utils \
+               ninja-build \
+               numad \
+               perl-base \
+               polkit \
+               python3 \
+               python3-docutils \
+               python3-flake8 \
+               qemu-img \
+               rpcgen \
+               rpm-build \
+               scrub \
+               sed \
+               systemd-rpm-macros && \
     nosync dnf autoremove -y && \
     nosync dnf clean all -y
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 RUN nosync dnf install -y \
-        mingw64-curl \
-        mingw64-dlfcn \
-        mingw64-gcc \
-        mingw64-gettext \
-        mingw64-glib2 \
-        mingw64-gnutls \
-        mingw64-headers \
-        mingw64-libssh2 \
-        mingw64-libxml2 \
-        mingw64-pkg-config \
-        mingw64-portablexdr \
-        mingw64-readline && \
+               mingw64-curl \
+               mingw64-dlfcn \
+               mingw64-gcc \
+               mingw64-gettext \
+               mingw64-glib2 \
+               mingw64-gnutls \
+               mingw64-headers \
+               mingw64-libssh2 \
+               mingw64-libxml2 \
+               mingw64-pkg-config \
+               mingw64-portablexdr \
+               mingw64-readline && \
     nosync dnf clean all -y && \
     rpm -qa | sort > /packages.txt && \
     mkdir -p /usr/libexec/ccache-wrappers && \
diff --git a/ci/containers/fedora-rawhide.Dockerfile b/ci/containers/fedora-rawhide.Dockerfile
index 9dcce7baaf..f903d549b7 100644
--- a/ci/containers/fedora-rawhide.Dockerfile
+++ b/ci/containers/fedora-rawhide.Dockerfile
@@ -19,81 +19,81 @@ exec "$@"' > /usr/bin/nosync && \
     chmod +x /usr/bin/nosync && \
     nosync dnf distro-sync -y && \
     nosync dnf install -y \
-        audit-libs-devel \
-        augeas \
-        bash-completion \
-        ca-certificates \
-        ccache \
-        clang \
-        codespell \
-        cpp \
-        cppi \
-        cyrus-sasl-devel \
-        device-mapper-devel \
-        diffutils \
-        dwarves \
-        ebtables \
-        firewalld-filesystem \
-        fuse-devel \
-        gcc \
-        gettext \
-        git \
-        glib2-devel \
-        glibc-devel \
-        glibc-langpack-en \
-        glusterfs-api-devel \
-        gnutls-devel \
-        grep \
-        iproute \
-        iproute-tc \
-        iptables \
-        iscsi-initiator-utils \
-        kmod \
-        libacl-devel \
-        libattr-devel \
-        libblkid-devel \
-        libcap-ng-devel \
-        libcurl-devel \
-        libiscsi-devel \
-        libnl3-devel \
-        libpcap-devel \
-        libpciaccess-devel \
-        librbd-devel \
-        libselinux-devel \
-        libssh-devel \
-        libssh2-devel \
-        libtirpc-devel \
-        libwsman-devel \
-        libxml2 \
-        libxml2-devel \
-        libxslt \
-        lvm2 \
-        make \
-        meson \
-        nfs-utils \
-        ninja-build \
-        numactl-devel \
-        numad \
-        parted-devel \
-        perl-base \
-        pkgconfig \
-        polkit \
-        python3 \
-        python3-docutils \
-        python3-flake8 \
-        qemu-img \
-        readline-devel \
-        rpcgen \
-        rpm-build \
-        sanlock-devel \
-        scrub \
-        sed \
-        systemd-devel \
-        systemd-rpm-macros \
-        systemtap-sdt-devel \
-        wireshark-devel \
-        xen-devel \
-        yajl-devel && \
+               audit-libs-devel \
+               augeas \
+               bash-completion \
+               ca-certificates \
+               ccache \
+               clang \
+               codespell \
+               cpp \
+               cppi \
+               cyrus-sasl-devel \
+               device-mapper-devel \
+               diffutils \
+               dwarves \
+               ebtables \
+               firewalld-filesystem \
+               fuse-devel \
+               gcc \
+               gettext \
+               git \
+               glib2-devel \
+               glibc-devel \
+               glibc-langpack-en \
+               glusterfs-api-devel \
+               gnutls-devel \
+               grep \
+               iproute \
+               iproute-tc \
+               iptables \
+               iscsi-initiator-utils \
+               kmod \
+               libacl-devel \
+               libattr-devel \
+               libblkid-devel \
+               libcap-ng-devel \
+               libcurl-devel \
+               libiscsi-devel \
+               libnl3-devel \
+               libpcap-devel \
+               libpciaccess-devel \
+               librbd-devel \
+               libselinux-devel \
+               libssh-devel \
+               libssh2-devel \
+               libtirpc-devel \
+               libwsman-devel \
+               libxml2 \
+               libxml2-devel \
+               libxslt \
+               lvm2 \
+               make \
+               meson \
+               nfs-utils \
+               ninja-build \
+               numactl-devel \
+               numad \
+               parted-devel \
+               perl-base \
+               pkgconfig \
+               polkit \
+               python3 \
+               python3-docutils \
+               python3-flake8 \
+               qemu-img \
+               readline-devel \
+               rpcgen \
+               rpm-build \
+               sanlock-devel \
+               scrub \
+               sed \
+               systemd-devel \
+               systemd-rpm-macros \
+               systemtap-sdt-devel \
+               wireshark-devel \
+               xen-devel \
+               yajl-devel && \
     nosync dnf autoremove -y && \
     nosync dnf clean all -y && \
     rpm -qa | sort > /packages.txt && \
@@ -102,8 +102,8 @@ exec "$@"' > /usr/bin/nosync && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/opensuse-leap-153.Dockerfile b/ci/containers/opensuse-leap-153.Dockerfile
index 70ea582417..49e0c98c8a 100644
--- a/ci/containers/opensuse-leap-153.Dockerfile
+++ b/ci/containers/opensuse-leap-153.Dockerfile
@@ -94,8 +94,8 @@ RUN zypper update -y && \
 
 RUN /usr/bin/pip3 install meson==0.56.0
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/opensuse-tumbleweed.Dockerfile b/ci/containers/opensuse-tumbleweed.Dockerfile
index d8a302e6e2..33a3bf559a 100644
--- a/ci/containers/opensuse-tumbleweed.Dockerfile
+++ b/ci/containers/opensuse-tumbleweed.Dockerfile
@@ -71,7 +71,7 @@ RUN zypper dist-upgrade -y && \
            polkit \
            python3-base \
            python3-docutils \
-           python3-flake8 \
+           python39-flake8 \
            qemu-tools \
            readline-devel \
            rpcgen \
@@ -90,8 +90,8 @@ RUN zypper dist-upgrade -y && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/ubuntu-2004.Dockerfile b/ci/containers/ubuntu-2004.Dockerfile
index 466b045fe4..7fe54d4636 100644
--- a/ci/containers/ubuntu-2004.Dockerfile
+++ b/ci/containers/ubuntu-2004.Dockerfile
@@ -11,82 +11,82 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            clang \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gcc \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libacl1-dev \
-            libapparmor-dev \
-            libattr1-dev \
-            libaudit-dev \
-            libblkid-dev \
-            libc-dev-bin \
-            libc6-dev \
-            libcap-ng-dev \
-            libcurl4-gnutls-dev \
-            libdevmapper-dev \
-            libfuse-dev \
-            libglib2.0-dev \
-            libglusterfs-dev \
-            libgnutls28-dev \
-            libiscsi-dev \
-            libnetcf-dev \
-            libnl-3-dev \
-            libnl-route-3-dev \
-            libnuma-dev \
-            libopenwsman-dev \
-            libparted-dev \
-            libpcap0.8-dev \
-            libpciaccess-dev \
-            librbd-dev \
-            libreadline-dev \
-            libsanlock-dev \
-            libsasl2-dev \
-            libselinux1-dev \
-            libssh-dev \
-            libssh2-1-dev \
-            libtirpc-dev \
-            libudev-dev \
-            libxen-dev \
-            libxml2-dev \
-            libxml2-utils \
-            libyajl-dev \
-            locales \
-            lvm2 \
-            make \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            python3-pip \
-            python3-setuptools \
-            python3-wheel \
-            qemu-utils \
-            scrub \
-            sed \
-            systemtap-sdt-dev \
-            wireshark-dev \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      clang \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gcc \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libacl1-dev \
+                      libapparmor-dev \
+                      libattr1-dev \
+                      libaudit-dev \
+                      libblkid-dev \
+                      libc-dev-bin \
+                      libc6-dev \
+                      libcap-ng-dev \
+                      libcurl4-gnutls-dev \
+                      libdevmapper-dev \
+                      libfuse-dev \
+                      libglib2.0-dev \
+                      libglusterfs-dev \
+                      libgnutls28-dev \
+                      libiscsi-dev \
+                      libnetcf-dev \
+                      libnl-3-dev \
+                      libnl-route-3-dev \
+                      libnuma-dev \
+                      libopenwsman-dev \
+                      libparted-dev \
+                      libpcap0.8-dev \
+                      libpciaccess-dev \
+                      librbd-dev \
+                      libreadline-dev \
+                      libsanlock-dev \
+                      libsasl2-dev \
+                      libselinux1-dev \
+                      libssh-dev \
+                      libssh2-1-dev \
+                      libtirpc-dev \
+                      libudev-dev \
+                      libxen-dev \
+                      libxml2-dev \
+                      libxml2-utils \
+                      libyajl-dev \
+                      locales \
+                      lvm2 \
+                      make \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      python3-pip \
+                      python3-setuptools \
+                      python3-wheel \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      systemtap-sdt-dev \
+                      wireshark-dev \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
@@ -99,8 +99,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
 
 RUN /usr/bin/pip3 install meson==0.56.0
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/ubuntu-2204.Dockerfile b/ci/containers/ubuntu-2204.Dockerfile
index 410932f877..5b7f6e96af 100644
--- a/ci/containers/ubuntu-2204.Dockerfile
+++ b/ci/containers/ubuntu-2204.Dockerfile
@@ -11,79 +11,79 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     apt-get install -y eatmydata && \
     eatmydata apt-get dist-upgrade -y && \
     eatmydata apt-get install --no-install-recommends -y \
-            augeas-lenses \
-            augeas-tools \
-            bash-completion \
-            ca-certificates \
-            ccache \
-            clang \
-            codespell \
-            cpp \
-            diffutils \
-            dwarves \
-            ebtables \
-            flake8 \
-            gcc \
-            gettext \
-            git \
-            grep \
-            iproute2 \
-            iptables \
-            kmod \
-            libacl1-dev \
-            libapparmor-dev \
-            libattr1-dev \
-            libaudit-dev \
-            libblkid-dev \
-            libc-dev-bin \
-            libc6-dev \
-            libcap-ng-dev \
-            libcurl4-gnutls-dev \
-            libdevmapper-dev \
-            libfuse-dev \
-            libglib2.0-dev \
-            libglusterfs-dev \
-            libgnutls28-dev \
-            libiscsi-dev \
-            libnl-3-dev \
-            libnl-route-3-dev \
-            libnuma-dev \
-            libopenwsman-dev \
-            libparted-dev \
-            libpcap0.8-dev \
-            libpciaccess-dev \
-            librbd-dev \
-            libreadline-dev \
-            libsanlock-dev \
-            libsasl2-dev \
-            libselinux1-dev \
-            libssh-dev \
-            libssh2-1-dev \
-            libtirpc-dev \
-            libudev-dev \
-            libxen-dev \
-            libxml2-dev \
-            libxml2-utils \
-            libyajl-dev \
-            locales \
-            lvm2 \
-            make \
-            meson \
-            nfs-common \
-            ninja-build \
-            numad \
-            open-iscsi \
-            perl-base \
-            pkgconf \
-            policykit-1 \
-            python3 \
-            python3-docutils \
-            qemu-utils \
-            scrub \
-            sed \
-            systemtap-sdt-dev \
-            wireshark-dev \
-            xsltproc && \
+                      augeas-lenses \
+                      augeas-tools \
+                      bash-completion \
+                      ca-certificates \
+                      ccache \
+                      clang \
+                      codespell \
+                      cpp \
+                      diffutils \
+                      dwarves \
+                      ebtables \
+                      flake8 \
+                      gcc \
+                      gettext \
+                      git \
+                      grep \
+                      iproute2 \
+                      iptables \
+                      kmod \
+                      libacl1-dev \
+                      libapparmor-dev \
+                      libattr1-dev \
+                      libaudit-dev \
+                      libblkid-dev \
+                      libc-dev-bin \
+                      libc6-dev \
+                      libcap-ng-dev \
+                      libcurl4-gnutls-dev \
+                      libdevmapper-dev \
+                      libfuse-dev \
+                      libglib2.0-dev \
+                      libglusterfs-dev \
+                      libgnutls28-dev \
+                      libiscsi-dev \
+                      libnl-3-dev \
+                      libnl-route-3-dev \
+                      libnuma-dev \
+                      libopenwsman-dev \
+                      libparted-dev \
+                      libpcap0.8-dev \
+                      libpciaccess-dev \
+                      librbd-dev \
+                      libreadline-dev \
+                      libsanlock-dev \
+                      libsasl2-dev \
+                      libselinux1-dev \
+                      libssh-dev \
+                      libssh2-1-dev \
+                      libtirpc-dev \
+                      libudev-dev \
+                      libxen-dev \
+                      libxml2-dev \
+                      libxml2-utils \
+                      libyajl-dev \
+                      locales \
+                      lvm2 \
+                      make \
+                      meson \
+                      nfs-common \
+                      ninja-build \
+                      numad \
+                      open-iscsi \
+                      perl-base \
+                      pkgconf \
+                      policykit-1 \
+                      python3 \
+                      python3-docutils \
+                      qemu-utils \
+                      scrub \
+                      sed \
+                      systemtap-sdt-dev \
+                      wireshark-dev \
+                      xsltproc && \
     eatmydata apt-get autoremove -y && \
     eatmydata apt-get autoclean -y && \
     sed -Ei 's,^# (en_US\.UTF-8 .*)$,\1,' /etc/locale.gen && \
@@ -94,8 +94,8 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/clang && \
     ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc
 
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 ENV LANG "en_US.UTF-8"
 ENV MAKE "/usr/bin/make"
 ENV NINJA "/usr/bin/ninja"
 ENV PYTHON "/usr/bin/python3"
-ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/gitlab.yml b/ci/gitlab.yml
index ff7c0ba16c..bdc5e0a96f 100644
--- a/ci/gitlab.yml
+++ b/ci/gitlab.yml
@@ -8,24 +8,72 @@
 # Variables that can be set to control the behaviour of
 # pipelines that are run
 #
-#  - RUN_ALL_CONTAINERS - build all containers
-#    even if they don't have any changes detected
+#  - RUN_PIPELINE - force creation of a CI pipeline when
+#    pushing to a branch in a forked repository. Official
+#    CI pipelines are triggered when merge requests are
+#    created/updated. Setting this variable to a non-empty
+#    value allows CI testing prior to opening a merge request.
+#
+#  - RUN_CONTAINER_BUILDS - CI pipelines in upstream only
+#    publish containers if CI file changes are detected.
+#    Setting this variable to a non-empty value will force
+#    re-publishing, even when no file changes are detected.
+#    Typically to use from a scheduled job once a month.
+#
+#  - RUN_UPSTREAM_NAMESPACE - the upstream namespace is
+#    configured to default to 'libvirt'. When testing
+#    changes to CI it might be useful to use a different
+#    upstream. Setting this variable will override the
+#    namespace considered to be upstream.
 #
 # These can be set as git push options
 #
-#  $ git push -o ci.variable=RUN_ALL_CONTAINERS=1
+#  $ git push -o ci.variable=RUN_PIPELINE=1
 #
 # Aliases can be set for common usage
 #
-#  $ git config --local alias.push-all-ctr "push -o ci.variable=RUN_ALL_CONTAINERS=1"
+#  $ git config --local alias.push-ci "push -o ci.variable=RUN_PIPELINE=1"
 #
 # Allowing the less verbose invocation
 #
-#  $ git push-all-ctr
+#  $ git push-ci
 #
 # Pipeline variables can also be set in the repository
 # pipeline config globally, or set against scheduled pipelines
 
+
+variables:
+  RUN_UPSTREAM_NAMESPACE: libvirt
+
+
+workflow:
+  rules:
+    # upstream+forks: Avoid duplicate pipelines on pushes, if a MR is open
+    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_OPEN_MERGE_REQUESTS'
+      when: never
+
+    # upstream+forks: Avoid pipelines on tag pushes
+    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_TAG'
+      when: never
+
+    # upstream+forks: Allow pipelines in scenarios we've figured out job rules
+    - if: '$CI_PIPELINE_SOURCE =~ /^(push|merge_request_event|api|web|schedule)$/'
+      when: always
+
+    # upstream+forks: Avoid all other pipelines
+    - when: never
+
+
+debug:
+  image: docker.io/library/alpine:3
+  stage: sanity_checks
+  needs: []
+  script:
+    - printenv | sort
+  rules:
+    - if: '$RUN_DEBUG'
+      when: always
+
 include:
   - local: '/ci/gitlab/container-templates.yml'
   - local: '/ci/gitlab/build-templates.yml'
diff --git a/ci/gitlab/build-templates.yml b/ci/gitlab/build-templates.yml
index 605788dab9..5d7d6c59c5 100644
--- a/ci/gitlab/build-templates.yml
+++ b/ci/gitlab/build-templates.yml
@@ -5,28 +5,228 @@
 # https://gitlab.com/libvirt/libvirt-ci
 
 
-.gitlab_native_build_job:
-  image: $CI_REGISTRY_IMAGE/ci-$NAME:latest
+#
+# We use pre-built containers for any pipelines that are:
+#
+#  - Validating code committed on default upstream branch
+#  - Validating patches targetting default upstream branch
+#    which do not have CI changes
+#
+# We use a local build env for any pipelines that are:
+#
+#  - Validating code committed to a non-default upstream branch
+#  - Validating patches targetting a non-default upstream branch
+#  - Validating patches targetting default upstream branch which
+#    include CI changes
+#  - Validating code committed to a fork branch
+#
+# Note: the rules across the prebuilt_env and local_env templates
+# should be logical inverses, such that jobs are mutually exclusive
+#
+.gitlab_native_build_job_prebuilt_env:
+  image: $CI_REGISTRY/$RUN_UPSTREAM_NAMESPACE/libvirt/ci-$NAME:latest
   stage: builds
+  before_script:
+    - cat /packages.txt
   rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+    # upstream: pushes to the default branch
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+      when: on_success
+
+    # upstream: other web/api/scheduled pipelines targetting the default branch
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE =~ /(web|api|schedule)/ && $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE =~ /(web|api|schedule)/ && $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH'
+      when: on_success
+
+    # upstream+forks: merge requests targetting the default branch, without CI changes
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'
+      changes:
+        - ci/gitlab/container-templates.yml
+        - ci/containers/$NAME.Dockerfile
       when: never
-    - if: '$JOB_OPTIONAL'
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'
+      when: on_success
+
+    # upstream+forks: that's all folks
+    - when: never
+
+.gitlab_native_build_job_local_env:
+  image: $IMAGE
+  stage: builds
+  before_script:
+    - source ci/buildenv/$NAME.sh
+    - install_buildenv
+    - cat /packages.txt
+  rules:
+    # upstream: pushes to a non-default branch
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
+      when: on_success
+
+    - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE'
+      when: on_success
+
+    # upstream: other web/api/scheduled pipelines targetting non-default branches
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE =~ /(web|api|schedule)/ && $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
       when: manual
       allow_failure: true
-    - when: on_success
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE =~ /(web|api|schedule)/ && $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH'
+      when: on_success
 
+    # forks: other web/api/scheduled pipelines
+    - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE =~ /(web|api|schedule)/ && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE =~ /(web|api|schedule)/'
+      when: on_success
+
+    # upstream+forks: merge requests targetting the default branch, with CI changes
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
+      changes:
+        - ci/gitlab/container-templates.yml
+        - ci/containers/$NAME.Dockerfile
+      when: manual
+      allow_failure: true
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'
+      changes:
+        - ci/gitlab/container-templates.yml
+        - ci/containers/$NAME.Dockerfile
+      when: on_success
 
-.gitlab_cross_build_job:
-  image: $CI_REGISTRY_IMAGE/ci-$NAME-cross-$CROSS:latest
+    # upstream+forks: merge requests targetting non-default branches
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH'
+      when: on_success
+
+    # upstream+forks: that's all folks
+    - when: never
+
+
+#
+# We use pre-built containers for any pipelines that are:
+#
+#  - Validating code committed on default upstream branch
+#  - Validating patches targetting default upstream branch
+#    which do not have CI changes
+#
+# We use a local build env for any pipelines that are:
+#
+#  - Validating code committed to a non-default upstream branch
+#  - Validating patches targetting a non-default upstream branch
+#  - Validating patches targetting default upstream branch which
+#    include CI changes
+#  - Validating code committed to a fork branch
+#
+# Note: the rules across the prebuilt_env and local_env templates
+# should be logical inverses, such that jobs are mutually exclusive
+#
+.gitlab_cross_build_job_prebuilt_env:
+  image: $CI_REGISTRY/$RUN_UPSTREAM_NAMESPACE/libvirt/ci-$NAME-cross-$CROSS:latest
   stage: builds
+  before_script:
+    - cat /packages.txt
   rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+    # upstream: pushes to the default branch
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+      when: on_success
+
+    # upstream: other web/api/scheduled pipelines targetting the default branch
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE =~ /(web|api|schedule)/ && $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE =~ /(web|api|schedule)/ && $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH'
+      when: on_success
+
+    # upstream+forks: merge requests targetting the default branch, without CI changes
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'
+      changes:
+        - ci/gitlab/container-templates.yml
+        - ci/containers/$NAME.Dockerfile
       when: never
-    - if: '$JOB_OPTIONAL'
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'
+      when: on_success
+
+    # upstream+forks: that's all folks
+    - when: never
+
+.gitlab_cross_build_job_local_env:
+  image: $IMAGE
+  stage: builds
+  before_script:
+    - source ci/buildenv/$NAME.sh
+    - install_buildenv
+    - cat /packages.txt
+  rules:
+    # upstream: pushes to a non-default branch
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
+      when: on_success
+
+    - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE'
+      when: on_success
+
+    # upstream: other web/api/scheduled pipelines targetting non-default branches
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE =~ /(web|api|schedule)/ && $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE =~ /(web|api|schedule)/ && $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH'
+      when: on_success
+
+    # forks: other web/api/scheduled pipelines
+    - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE =~ /(web|api|schedule)/ && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE =~ /(web|api|schedule)/'
+      when: on_success
+
+    # upstream+forks: merge requests targetting the default branch, with CI changes
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
+      changes:
+        - ci/gitlab/container-templates.yml
+        - ci/containers/$NAME.Dockerfile
+      when: manual
+      allow_failure: true
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'
+      changes:
+        - ci/gitlab/container-templates.yml
+        - ci/containers/$NAME.Dockerfile
+      when: on_success
+
+    # upstream+forks: merge requests targetting non-default branches
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH && $JOB_OPTIONAL'
       when: manual
       allow_failure: true
-    - when: on_success
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH'
+      when: on_success
+
+    # upstream+forks: that's all folks
+    - when: never
 
 
 .cirrus_build_job:
@@ -56,9 +256,30 @@
     - cat ci/cirrus/$NAME.yml
     - cirrus-run -v --show-build-log always ci/cirrus/$NAME.yml
   rules:
+    # upstream+forks: Can't run unless Cirrus is configured
     - if: '$CIRRUS_GITHUB_REPO == null || $CIRRUS_API_TOKEN == null'
       when: never
-    - if: '$JOB_OPTIONAL'
+
+    # upstream: pushes to branches
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push"'
+      when: on_success
+
+    # forks: pushes to branches with pipeline requested
+    - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE && $JOB_OPTIONAL'
       when: manual
       allow_failure: true
-    - when: on_success
+    - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $RUN_PIPELINE'
+      when: on_success
+
+    # upstream+forks: Run pipelines on MR, web, api & scheduled
+    - if: '$CI_PIPELINE_SOURCE =~ /(web|api|schedule|merge_request_event)/ && $JOB_OPTIONAL'
+      when: manual
+      allow_failure: true
+    - if: '$CI_PIPELINE_SOURCE =~ /(web|api|schedule|merge_request_event)/'
+      when: on_success
+
+    # upstream+forks: that's all folks
+    - when: never
diff --git a/ci/gitlab/builds.yml b/ci/gitlab/builds.yml
index 420d7f0211..e2f2f39320 100644
--- a/ci/gitlab/builds.yml
+++ b/ci/gitlab/builds.yml
@@ -7,8 +7,8 @@
 
 # Native build jobs
 
-x86_64-almalinux-8:
-  extends: .native_build_job
+x86_64-almalinux-8-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-almalinux-8-container
       optional: true
@@ -18,9 +18,19 @@ x86_64-almalinux-8:
     NAME: almalinux-8
     RPM: skip
 
+x86_64-almalinux-8-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    IMAGE: docker.io/library/almalinux:8
+    JOB_OPTIONAL: 1
+    NAME: almalinux-8
+    RPM: skip
+
 
-x86_64-almalinux-8-clang:
-  extends: .native_build_job
+x86_64-almalinux-8-clang-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-almalinux-8-container
       optional: true
@@ -30,9 +40,19 @@ x86_64-almalinux-8-clang:
     NAME: almalinux-8
     RPM: skip
 
+x86_64-almalinux-8-clang-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CC: clang
+    IMAGE: docker.io/library/almalinux:8
+    NAME: almalinux-8
+    RPM: skip
 
-x86_64-alpine-315:
-  extends: .native_build_job
+
+x86_64-alpine-315-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-alpine-315-container
       optional: true
@@ -40,9 +60,17 @@ x86_64-alpine-315:
   variables:
     NAME: alpine-315
 
+x86_64-alpine-315-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    IMAGE: docker.io/library/alpine:3.15
+    NAME: alpine-315
+
 
-x86_64-alpine-edge:
-  extends: .native_build_job
+x86_64-alpine-edge-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-alpine-edge-container
       optional: true
@@ -50,9 +78,17 @@ x86_64-alpine-edge:
   variables:
     NAME: alpine-edge
 
+x86_64-alpine-edge-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: true
+  variables:
+    IMAGE: docker.io/library/alpine:edge
+    NAME: alpine-edge
+
 
-x86_64-centos-stream-8:
-  extends: .native_build_job
+x86_64-centos-stream-8-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-centos-stream-8-container
       optional: true
@@ -64,9 +100,21 @@ x86_64-centos-stream-8:
     paths:
       - libvirt-rpms
 
+x86_64-centos-stream-8-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    IMAGE: quay.io/centos/centos:stream8
+    NAME: centos-stream-8
+  artifacts:
+    expire_in: 1 day
+    paths:
+      - libvirt-rpms
+
 
-x86_64-centos-stream-9:
-  extends: .native_build_job
+x86_64-centos-stream-9-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-centos-stream-9-container
       optional: true
@@ -78,9 +126,21 @@ x86_64-centos-stream-9:
     paths:
       - libvirt-rpms
 
+x86_64-centos-stream-9-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    IMAGE: quay.io/centos/centos:stream9
+    NAME: centos-stream-9
+  artifacts:
+    expire_in: 1 day
+    paths:
+      - libvirt-rpms
 
-x86_64-debian-11:
-  extends: .native_build_job
+
+x86_64-debian-11-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-debian-11-container
       optional: true
@@ -88,9 +148,17 @@ x86_64-debian-11:
   variables:
     NAME: debian-11
 
+x86_64-debian-11-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    IMAGE: docker.io/library/debian:11-slim
+    NAME: debian-11
+
 
-x86_64-debian-11-clang:
-  extends: .native_build_job
+x86_64-debian-11-clang-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-debian-11-container
       optional: true
@@ -98,9 +166,17 @@ x86_64-debian-11-clang:
   variables:
     NAME: debian-11
 
+x86_64-debian-11-clang-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    IMAGE: docker.io/library/debian:11-slim
+    NAME: debian-11
+
 
-x86_64-debian-sid:
-  extends: .native_build_job
+x86_64-debian-sid-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-debian-sid-container
       optional: true
@@ -108,9 +184,17 @@ x86_64-debian-sid:
   variables:
     NAME: debian-sid
 
+x86_64-debian-sid-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: true
+  variables:
+    IMAGE: docker.io/library/debian:sid-slim
+    NAME: debian-sid
+
 
-x86_64-fedora-35:
-  extends: .native_build_job
+x86_64-fedora-35-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-fedora-35-container
       optional: true
@@ -122,9 +206,21 @@ x86_64-fedora-35:
     paths:
       - libvirt-rpms
 
+x86_64-fedora-35-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    IMAGE: registry.fedoraproject.org/fedora:35
+    NAME: fedora-35
+  artifacts:
+    expire_in: 1 day
+    paths:
+      - libvirt-rpms
 
-x86_64-fedora-36:
-  extends: .native_build_job
+
+x86_64-fedora-36-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-fedora-36-container
       optional: true
@@ -136,9 +232,21 @@ x86_64-fedora-36:
     paths:
       - libvirt-rpms
 
+x86_64-fedora-36-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    IMAGE: registry.fedoraproject.org/fedora:36
+    NAME: fedora-36
+  artifacts:
+    expire_in: 1 day
+    paths:
+      - libvirt-rpms
+
 
-x86_64-fedora-rawhide:
-  extends: .native_build_job
+x86_64-fedora-rawhide-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-fedora-rawhide-container
       optional: true
@@ -146,9 +254,17 @@ x86_64-fedora-rawhide:
   variables:
     NAME: fedora-rawhide
 
+x86_64-fedora-rawhide-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: true
+  variables:
+    IMAGE: registry.fedoraproject.org/fedora:rawhide
+    NAME: fedora-rawhide
+
 
-x86_64-fedora-rawhide-clang:
-  extends: .native_build_job
+x86_64-fedora-rawhide-clang-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-fedora-rawhide-container
       optional: true
@@ -158,9 +274,19 @@ x86_64-fedora-rawhide-clang:
     NAME: fedora-rawhide
     RPM: skip
 
+x86_64-fedora-rawhide-clang-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: true
+  variables:
+    CC: clang
+    IMAGE: registry.fedoraproject.org/fedora:rawhide
+    NAME: fedora-rawhide
+    RPM: skip
+
 
-x86_64-opensuse-leap-153:
-  extends: .native_build_job
+x86_64-opensuse-leap-153-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-opensuse-leap-153-container
       optional: true
@@ -169,9 +295,18 @@ x86_64-opensuse-leap-153:
     NAME: opensuse-leap-153
     RPM: skip
 
+x86_64-opensuse-leap-153-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    IMAGE: registry.opensuse.org/opensuse/leap:15.3
+    NAME: opensuse-leap-153
+    RPM: skip
+
 
-x86_64-opensuse-tumbleweed:
-  extends: .native_build_job
+x86_64-opensuse-tumbleweed-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-opensuse-tumbleweed-container
       optional: true
@@ -180,9 +315,18 @@ x86_64-opensuse-tumbleweed:
     NAME: opensuse-tumbleweed
     RPM: skip
 
+x86_64-opensuse-tumbleweed-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: true
+  variables:
+    IMAGE: registry.opensuse.org/opensuse/tumbleweed:latest
+    NAME: opensuse-tumbleweed
+    RPM: skip
+
 
-x86_64-ubuntu-2004:
-  extends: .native_build_job
+x86_64-ubuntu-2004-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-ubuntu-2004-container
       optional: true
@@ -193,9 +337,20 @@ x86_64-ubuntu-2004:
     NAME: ubuntu-2004
     UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1
 
+x86_64-ubuntu-2004-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    ASAN_OPTIONS: verify_asan_link_order=0
+    IMAGE: docker.io/library/ubuntu:20.04
+    MESON_ARGS: -Db_lundef=false -Db_sanitize=address,undefined
+    NAME: ubuntu-2004
+    UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1
+
 
-x86_64-ubuntu-2204:
-  extends: .native_build_job
+x86_64-ubuntu-2204-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-ubuntu-2204-container
       optional: true
@@ -204,9 +359,18 @@ x86_64-ubuntu-2204:
     JOB_OPTIONAL: 1
     NAME: ubuntu-2204
 
+x86_64-ubuntu-2204-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    IMAGE: docker.io/library/ubuntu:22.04
+    JOB_OPTIONAL: 1
+    NAME: ubuntu-2204
+
 
-x86_64-ubuntu-2204-clang:
-  extends: .native_build_job
+x86_64-ubuntu-2204-clang-prebuilt-env:
+  extends: .native_build_job_prebuilt_env
   needs:
     - job: x86_64-ubuntu-2204-container
       optional: true
@@ -217,12 +381,23 @@ x86_64-ubuntu-2204-clang:
     NAME: ubuntu-2204
     UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1
 
+x86_64-ubuntu-2204-clang-local-env:
+  extends: .native_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CC: clang
+    IMAGE: docker.io/library/ubuntu:22.04
+    MESON_ARGS: -Db_lundef=false -Db_sanitize=address,undefined
+    NAME: ubuntu-2204
+    UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1
+
 
 
 # Cross build jobs
 
-aarch64-debian-11:
-  extends: .cross_build_job
+aarch64-debian-11-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: aarch64-debian-11-container
       optional: true
@@ -232,9 +407,19 @@ aarch64-debian-11:
     JOB_OPTIONAL: 1
     NAME: debian-11
 
+aarch64-debian-11-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: aarch64
+    IMAGE: docker.io/library/debian:11-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-11
 
-armv6l-debian-11:
-  extends: .cross_build_job
+
+armv6l-debian-11-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: armv6l-debian-11-container
       optional: true
@@ -244,9 +429,19 @@ armv6l-debian-11:
     JOB_OPTIONAL: 1
     NAME: debian-11
 
+armv6l-debian-11-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: armv6l
+    IMAGE: docker.io/library/debian:11-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-11
+
 
-armv7l-debian-11:
-  extends: .cross_build_job
+armv7l-debian-11-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: armv7l-debian-11-container
       optional: true
@@ -255,9 +450,18 @@ armv7l-debian-11:
     CROSS: armv7l
     NAME: debian-11
 
+armv7l-debian-11-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: armv7l
+    IMAGE: docker.io/library/debian:11-slim
+    NAME: debian-11
 
-i686-debian-11:
-  extends: .cross_build_job
+
+i686-debian-11-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: i686-debian-11-container
       optional: true
@@ -267,9 +471,19 @@ i686-debian-11:
     JOB_OPTIONAL: 1
     NAME: debian-11
 
+i686-debian-11-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: i686
+    IMAGE: docker.io/library/debian:11-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-11
+
 
-mips64el-debian-11:
-  extends: .cross_build_job
+mips64el-debian-11-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: mips64el-debian-11-container
       optional: true
@@ -279,9 +493,19 @@ mips64el-debian-11:
     JOB_OPTIONAL: 1
     NAME: debian-11
 
+mips64el-debian-11-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: mips64el
+    IMAGE: docker.io/library/debian:11-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-11
+
 
-mipsel-debian-11:
-  extends: .cross_build_job
+mipsel-debian-11-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: mipsel-debian-11-container
       optional: true
@@ -291,9 +515,19 @@ mipsel-debian-11:
     JOB_OPTIONAL: 1
     NAME: debian-11
 
+mipsel-debian-11-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: mipsel
+    IMAGE: docker.io/library/debian:11-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-11
+
 
-ppc64le-debian-11:
-  extends: .cross_build_job
+ppc64le-debian-11-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: ppc64le-debian-11-container
       optional: true
@@ -303,9 +537,19 @@ ppc64le-debian-11:
     JOB_OPTIONAL: 1
     NAME: debian-11
 
+ppc64le-debian-11-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: ppc64le
+    IMAGE: docker.io/library/debian:11-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-11
 
-s390x-debian-11:
-  extends: .cross_build_job
+
+s390x-debian-11-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: s390x-debian-11-container
       optional: true
@@ -315,9 +559,19 @@ s390x-debian-11:
     JOB_OPTIONAL: 1
     NAME: debian-11
 
+s390x-debian-11-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: s390x
+    IMAGE: docker.io/library/debian:11-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-11
+
 
-aarch64-debian-sid:
-  extends: .cross_build_job
+aarch64-debian-sid-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: aarch64-debian-sid-container
       optional: true
@@ -327,9 +581,19 @@ aarch64-debian-sid:
     JOB_OPTIONAL: 1
     NAME: debian-sid
 
+aarch64-debian-sid-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: aarch64
+    IMAGE: docker.io/library/debian:sid-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-sid
+
 
-armv6l-debian-sid:
-  extends: .cross_build_job
+armv6l-debian-sid-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: armv6l-debian-sid-container
       optional: true
@@ -339,9 +603,19 @@ armv6l-debian-sid:
     JOB_OPTIONAL: 1
     NAME: debian-sid
 
+armv6l-debian-sid-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: armv6l
+    IMAGE: docker.io/library/debian:sid-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-sid
+
 
-armv7l-debian-sid:
-  extends: .cross_build_job
+armv7l-debian-sid-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: armv7l-debian-sid-container
       optional: true
@@ -351,9 +625,19 @@ armv7l-debian-sid:
     JOB_OPTIONAL: 1
     NAME: debian-sid
 
+armv7l-debian-sid-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: armv7l
+    IMAGE: docker.io/library/debian:sid-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-sid
 
-i686-debian-sid:
-  extends: .cross_build_job
+
+i686-debian-sid-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: i686-debian-sid-container
       optional: true
@@ -363,9 +647,19 @@ i686-debian-sid:
     JOB_OPTIONAL: 1
     NAME: debian-sid
 
+i686-debian-sid-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: i686
+    IMAGE: docker.io/library/debian:sid-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-sid
+
 
-mips64el-debian-sid:
-  extends: .cross_build_job
+mips64el-debian-sid-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: mips64el-debian-sid-container
       optional: true
@@ -375,9 +669,19 @@ mips64el-debian-sid:
     JOB_OPTIONAL: 1
     NAME: debian-sid
 
+mips64el-debian-sid-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: mips64el
+    IMAGE: docker.io/library/debian:sid-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-sid
+
 
-mipsel-debian-sid:
-  extends: .cross_build_job
+mipsel-debian-sid-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: mipsel-debian-sid-container
       optional: true
@@ -387,9 +691,19 @@ mipsel-debian-sid:
     JOB_OPTIONAL: 1
     NAME: debian-sid
 
+mipsel-debian-sid-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: mipsel
+    IMAGE: docker.io/library/debian:sid-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-sid
+
 
-ppc64le-debian-sid:
-  extends: .cross_build_job
+ppc64le-debian-sid-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: ppc64le-debian-sid-container
       optional: true
@@ -399,9 +713,19 @@ ppc64le-debian-sid:
     JOB_OPTIONAL: 1
     NAME: debian-sid
 
+ppc64le-debian-sid-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: ppc64le
+    IMAGE: docker.io/library/debian:sid-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-sid
 
-s390x-debian-sid:
-  extends: .cross_build_job
+
+s390x-debian-sid-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: s390x-debian-sid-container
       optional: true
@@ -411,9 +735,19 @@ s390x-debian-sid:
     JOB_OPTIONAL: 1
     NAME: debian-sid
 
+s390x-debian-sid-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: s390x
+    IMAGE: docker.io/library/debian:sid-slim
+    JOB_OPTIONAL: 1
+    NAME: debian-sid
+
 
-mingw32-fedora-36:
-  extends: .cross_build_job
+mingw32-fedora-36-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: mingw32-fedora-36-container
       optional: true
@@ -423,9 +757,19 @@ mingw32-fedora-36:
     JOB_OPTIONAL: 1
     NAME: fedora-36
 
+mingw32-fedora-36-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: mingw32
+    IMAGE: registry.fedoraproject.org/fedora:36
+    JOB_OPTIONAL: 1
+    NAME: fedora-36
+
 
-mingw64-fedora-36:
-  extends: .cross_build_job
+mingw64-fedora-36-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: mingw64-fedora-36-container
       optional: true
@@ -434,9 +778,18 @@ mingw64-fedora-36:
     CROSS: mingw64
     NAME: fedora-36
 
+mingw64-fedora-36-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: false
+  variables:
+    CROSS: mingw64
+    IMAGE: registry.fedoraproject.org/fedora:36
+    NAME: fedora-36
+
 
-mingw32-fedora-rawhide:
-  extends: .cross_build_job
+mingw32-fedora-rawhide-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: mingw32-fedora-rawhide-container
       optional: true
@@ -445,9 +798,18 @@ mingw32-fedora-rawhide:
     CROSS: mingw32
     NAME: fedora-rawhide
 
+mingw32-fedora-rawhide-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: true
+  variables:
+    CROSS: mingw32
+    IMAGE: registry.fedoraproject.org/fedora:rawhide
+    NAME: fedora-rawhide
+
 
-mingw64-fedora-rawhide:
-  extends: .cross_build_job
+mingw64-fedora-rawhide-prebuilt-env:
+  extends: .cross_build_job_prebuilt_env
   needs:
     - job: mingw64-fedora-rawhide-container
       optional: true
@@ -457,6 +819,16 @@ mingw64-fedora-rawhide:
     JOB_OPTIONAL: 1
     NAME: fedora-rawhide
 
+mingw64-fedora-rawhide-local-env:
+  extends: .cross_build_job_local_env
+  needs: []
+  allow_failure: true
+  variables:
+    CROSS: mingw64
+    IMAGE: registry.fedoraproject.org/fedora:rawhide
+    JOB_OPTIONAL: 1
+    NAME: fedora-rawhide
+
 
 # Native cirrus build jobs
 
diff --git a/ci/gitlab/container-templates.yml b/ci/gitlab/container-templates.yml
index 0e52f147bb..a577028d11 100644
--- a/ci/gitlab/container-templates.yml
+++ b/ci/gitlab/container-templates.yml
@@ -5,17 +5,13 @@
 # https://gitlab.com/libvirt/libvirt-ci
 
 
-# For upstream
+# We want to publish containers with tag 'latest':
 #
-#   - Push to default branch:
-#       -> rebuild if dockerfile changed, no cache
-#   - Otherwise
-#       -> rebuild if RUN_ALL_CONTAINERS=1, no cache,
-#          to pick up new published distro packages or
-#          recover from deleted tag
+#  - In upstream, for push to default branch with CI changes.
+#  - In upstream, on request, for scheduled/manual pipelines
+#    against default branch
 #
-# For forks
-#   - Always rebuild, with cache
+# Note: never publish from merge requests since they have non-committed code
 #
 .container_job:
   image: docker:stable
@@ -25,33 +21,24 @@
     - docker:dind
   before_script:
     - export TAG="$CI_REGISTRY_IMAGE/ci-$NAME:latest"
-    - export COMMON_TAG="$CI_REGISTRY/libvirt/libvirt/ci-$NAME:latest"
     - docker info
     - docker login "$CI_REGISTRY" -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD"
   script:
-    - if test $CI_PROJECT_NAMESPACE = "libvirt";
-      then
-        docker build --tag "$TAG" -f "ci/containers/$NAME.Dockerfile" ci/containers ;
-      else
-        docker pull "$TAG" || docker pull "$COMMON_TAG" || true ;
-        docker build --cache-from "$TAG" --cache-from "$COMMON_TAG" --tag "$TAG" -f "ci/containers/$NAME.Dockerfile" ci/containers ;
-      fi
+    - docker build --tag "$TAG" -f "ci/containers/$NAME.Dockerfile" ci/containers ;
     - docker push "$TAG"
   after_script:
     - docker logout
   rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-      when: never
-    - if: '$CI_PROJECT_NAMESPACE == "libvirt" && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+    # upstream: publish containers if there were CI changes on the default branch
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
       when: on_success
       changes:
-       - ci/gitlab/container-templates.yml
-       - ci/containers/$NAME.Dockerfile
-    - if: '$CI_PROJECT_NAMESPACE == "libvirt" && $RUN_ALL_CONTAINERS == "1"'
+        - ci/gitlab/container-templates.yml
+        - ci/containers/$NAME.Dockerfile
+
+    # upstream: allow force re-publishing containers on default branch for web/api/scheduled pipelines
+    - if: '$CI_PROJECT_NAMESPACE == $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE =~ /(web|api|schedule)/ && $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH && $RUN_CONTAINER_BUILDS == "1"'
       when: on_success
-    - if: '$CI_PROJECT_NAMESPACE == "libvirt"'
-      when: never
-    - if: '$JOB_OPTIONAL'
-      when: manual
-      allow_failure: true
-    - when: on_success
+
+    # upstream+forks: that's all folks
+    - when: never
diff --git a/ci/gitlab/sanity-checks.yml b/ci/gitlab/sanity-checks.yml
index 90f6ff8205..f843c7f708 100644
--- a/ci/gitlab/sanity-checks.yml
+++ b/ci/gitlab/sanity-checks.yml
@@ -10,9 +10,17 @@ check-dco:
   needs: []
   image: registry.gitlab.com/libvirt/libvirt-ci/check-dco:master
   script:
-    - /check-dco libvirt
-  except:
-    variables:
-      - $CI_PROJECT_NAMESPACE == 'libvirt'
+    - /check-dco "$RUN_UPSTREAM_NAMESPACE"
+  rules:
+    # upstream+forks: Run pipelines on MR
+    - if: '$CI_PIPELINE_SOURCE =~ "merge_request_event"'
+      when: on_success
+
+    # forks: pushes to branches with pipeline requested
+    - if: '$CI_PROJECT_NAMESPACE != $RUN_UPSTREAM_NAMESPACE && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH && $RUN_PIPELINE'
+      when: on_success
+
+    # upstream+forks: that's all folks
+    - when: never
   variables:
     GIT_DEPTH: 1000
diff --git a/ci/integration-template.yml b/ci/integration-template.yml
index a1fecbb78d..3347bb03ed 100644
--- a/ci/integration-template.yml
+++ b/ci/integration-template.yml
@@ -88,19 +88,38 @@
     paths:
       - logs
     when: on_failure
+
+.integration_tests_prebuilt_env:
+  extends: .integration_tests
+  rules:
+    - if: '$LIBVIRT_CI_INTEGRATION == null'
+      when: never
+    - !reference [.gitlab_native_build_job_prebuilt_env, rules]
+
+.integration_tests_local_env:
+  extends: .integration_tests
   rules:
-    - if: '$LIBVIRT_CI_INTEGRATION'
-      when: on_success
-    - when: never
+    - if: '$LIBVIRT_CI_INTEGRATION == null'
+      when: never
+    - !reference [.gitlab_native_build_job_local_env, rules]
 
 
 # YAML anchors don't work with Shell conditions so we can't use a variable
 # to conditionally build+install QEMU from source.
 # Instead, create a new test job template for this scenario.
 .integration_tests_upstream_qemu:
-  extends: .integration_tests
   before_script:
     - !reference [.integration_tests, before_script]
     - cd "$SCRATCH_DIR"
     - *qemu-build-template
     - sudo restorecon -R /usr
+
+.integration_tests_upstream_qemu_prebuilt_env:
+  extends:
+    - .integration_tests_prebuilt_env
+    - .integration_tests_upstream_qemu
+
+.integration_tests_upstream_qemu_local_env:
+  extends:
+    - .integration_tests_local_env
+    - .integration_tests_upstream_qemu
diff --git a/ci/integration.yml b/ci/integration.yml
index 0a349bc9b3..19d227faad 100644
--- a/ci/integration.yml
+++ b/ci/integration.yml
@@ -1,14 +1,7 @@
 include:
   - 'ci/integration-template.yml'
 
-centos-stream-8-tests:
-  extends: .integration_tests
-  needs:
-    - x86_64-centos-stream-8
-    - project: libvirt/libvirt-perl
-      job: x86_64-centos-stream-8-prebuilt-env
-      ref: master
-      artifacts: true
+.centos-stream-8-tests:
   variables:
     # needed by libvirt-gitlab-executor
     DISTRO: centos-stream-8
@@ -17,14 +10,30 @@ centos-stream-8-tests:
   tags:
     - $LIBVIRT_CI_INTEGRATION_RUNNER_TAG
 
-centos-stream-9-tests:
-  extends: .integration_tests
+centos-stream-8-tests-prebuilt-env:
+  extends:
+    - .integration_tests_prebuilt_env
+    - .centos-stream-8-tests
   needs:
-    - x86_64-centos-stream-9
+    - x86_64-centos-stream-8-prebuilt-env
     - project: libvirt/libvirt-perl
-      job: x86_64-centos-stream-9-prebuilt-env
+      job: x86_64-centos-stream-8-prebuilt-env
       ref: master
       artifacts: true
+
+centos-stream-8-tests-local-env:
+  extends:
+    - .integration_tests_local_env
+    - .centos-stream-8-tests
+  needs:
+    - x86_64-centos-stream-8-local-env
+    - project: libvirt/libvirt-perl
+      job: x86_64-centos-stream-8-prebuilt-env
+      ref: master
+      artifacts: true
+
+
+.centos-stream-9-tests:
   variables:
     # needed by libvirt-gitlab-executor
     DISTRO: centos-stream-9
@@ -33,14 +42,30 @@ centos-stream-9-tests:
   tags:
     - $LIBVIRT_CI_INTEGRATION_RUNNER_TAG
 
-fedora-35-tests:
-  extends: .integration_tests
+centos-stream-9-tests-prebuilt-env:
+  extends:
+    - .integration_tests_prebuilt_env
+    - .centos-stream-9-tests
   needs:
-    - x86_64-fedora-35
+    - x86_64-centos-stream-9-prebuilt-env
     - project: libvirt/libvirt-perl
-      job: x86_64-fedora-35-prebuilt-env
+      job: x86_64-centos-stream-9-prebuilt-env
+      ref: master
+      artifacts: true
+
+centos-stream-9-tests-local-env:
+  extends:
+    - .integration_tests_local_env
+    - .centos-stream-9-tests
+  needs:
+    - x86_64-centos-stream-9-local-env
+    - project: libvirt/libvirt-perl
+      job: x86_64-centos-stream-9-prebuilt-env
       ref: master
       artifacts: true
+
+
+.fedora-35-tests:
   variables:
     # needed by libvirt-gitlab-executor
     DISTRO: fedora-35
@@ -49,14 +74,30 @@ fedora-35-tests:
   tags:
     - $LIBVIRT_CI_INTEGRATION_RUNNER_TAG
 
-fedora-36-tests:
-  extends: .integration_tests
+fedora-35-tests-prebuilt-env:
+  extends:
+    - .integration_tests_prebuilt_env
+    - .fedora-35-tests
   needs:
-    - x86_64-fedora-36
+    - x86_64-fedora-35-prebuilt-env
     - project: libvirt/libvirt-perl
-      job: x86_64-fedora-36-prebuilt-env
+      job: x86_64-fedora-35-prebuilt-env
       ref: master
       artifacts: true
+
+fedora-35-tests-local-env:
+  extends:
+    - .integration_tests_local_env
+    - .fedora-35-tests
+  needs:
+    - x86_64-fedora-35-local-env
+    - project: libvirt/libvirt-perl
+      job: x86_64-fedora-35-prebuilt-env
+      ref: master
+      artifacts: true
+
+
+.fedora-36-tests:
   variables:
     # needed by libvirt-gitlab-executor
     DISTRO: fedora-36
@@ -65,14 +106,30 @@ fedora-36-tests:
   tags:
     - $LIBVIRT_CI_INTEGRATION_RUNNER_TAG
 
-fedora-36-upstream-qemu-tests:
-  extends: .integration_tests_upstream_qemu
+fedora-36-tests-prebuilt-env:
+  extends:
+    - .integration_tests_prebuilt_env
+    - .fedora-36-tests
   needs:
-    - x86_64-fedora-36
+    - x86_64-fedora-36-prebuilt-env
     - project: libvirt/libvirt-perl
       job: x86_64-fedora-36-prebuilt-env
       ref: master
       artifacts: true
+
+fedora-36-tests-local-env:
+  extends:
+    - .integration_tests_local_env
+    - .fedora-36-tests
+  needs:
+    - x86_64-fedora-36-local-env
+    - project: libvirt/libvirt-perl
+      job: x86_64-fedora-36-prebuilt-env
+      ref: master
+      artifacts: true
+
+
+.fedora-36-upstream-qemu-tests:
   variables:
     # needed by libvirt-gitlab-executor
     DISTRO: fedora-36
@@ -80,3 +137,25 @@ fedora-36-upstream-qemu-tests:
     LIBVIRT_CI_INTEGRATION_RUNNER_TAG: redhat-vm-host
   tags:
     - $LIBVIRT_CI_INTEGRATION_RUNNER_TAG
+
+fedora-36-upstream-qemu-tests-prebuilt-env:
+  extends:
+    - .integration_tests_prebuilt_env
+    - .fedora-36-upstream-qemu-tests
+  needs:
+    - x86_64-fedora-36-prebuilt-env
+    - project: libvirt/libvirt-perl
+      job: x86_64-fedora-36-prebuilt-env
+      ref: master
+      artifacts: true
+
+fedora-36-upstream-qemu-tests-local-env:
+  extends:
+    - .integration_tests_local_env
+    - .fedora-36-upstream-qemu-tests
+  needs:
+    - x86_64-fedora-36-local-env
+    - project: libvirt/libvirt-perl
+      job: x86_64-fedora-36-prebuilt-env
+      ref: master
+      artifacts: true
-- 
2.37.2




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux