Plans for nbdkit 1.26, libnbd 1.8 ?
by Richard W.M. Jones
It's been about 3½ months since stable branches of both projects were
released (synchronously, in early January). Could be time within the
next month or so for a new stable release. Is there anything you'd
like to get in before then, or conversely any large changes that
should wait until after?
----
For me, but none of them are urgent before this release:
Proposed nbdkit-forward-filter which ensures that we only do forward
reads over the plugin.
nbdkit-readahead-filter fix/replacement. Requires background threads,
this may be possible already.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines. Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v
3 years, 5 months
[PATCH libnbd] python: Make flake8 output more useful
by Nir Soffer
Add .flake8 configuration file enabling show_source and statistics. This
makes flake8 output more useful for handling bug reports like:
https://gitlab.com/nbdkit/libnbd/-/issues/4
For example I added some bad changes:
$ sh pycodestyle.sh
...
python/nbdsh.py:20:1: F401 'unused' imported but unused
import unused
^
python/nbdsh.py:22:1: E302 expected 2 blank lines, found 1
def bad_function():
^
python/nbdsh.py:24:80: E501 line too long (87 > 79 characters)
"""
bad doctring. bad doctring. bad doctring. bad doctring. bad doctring. bad doctring.
"""
^
/home/nsoffer/src/libnbd/python/nbdsh.py:28:1: E302 expected 2 blank lines, found 1
def shell():
^
2 E302 expected 2 blank lines, found 1
1 E501 line too long (87 > 79 characters)
1 F401 'unused' imported but unused
Signed-off-by: Nir Soffer <nsoffer(a)redhat.com>
---
python/.flake8 | 6 ++++++
1 file changed, 6 insertions(+)
create mode 100644 python/.flake8
diff --git a/python/.flake8 b/python/.flake8
new file mode 100644
index 0000000..0e1dec1
--- /dev/null
+++ b/python/.flake8
@@ -0,0 +1,6 @@
+[flake8]
+# Print the source code generating the error/warning in question.
+show_source = True
+
+# Count the number of occurrences of each error/warning code and print a report.
+statistics = True
--
2.26.3
3 years, 6 months
[PATCH libnbd] README: Add a note about the libev example
by Nir Soffer
Signed-off-by: Nir Soffer <nsoffer(a)redhat.com>
---
README | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/README b/README
index 12e293c..a4fdc89 100644
--- a/README
+++ b/README
@@ -113,8 +113,6 @@ Optional, only needed to run the test suite:
* qemu, qemu-io, qemu-img for interoperability testing.
- * glib2 for examples that interoperate with the glib main loop.
-
* psktool and certtool (part of GnuTLS) for testing TLS support.
* valgrind if you want to run the tests under valgrind.
@@ -125,6 +123,12 @@ Optional, only needed to run the test suite:
* ss (from iproute) for TCP-based tests.
+Optional, only needed to run some examles:
+
+ * glib2 for examples that interoperate with the glib main loop.
+
+ * libev for examples that interoperate with the libev library.
+
DOWNLOAD TARBALLS
=================
--
2.26.3
3 years, 6 months
[PATCH libnbd 0/2] libev example cleanups
by Nir Soffer
Simplify extents handling a little bit, and improve logging to make it easier
to understand what's going on.
Nir Soffer (2):
examples: copy-libev: Simplify start_extents()
examples: copy-libev: Log request sleeps
examples/copy-libev.c | 50 +++++++++++++++++++++++++++++--------------
1 file changed, 34 insertions(+), 16 deletions(-)
--
2.26.3
3 years, 6 months
[PATCH libnbd] examples: copy-libev: Simplify extents handling
by Nir Soffer
Using the libnbd format, pair of uint32_t per extent makes the code
harder to understand. Add extent struct and convert the extent entries
to simpler extent array.
Signed-off-by: Nir Soffer <nsoffer(a)redhat.com>
---
examples/copy-libev.c | 59 +++++++++++++++++++++++++------------------
1 file changed, 34 insertions(+), 25 deletions(-)
diff --git a/examples/copy-libev.c b/examples/copy-libev.c
index 2e39465..c6ae5be 100644
--- a/examples/copy-libev.c
+++ b/examples/copy-libev.c
@@ -91,25 +91,23 @@ struct request {
enum request_state state;
};
+struct extent {
+ uint32_t length;
+ bool zero;
+};
+
static struct ev_loop *loop;
static ev_prepare prepare;
static struct connection src;
static struct connection dst;
static struct request requests[MAX_REQUESTS];
-/* List of extents received from source server. Using the same format returned
- * by libnbd, array of uint32_t pairs. The first item is the length of the
- * extent, and the second is the extent flags.
- *
- * The number of extents is extents_len / 2. extents_pos is the index of the
- * current extent.
- *
- * extents_in_progress flag is set when we start asynchronous block status
- * request.
- */
-static uint32_t *extents;
+/* List of extents received from source server. */
+static struct extent *extents;
static size_t extents_len;
static size_t extents_pos;
+
+/* Set when we start asynchronous block status request. */
static bool extents_in_progress;
static int64_t size;
@@ -191,15 +189,26 @@ extent_callback (void *user_data, const char *metacontext, uint64_t offset,
return 1;
}
- extents = malloc (nr_entries * sizeof *extents);
+ /* Libnbd returns uint32_t pair (length, flags) for each extent. */
+ extents_len = nr_entries / 2;
+
+ extents = malloc (extents_len * sizeof *extents);
if (extents == NULL)
FAIL ("Cannot allocated extents: %s", strerror (errno));
- memcpy (extents, entries, nr_entries * sizeof *extents);
- extents_len = nr_entries;
+ /* Copy libnbd entries to extents array. */
+ for (int i = 0, j = 0; i < extents_len; i++, j=i*2) {
+ extents[i].length = entries[j];
+
+ /* Libnbd exposes both ZERO and HOLE flags. We care only about
+ * ZERO status, meaning we can copy this extent using efficinet
+ * zero method.
+ */
+ extents[i].zero = (entries[j + 1] & LIBNBD_STATE_ZERO) != 0;
+ }
DEBUG ("r%d: received %d extents for %s",
- r->index, nr_entries / 2, metacontext);
+ r->index, extents_len, metacontext);
return 1;
}
@@ -278,7 +287,7 @@ next_extent (struct request *r)
assert (extents);
- is_zero = extents[extents_pos + 1] & LIBNBD_STATE_ZERO;
+ is_zero = extents[extents_pos].zero;
/* Zero can be much faster, so try to zero entire extent. */
if (is_zero && dst.can_zero)
@@ -288,30 +297,30 @@ next_extent (struct request *r)
while (length < limit) {
DEBUG ("e%d: offset=%ld len=%ld zero=%d",
- extents_pos / 2, offset, extents[extents_pos], is_zero);
+ extents_pos, offset, extents[extents_pos].length, is_zero);
/* If this extent is too large, steal some data from it to
* complete the request.
*/
- if (length + extents[extents_pos] > limit) {
+ if (length + extents[extents_pos].length > limit) {
uint32_t stolen = limit - length;
- extents[extents_pos] -= stolen;
+ extents[extents_pos].length -= stolen;
length += stolen;
break;
}
/* Consume the entire extent and start looking at the next one. */
- length += extents[extents_pos];
- extents[extents_pos] = 0;
+ length += extents[extents_pos].length;
+ extents[extents_pos].length = 0;
- if (extents_pos + 2 == extents_len)
+ if (extents_pos + 1 == extents_len)
break;
- extents_pos += 2;
+ extents_pos++;
/* If next extent is different, we are done. */
- if ((extents[extents_pos + 1] & LIBNBD_STATE_ZERO) != is_zero)
+ if (extents[extents_pos].zero != is_zero)
break;
}
@@ -326,7 +335,7 @@ next_extent (struct request *r)
offset += length;
- if (extents_pos + 2 == extents_len && extents[extents_pos] == 0) {
+ if (extents_pos + 1 == extents_len && extents[extents_pos].length == 0) {
/* Processed all extents, clear extents. */
DEBUG ("r%d: consumed all extents offset=%ld", r->index, offset);
free (extents);
--
2.26.3
3 years, 6 months
[PATCH libnbd v2 0/6] Improve libev example
by Nir Soffer
- More correct polling
- Improve debug logs
- Support extents
- Add request state for easier debugging
- Add progress
Same as v1, with additional patches.
Nir Soffer (6):
examples: copy-libev.c: Improve polling
examples: copy-libev.c: Improve debug logs
examples: copy-libev.c: Support extents
examples: copy-libev.c: Optimize zero extents
examples: copy-libev.c: Add request state
examples: copy-libev.c: Add progress
examples/copy-libev.c | 352 +++++++++++++++++++++++++++++++++++++++---
1 file changed, 327 insertions(+), 25 deletions(-)
--
2.26.3
3 years, 6 months
Re: [Libguestfs] [libguestfs/virt-v2v] failed to parse ova (#6)
by Richard W.M. Jones
On Wed, Apr 21, 2021 at 12:14:09AM -0700, Étienne BERSAC wrote:
> Hi,
>
> I'm migrating from virt-convert to virt-v2v. I encounter the following error :
>
> $ virt-v2v -v -x -i ova cornac.ova -o libvirt
> virt-v2v: virt-v2v 1.43.5 (x86_64)
> libvirt version: 7.0.0
> [ 0.0] Opening the source -i ova cornac.ova
> qemu-img info json:'{ "file": { "driver": "raw", "offset": 512, "size": 512, "file": { "filename": "/tmp/v2vqemuimgtst110010.img" } } }' >/dev/null
> qemu-img supports "offset" and "size" in json URLs: true
> libguestfs: trace: set_verbose true
> libguestfs: trace: set_verbose = 0
> libguestfs: trace: get_backend
> libguestfs: trace: get_backend = "direct"
> tar -tf 'cornac.ova'
> tar -xf 'cornac.ova' -C '/var/tmp/ova.b0jm2D' 'cornac.ovf'
> ova: testing if cornac-sda.vmdk exists in cornac.ova
> ova: file exists
> tar tRvf 'cornac.ova'
> libguestfs: trace: close
> libguestfs: closing guestfs handle 0x55c1f751e7b0 (state 0)
> virt-v2v: error: failed to parse line returned by tar: "bloc 0 : -rw-r--r--
> bersace/bersace 3702 2020-11-12 15:16 cornac.ovf"
Interesting - I suspect this is an issue with the presumably French
locale. The output of tar changes and we cannot parse it:
$ LANG=fr_FR tar tRvf /mnt/scratch/libguestfs-1.45.5.tar.gz | head -2
bloc 2 : drwxr-xr-x rjones/rjones 0 2021-04-09 11:37 libguestfs-1.45.5/
bloc 5 : -rw-rw-r-- rjones/rjones 26530 2020-03-06 19:31 libguestfs-1.45.5/COPYING.LIB
$ LANG=en_GB tar tRvf /mnt/scratch/libguestfs-1.45.5.tar.gz | head -2
block 2: drwxr-xr-x rjones/rjones 0 2021-04-09 11:37 libguestfs-1.45.5/
block 5: -rw-rw-r-- rjones/rjones 26530 2020-03-06 19:31 libguestfs-1.45.5/COPYING.LIB
This is a bug in both virt-v2v and nbdkit, but should be easy to fix.
You can work around it by setting LANG=C before running virt-v2v.
> rm -rf '/var/tmp/ova.b0jm2D'
> rm -rf '/var/tmp/null.v6fmgC'
>
> This ova is generated with tar from https://gitlab.com/dalibo/cornac/-/blob/
> master/appliance/cornac.ovf and a vmdk generated by packer.
>
> Do you have a clue on what is wrong with this .ova ?
We don't generally support imports from any OVA, only ones created by
VMware, so even if the above is fixed then YMMV.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine. Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/
3 years, 6 months
[libnbd RFC PATCH] First stab at CI infrastructure
by Martin Kletzander
This is a first try for adding a CI to libnbd. It uses the libvirt-ci to
get as much coverage as possible with the ease of use provided by that
repository. Not all the data are available there at the time of posting
this patch, so if anyone wants to recreate the Containerfiles and
variable files (for cirrus CI) my temporary branch of libvirt-ci called
nbd_prep:
https://gitlab.com/nertpinx/libvirt-ci/-/tree/nbd_prep
The result of this branch CI run is available here:
https://gitlab.com/nertpinx/libnbd/-/pipelines
As you can see there are errors. I went down a rabbit hole of trying to
figure out one of them, but ended up not being sure what the preferred
way of fixing that particular issue would be. So instead of trying
myself and raising various questions every single day I am posting this
here as handling it myself would take too much time and I would be
bothering other people throughout days and days going forward.
If there are any questions related to how the CI is running, how it
works, how to replicate CI builds locally or how to change anything,
then I am more than happy to help.
Actually recreating the builds locally (at least for Linux distributions
and setups) is pretty straightforward. Choose a file from ci/containers
which represents the desired setup, for our example let's pick fedora
rawhide, and build your container and tag it, e.g. using podman (or feel
free to substitute "podman" with "docker"):
podman build ci/containers/fedora-33.Dockerfile -t libnbd-fedora-rawhide
That will get you a container tagged `libnbd-fedora-rawhide` that you
can execute the tests on. You can then run whatever you want inside
that container with the current repository passed through like this:
podman run -it --rm -v .:/repo -w /repo libnbd-fedora-rawhide bash
which will bind-mount the current directory onto /repo inside the
container and also use that path as the working directory (just so you
do not have to `cd /repo` before any commands. I prefer running bash,
but of course you can just run the build script used in the CI. I have
put all the commands into one file for simplicity, so that you can
simply specifically `ci/build_script.sh`. So simply executing that
script will give you the results and you can experiment right inside
that environment to figure out what is needed. At the same time you can
easily modify any files inside that repository on your host, just like
you are used to, so that you can use your editor and other setups that
work for you.
Last few things to note:
- You should make sure that build files do not interfere between the
host and the container, if you want to replicate a clean build you
need to either use VPATH or just clean everything.
- No tests include running make distcheck as that seems a bit more
broken and could be fixed after more pressing issues are dealt with,
just so the output does not interfere in the meantime.
Let me know what you think, and have a nice day.
---
.gitlab-ci.yml | 490 ++++++++++++++++++
ci/build_script.sh | 24 +
ci/cirrus/build.yml | 22 +
ci/cirrus/freebsd-12.vars | 14 +
ci/cirrus/freebsd-current.vars | 14 +
ci/cirrus/macos-11.vars | 14 +
ci/cirrus/refresh | 22 +
ci/containers/README.rst | 14 +
ci/containers/centos-7.Dockerfile | 47 ++
ci/containers/centos-8.Dockerfile | 49 ++
ci/containers/centos-stream.Dockerfile | 51 ++
.../debian-10-cross-aarch64.Dockerfile | 75 +++
.../debian-10-cross-armv6l.Dockerfile | 75 +++
.../debian-10-cross-armv7l.Dockerfile | 75 +++
ci/containers/debian-10-cross-i686.Dockerfile | 75 +++
ci/containers/debian-10-cross-mips.Dockerfile | 75 +++
.../debian-10-cross-mips64el.Dockerfile | 75 +++
.../debian-10-cross-mipsel.Dockerfile | 75 +++
.../debian-10-cross-ppc64le.Dockerfile | 75 +++
.../debian-10-cross-s390x.Dockerfile | 75 +++
ci/containers/debian-10.Dockerfile | 50 ++
.../debian-sid-cross-aarch64.Dockerfile | 75 +++
.../debian-sid-cross-armv6l.Dockerfile | 75 +++
.../debian-sid-cross-armv7l.Dockerfile | 75 +++
.../debian-sid-cross-i686.Dockerfile | 75 +++
.../debian-sid-cross-mips64el.Dockerfile | 75 +++
.../debian-sid-cross-mipsel.Dockerfile | 75 +++
.../debian-sid-cross-ppc64le.Dockerfile | 75 +++
.../debian-sid-cross-s390x.Dockerfile | 75 +++
ci/containers/debian-sid.Dockerfile | 50 ++
ci/containers/fedora-32.Dockerfile | 55 ++
ci/containers/fedora-33.Dockerfile | 55 ++
.../fedora-rawhide-cross-mingw32.Dockerfile | 60 +++
.../fedora-rawhide-cross-mingw64.Dockerfile | 60 +++
ci/containers/fedora-rawhide.Dockerfile | 56 ++
ci/containers/opensuse-152.Dockerfile | 44 ++
ci/containers/refresh | 42 ++
ci/containers/ubuntu-1804.Dockerfile | 50 ++
ci/containers/ubuntu-2004.Dockerfile | 50 ++
39 files changed, 2608 insertions(+)
create mode 100644 .gitlab-ci.yml
create mode 100755 ci/build_script.sh
create mode 100644 ci/cirrus/build.yml
create mode 100644 ci/cirrus/freebsd-12.vars
create mode 100644 ci/cirrus/freebsd-current.vars
create mode 100644 ci/cirrus/macos-11.vars
create mode 100755 ci/cirrus/refresh
create mode 100644 ci/containers/README.rst
create mode 100644 ci/containers/centos-7.Dockerfile
create mode 100644 ci/containers/centos-8.Dockerfile
create mode 100644 ci/containers/centos-stream.Dockerfile
create mode 100644 ci/containers/debian-10-cross-aarch64.Dockerfile
create mode 100644 ci/containers/debian-10-cross-armv6l.Dockerfile
create mode 100644 ci/containers/debian-10-cross-armv7l.Dockerfile
create mode 100644 ci/containers/debian-10-cross-i686.Dockerfile
create mode 100644 ci/containers/debian-10-cross-mips.Dockerfile
create mode 100644 ci/containers/debian-10-cross-mips64el.Dockerfile
create mode 100644 ci/containers/debian-10-cross-mipsel.Dockerfile
create mode 100644 ci/containers/debian-10-cross-ppc64le.Dockerfile
create mode 100644 ci/containers/debian-10-cross-s390x.Dockerfile
create mode 100644 ci/containers/debian-10.Dockerfile
create mode 100644 ci/containers/debian-sid-cross-aarch64.Dockerfile
create mode 100644 ci/containers/debian-sid-cross-armv6l.Dockerfile
create mode 100644 ci/containers/debian-sid-cross-armv7l.Dockerfile
create mode 100644 ci/containers/debian-sid-cross-i686.Dockerfile
create mode 100644 ci/containers/debian-sid-cross-mips64el.Dockerfile
create mode 100644 ci/containers/debian-sid-cross-mipsel.Dockerfile
create mode 100644 ci/containers/debian-sid-cross-ppc64le.Dockerfile
create mode 100644 ci/containers/debian-sid-cross-s390x.Dockerfile
create mode 100644 ci/containers/debian-sid.Dockerfile
create mode 100644 ci/containers/fedora-32.Dockerfile
create mode 100644 ci/containers/fedora-33.Dockerfile
create mode 100644 ci/containers/fedora-rawhide-cross-mingw32.Dockerfile
create mode 100644 ci/containers/fedora-rawhide-cross-mingw64.Dockerfile
create mode 100644 ci/containers/fedora-rawhide.Dockerfile
create mode 100644 ci/containers/opensuse-152.Dockerfile
create mode 100755 ci/containers/refresh
create mode 100644 ci/containers/ubuntu-1804.Dockerfile
create mode 100644 ci/containers/ubuntu-2004.Dockerfile
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 000000000000..7e4a7911afac
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,490 @@
+variables:
+ GIT_DEPTH: 100
+
+stages:
+ - containers
+ - builds
+
+.script_variables: &script_variables |
+ export MAKEFLAGS="-j $(getconf _NPROCESSORS_ONLN)"
+ export CCACHE_BASEDIR="$(pwd)"
+ export CCACHE_DIR="$CCACHE_BASEDIR/ccache"
+ export CCACHE_MAXSIZE="500M"
+ export PATH="$CCACHE_WRAPPERSDIR:$PATH"
+
+# Common templates
+
+.container_job:
+ image: docker:stable
+ stage: containers
+ needs: []
+ services:
+ - docker:dind
+ rules:
+ - if: "$TEMPORARILY_DISABLED"
+ allow_failure: true
+ - when: on_success
+ before_script:
+ - export TAG="$CI_REGISTRY_IMAGE/ci-$NAME:latest"
+ - export COMMON_TAG="$CI_REGISTRY/nbdkit/libnbd/ci-$NAME:latest"
+ - docker info
+ - docker login registry.gitlab.com -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD"
+ script:
+ - 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
+ - docker push "$TAG"
+ after_script:
+ - docker logout
+
+# We build many containers which can be useful to debug problems but are not
+# needed for the pipeline itself to complete: those sometimes fail, and when
+# that happens it's mostly because of temporary issues with Debian sid. We
+# don't want those failures to affect the overall pipeline status
+.container_optional_job:
+ extends: .container_job
+ allow_failure: true
+
+.native_build_job:
+ stage: builds
+ image: $CI_REGISTRY_IMAGE/ci-$NAME:latest
+ rules:
+ - if: "$TEMPORARILY_DISABLED"
+ allow_failure: true
+ - when: on_success
+ cache:
+ paths:
+ - ccache/
+ key: "$CI_JOB_NAME"
+ before_script:
+ - *script_variables
+ script:
+ - ci/build_script.sh
+
+# Jobs that we delegate to Cirrus CI because they require an operating
+# system other than Linux. These jobs will only run if the required
+# setup has been performed on the GitLab account (see ci/README.rst).
+#
+# The Cirrus CI configuration is generated by replacing target-specific
+# variables in a generic template: some of these variables are provided
+# when the GitLab CI job is defined, others are taken from a shell
+# snippet generated using lcitool.
+#
+# Note that the $PATH environment variable has to be treated with
+# special care, because we can't just override it at the GitLab CI job
+# definition level or we risk breaking it completely.
+.cirrus_build_job:
+ stage: builds
+ image: registry.gitlab.com/libvirt/libvirt-ci/cirrus-run:master
+ needs: []
+ script:
+ - source ci/cirrus/$NAME.vars
+ - sed -e "s|[@]CI_REPOSITORY_URL@|$CI_REPOSITORY_URL|g"
+ -e "s|[@]CI_COMMIT_REF_NAME@|$CI_COMMIT_REF_NAME|g"
+ -e "s|[@]CI_COMMIT_SHA@|$CI_COMMIT_SHA|g"
+ -e "s|[@]CIRRUS_VM_INSTANCE_TYPE@|$CIRRUS_VM_INSTANCE_TYPE|g"
+ -e "s|[@]CIRRUS_VM_IMAGE_SELECTOR@|$CIRRUS_VM_IMAGE_SELECTOR|g"
+ -e "s|[@]CIRRUS_VM_IMAGE_NAME@|$CIRRUS_VM_IMAGE_NAME|g"
+ -e "s|[@]UPDATE_COMMAND@|$UPDATE_COMMAND|g"
+ -e "s|[@]INSTALL_COMMAND@|$INSTALL_COMMAND|g"
+ -e "s|[@]PATH@|$PATH_EXTRA${PATH_EXTRA:+:}\$PATH|g"
+ -e "s|[@]PKG_CONFIG_PATH@|$PKG_CONFIG_PATH|g"
+ -e "s|[@]PKGS@|$PKGS|g"
+ -e "s|[@]MAKE@|$MAKE|g"
+ -e "s|[@]PYTHON@|$PYTHON|g"
+ -e "s|[@]PIP3@|$PIP3|g"
+ -e "s|[@]PYPI_PKGS@|$PYPI_PKGS|g"
+ <ci/cirrus/build.yml >ci/cirrus/$NAME.yml
+ - cat ci/cirrus/$NAME.yml
+ - cirrus-run -v --show-build-log always ci/cirrus/$NAME.yml
+ rules:
+ - if: "$TEMPORARILY_DISABLED"
+ allow_failure: true
+ - if: "$CIRRUS_GITHUB_REPO && $CIRRUS_API_TOKEN"
+
+.cross_build_job:
+ stage: builds
+ image: $CI_REGISTRY_IMAGE/ci-$NAME-cross-$CROSS:latest
+ cache:
+ paths:
+ - ccache/
+ key: "$CI_JOB_NAME"
+ rules:
+ - if: "$TEMPORARILY_DISABLED"
+ allow_failure: true
+ - when: on_success
+ before_script:
+ - *script_variables
+ script:
+ - ci/build_script.sh
+
+# Native container build jobs
+
+x64-centos-7-container:
+ extends: .container_job
+ variables:
+ NAME: centos-7
+
+x64-centos-8-container:
+ extends: .container_job
+ variables:
+ NAME: centos-8
+
+x64-centos-stream-container:
+ extends: .container_job
+ variables:
+ NAME: centos-stream
+
+x64-debian-10-container:
+ extends: .container_job
+ variables:
+ NAME: debian-10
+
+x64-debian-sid-container:
+ extends: .container_job
+ variables:
+ NAME: debian-sid
+
+x64-fedora-32-container:
+ extends: .container_job
+ variables:
+ NAME: fedora-32
+
+x64-fedora-33-container:
+ extends: .container_job
+ variables:
+ NAME: fedora-33
+
+x64-fedora-rawhide-container:
+ extends: .container_job
+ variables:
+ NAME: fedora-rawhide
+
+x64-opensuse-152-container:
+ extends: .container_job
+ variables:
+ NAME: opensuse-152
+
+x64-ubuntu-1804-container:
+ extends: .container_job
+ variables:
+ NAME: ubuntu-1804
+
+x64-ubuntu-2004-container:
+ extends: .container_job
+ variables:
+ NAME: ubuntu-2004
+
+
+# Cross-build containers build jobs
+
+aarch64-debian-10-container:
+ extends: .container_optional_job
+ variables:
+ NAME: debian-10-cross-aarch64
+
+armv6l-debian-10-container:
+ extends: .container_job
+ variables:
+ NAME: debian-10-cross-armv6l
+
+armv7l-debian-10-container:
+ extends: .container_job
+ variables:
+ NAME: debian-10-cross-armv7l
+
+i686-debian-10-container:
+ extends: .container_optional_job
+ variables:
+ NAME: debian-10-cross-i686
+
+mips-debian-10-container:
+ extends: .container_job
+ variables:
+ NAME: debian-10-cross-mips
+
+mips64el-debian-10-container:
+ extends: .container_optional_job
+ variables:
+ NAME: debian-10-cross-mips64el
+
+mipsel-debian-10-container:
+ extends: .container_job
+ variables:
+ NAME: debian-10-cross-mipsel
+
+ppc64le-debian-10-container:
+ extends: .container_job
+ variables:
+ NAME: debian-10-cross-ppc64le
+
+s390x-debian-10-container:
+ extends: .container_optional_job
+ variables:
+ NAME: debian-10-cross-s390x
+
+aarch64-debian-sid-container:
+ extends: .container_job
+ variables:
+ NAME: debian-sid-cross-aarch64
+
+armv6l-debian-sid-container:
+ extends: .container_optional_job
+ variables:
+ NAME: debian-sid-cross-armv6l
+
+armv7l-debian-sid-container:
+ extends: .container_optional_job
+ variables:
+ NAME: debian-sid-cross-armv7l
+
+i686-debian-sid-container:
+ extends: .container_job
+ variables:
+ NAME: debian-sid-cross-i686
+
+mips64el-debian-sid-container:
+ extends: .container_job
+ variables:
+ NAME: debian-sid-cross-mips64el
+
+mipsel-debian-sid-container:
+ extends: .container_optional_job
+ variables:
+ NAME: debian-sid-cross-mipsel
+
+ppc64le-debian-sid-container:
+ extends: .container_optional_job
+ variables:
+ NAME: debian-sid-cross-ppc64le
+
+s390x-debian-sid-container:
+ extends: .container_job
+ variables:
+ NAME: debian-sid-cross-s390x
+
+mingw32-fedora-rawhide-container:
+ extends: .container_job
+ variables:
+ NAME: fedora-rawhide-cross-mingw32
+
+mingw64-fedora-rawhide-container:
+ extends: .container_job
+ variables:
+ NAME: fedora-rawhide-cross-mingw64
+
+
+# Native architecture build + test jobs
+
+x64-debian-10:
+ extends: .native_build_job
+ needs:
+ - x64-debian-10-container
+ variables:
+ NAME: debian-10
+
+x64-debian-10-clang:
+ extends: .native_build_job
+ needs:
+ - x64-debian-10-container
+ variables:
+ NAME: debian-10
+ CC: clang
+
+x64-debian-sid:
+ extends: .native_build_job
+ needs:
+ - x64-debian-sid-container
+ variables:
+ NAME: debian-sid
+
+x64-centos-7:
+ extends: .native_build_job
+ needs:
+ - x64-centos-7-container
+ variables:
+ NAME: centos-7
+
+x64-centos-8:
+ extends: .native_build_job
+ needs:
+ - x64-centos-8-container
+ variables:
+ NAME: centos-8
+
+x64-centos-8-clang:
+ extends: .native_build_job
+ needs:
+ - x64-centos-8-container
+ variables:
+ NAME: centos-8
+ CC: clang
+
+x64-centos-stream:
+ extends: .native_build_job
+ needs:
+ - x64-centos-stream-container
+ variables:
+ NAME: centos-stream
+
+x64-fedora-32:
+ extends: .native_build_job
+ needs:
+ - x64-fedora-32-container
+ variables:
+ NAME: fedora-32
+
+x64-fedora-33:
+ extends: .native_build_job
+ needs:
+ - x64-fedora-33-container
+ variables:
+ NAME: fedora-33
+
+x64-fedora-rawhide:
+ extends: .native_build_job
+ needs:
+ - x64-fedora-rawhide-container
+ variables:
+ NAME: fedora-rawhide
+
+x64-fedora-rawhide-clang:
+ extends: .native_build_job
+ needs:
+ - x64-fedora-rawhide-container
+ variables:
+ NAME: fedora-rawhide
+ CC: clang
+
+x64-opensuse-152:
+ extends: .native_build_job
+ needs:
+ - x64-opensuse-152-container
+ variables:
+ NAME: opensuse-152
+
+x64-ubuntu-1804:
+ extends: .native_build_job
+ needs:
+ - x64-ubuntu-1804-container
+ variables:
+ NAME: ubuntu-1804
+
+x64-ubuntu-2004:
+ extends: .native_build_job
+ needs:
+ - x64-ubuntu-2004-container
+ variables:
+ NAME: ubuntu-2004
+
+x64-freebsd-12-build:
+ extends: .cirrus_build_job
+ variables:
+ NAME: freebsd-12
+ CIRRUS_VM_INSTANCE_TYPE: freebsd_instance
+ CIRRUS_VM_IMAGE_SELECTOR: image_family
+ CIRRUS_VM_IMAGE_NAME: freebsd-12-2
+ UPDATE_COMMAND: pkg update
+ INSTALL_COMMAND: pkg install -y
+
+x64-macos-11-build:
+ extends: .cirrus_build_job
+ variables:
+ NAME: macos-11
+ CIRRUS_VM_INSTANCE_TYPE: osx_instance
+ CIRRUS_VM_IMAGE_SELECTOR: image
+ CIRRUS_VM_IMAGE_NAME: big-sur-base
+ UPDATE_COMMAND: brew update
+ INSTALL_COMMAND: brew install
+ PATH_EXTRA: /usr/local/opt/ccache/libexec:/usr/local/opt/gettext/bin:/usr/local/opt/libpcap/bin:/usr/local/opt/libxslt/bin:/usr/local/opt/rpcgen/bin
+ PKG_CONFIG_PATH: /usr/local/opt/curl/lib/pkgconfig:/usr/local/opt/libpcap/lib/pkgconfig:/usr/local/opt/libxml2/lib/pkgconfig:/usr/local/opt/ncurses/lib/pkgconfig:/usr/local/opt/readline/lib/pkgconfig
+
+
+# Cross compiled build jobs
+
+aarch64-debian-sid:
+ extends: .cross_build_job
+ needs:
+ - aarch64-debian-sid-container
+ variables:
+ NAME: debian-sid
+ CROSS: aarch64
+
+armv6l-debian-10:
+ extends: .cross_build_job
+ needs:
+ - armv6l-debian-10-container
+ variables:
+ NAME: debian-10
+ CROSS: armv6l
+
+armv7l-debian-10:
+ extends: .cross_build_job
+ needs:
+ - armv7l-debian-10-container
+ variables:
+ NAME: debian-10
+ CROSS: armv7l
+
+i686-debian-sid:
+ extends: .cross_build_job
+ needs:
+ - i686-debian-sid-container
+ variables:
+ NAME: debian-sid
+ CROSS: i686
+
+mips-debian-10:
+ extends: .cross_build_job
+ needs:
+ - mips-debian-10-container
+ variables:
+ NAME: debian-10
+ CROSS: mips
+
+mips64el-debian-sid:
+ extends: .cross_build_job
+ needs:
+ - mips64el-debian-sid-container
+ variables:
+ NAME: debian-sid
+ CROSS: mips64el
+
+mipsel-debian-10:
+ extends: .cross_build_job
+ needs:
+ - mipsel-debian-10-container
+ variables:
+ NAME: debian-10
+ CROSS: mipsel
+
+ppc64le-debian-10:
+ extends: .cross_build_job
+ needs:
+ - ppc64le-debian-10-container
+ variables:
+ NAME: debian-10
+ CROSS: ppc64le
+
+s390x-debian-sid:
+ extends: .cross_build_job
+ needs:
+ - s390x-debian-sid-container
+ variables:
+ NAME: debian-sid
+ CROSS: s390x
+
+mingw32-fedora-rawhide:
+ extends: .cross_build_job
+ needs:
+ - mingw32-fedora-rawhide-container
+ variables:
+ NAME: fedora-rawhide
+ CROSS: mingw32
+
+mingw64-fedora-rawhide:
+ extends: .cross_build_job
+ needs:
+ - mingw64-fedora-rawhide-container
+ variables:
+ NAME: fedora-rawhide
+ CROSS: mingw64
diff --git a/ci/build_script.sh b/ci/build_script.sh
new file mode 100755
index 000000000000..7c176de9d3da
--- /dev/null
+++ b/ci/build_script.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+set -e
+
+main() {
+ autoreconf -if
+ ./configure --enable-gcc-warnings --enable-fuse --enable-ocaml --enable-python --enable-golang --with-gnutls --with-libxml2
+
+ $MAKE
+
+ if test -n "$CROSS"
+ then
+ return 0
+ fi
+
+ $MAKE check || find . -name test-suite.log -exec grep -l '^X\?FAIL:' '{}' \+ | xargs cat
+
+ if test "$DIST" == "force"
+ then
+ $MAKE distcheck
+ fi
+}
+
+main "$@"
diff --git a/ci/cirrus/build.yml b/ci/cirrus/build.yml
new file mode 100644
index 000000000000..5a5c65e3b640
--- /dev/null
+++ b/ci/cirrus/build.yml
@@ -0,0 +1,22 @@
+@CIRRUS_VM_INSTANCE_TYPE@:
+ @CIRRUS_VM_IMAGE_SELECTOR@: @CIRRUS_VM_IMAGE_NAME@
+
+env:
+ CI_REPOSITORY_URL: "@CI_REPOSITORY_URL@"
+ CI_COMMIT_REF_NAME: "@CI_COMMIT_REF_NAME@"
+ CI_COMMIT_SHA: "@CI_COMMIT_SHA@"
+ PATH: "@PATH@"
+ PKG_CONFIG_PATH: "@PKG_CONFIG_PATH@"
+ PYTHON: "@PYTHON@"
+ MAKE: "@MAKE@"
+
+build_task:
+ install_script:
+ - @INSTALL_COMMAND@ @PKGS@
+ - if test -n "@PYPI_PKGS@" ; then @PIP3@ install @PYPI_PKGS@ ; fi
+ clone_script:
+ - git clone --depth 100 "$CI_REPOSITORY_URL" .
+ - git fetch origin "$CI_COMMIT_REF_NAME"
+ - git reset --hard "$CI_COMMIT_SHA"
+ build_script:
+ - ci/build_script.sh
diff --git a/ci/cirrus/freebsd-12.vars b/ci/cirrus/freebsd-12.vars
new file mode 100644
index 000000000000..2044439ca3e8
--- /dev/null
+++ b/ci/cirrus/freebsd-12.vars
@@ -0,0 +1,14 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool variables freebsd-12 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+PACKAGING_COMMAND='pkg'
+CC='/usr/bin/clang'
+CCACHE='/usr/local/bin/ccache'
+MAKE='/usr/local/bin/gmake'
+NINJA='/usr/local/bin/ninja'
+PYTHON='/usr/local/bin/python3'
+PIP3='/usr/local/bin/pip-3.7'
+PKGS='autoconf automake bash-completion ca_root_nss ccache coreutils diffutils fusefs-libs git gmake gnutls go gsed libtool libxml2 ocaml ocaml-findlib perl5 pkgconf python3 qemu'
diff --git a/ci/cirrus/freebsd-current.vars b/ci/cirrus/freebsd-current.vars
new file mode 100644
index 000000000000..02be9eb0e92c
--- /dev/null
+++ b/ci/cirrus/freebsd-current.vars
@@ -0,0 +1,14 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool variables freebsd-current libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+PACKAGING_COMMAND='pkg'
+CC='/usr/bin/clang'
+CCACHE='/usr/local/bin/ccache'
+MAKE='/usr/local/bin/gmake'
+NINJA='/usr/local/bin/ninja'
+PYTHON='/usr/local/bin/python3'
+PIP3='/usr/local/bin/pip-3.7'
+PKGS='autoconf automake bash-completion ca_root_nss ccache coreutils diffutils fusefs-libs git gmake gnutls go gsed libtool libxml2 ocaml ocaml-findlib perl5 pkgconf python3 qemu'
diff --git a/ci/cirrus/macos-11.vars b/ci/cirrus/macos-11.vars
new file mode 100644
index 000000000000..8618d2ba97b8
--- /dev/null
+++ b/ci/cirrus/macos-11.vars
@@ -0,0 +1,14 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool variables macos-11 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+PACKAGING_COMMAND='brew'
+CC='/usr/bin/clang'
+CCACHE='/usr/local/bin/ccache'
+MAKE='/usr/local/bin/gmake'
+NINJA='/usr/local/bin/ninja'
+PYTHON='/usr/local/bin/python3'
+PIP3='/usr/local/bin/pip3'
+PKGS='autoconf automake bash-completion ccache coreutils diffutils git gnu-sed gnutls golang libtool libxml2 make ocaml ocaml-findlib perl pkg-config python3 qemu'
diff --git a/ci/cirrus/refresh b/ci/cirrus/refresh
new file mode 100755
index 000000000000..459cd80d0934
--- /dev/null
+++ b/ci/cirrus/refresh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+if test -z "$1"
+then
+ echo "syntax: $0 PATH-TO-LCITOOL"
+ exit 1
+fi
+
+LCITOOL=$1
+
+if ! test -x "$LCITOOL"
+then
+ echo "$LCITOOL is not executable"
+ exit 1
+fi
+
+HOSTS=$($LCITOOL hosts | grep -E 'freebsd|macos')
+
+for host in $HOSTS
+do
+ $LCITOOL variables "$host" libnbd >"$host.vars"
+done
diff --git a/ci/containers/README.rst b/ci/containers/README.rst
new file mode 100644
index 000000000000..530897e311f5
--- /dev/null
+++ b/ci/containers/README.rst
@@ -0,0 +1,14 @@
+CI job assets
+=============
+
+This directory contains assets used in the automated CI jobs, most
+notably the Dockerfiles used to build container images in which the
+CI jobs then run.
+
+The ``refresh`` script is used to re-create the Dockerfiles using the
+``lcitool`` command that is provided by repo
+https://gitlab.com/libvirt/libvirt-ci
+
+The containers are built during the CI process and cached in the GitLab
+container registry of the project doing the build. The cached containers
+can be deleted at any time and will be correctly rebuilt.
diff --git a/ci/containers/centos-7.Dockerfile b/ci/containers/centos-7.Dockerfile
new file mode 100644
index 000000000000..7690e509761f
--- /dev/null
+++ b/ci/containers/centos-7.Dockerfile
@@ -0,0 +1,47 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile centos-7 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/centos:7
+
+RUN yum update -y && \
+ echo 'skip_missing_names_on_install=0' >> /etc/yum.conf && \
+ yum install -y epel-release && \
+ yum install -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ fuse-devel \
+ gcc \
+ git \
+ glibc-common \
+ glibc-devel \
+ gnutls-devel \
+ golang \
+ libtool \
+ libxml2-devel \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconfig \
+ python36-devel \
+ qemu-img \
+ sed && \
+ yum autoremove -y && \
+ yum clean all -y && \
+ 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/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/centos-8.Dockerfile b/ci/containers/centos-8.Dockerfile
new file mode 100644
index 000000000000..689b010d47fd
--- /dev/null
+++ b/ci/containers/centos-8.Dockerfile
@@ -0,0 +1,49 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile centos-8 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/centos:8
+
+RUN 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 \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils-single \
+ diffutils \
+ fuse-devel \
+ gcc \
+ git \
+ glibc-devel \
+ glibc-langpack-en \
+ gnutls-devel \
+ golang \
+ libtool \
+ libxml2-devel \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconfig \
+ python3-devel \
+ qemu-img \
+ sed && \
+ dnf autoremove -y && \
+ dnf clean all -y && \
+ 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/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/centos-stream.Dockerfile b/ci/containers/centos-stream.Dockerfile
new file mode 100644
index 000000000000..08e5372f8ee3
--- /dev/null
+++ b/ci/containers/centos-stream.Dockerfile
@@ -0,0 +1,51 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile centos-stream libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/centos:8
+
+RUN dnf install -y centos-release-stream && \
+ dnf install -y centos-stream-release && \
+ 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 \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils-single \
+ diffutils \
+ fuse-devel \
+ gcc \
+ git \
+ glibc-devel \
+ glibc-langpack-en \
+ gnutls-devel \
+ golang \
+ libtool \
+ libxml2-devel \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconfig \
+ python3-devel \
+ qemu-img \
+ sed && \
+ dnf autoremove -y && \
+ dnf clean all -y && \
+ 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/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/debian-10-cross-aarch64.Dockerfile b/ci/containers/debian-10-cross-aarch64.Dockerfile
new file mode 100644
index 000000000000..7f5458fc5f83
--- /dev/null
+++ b/ci/containers/debian-10-cross-aarch64.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross aarch64 debian-10 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:10-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/aarch64-linux-gnu-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/aarch64-linux-gnu-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture arm64 && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:arm64 \
+ libfuse-dev:arm64 \
+ libgnutls28-dev:arm64 \
+ libxml2-dev:arm64 && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "aarch64-linux-gnu"
+ENV CONFIGURE_OPTS "--host=aarch64-linux-gnu"
diff --git a/ci/containers/debian-10-cross-armv6l.Dockerfile b/ci/containers/debian-10-cross-armv6l.Dockerfile
new file mode 100644
index 000000000000..5d200639353c
--- /dev/null
+++ b/ci/containers/debian-10-cross-armv6l.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross armv6l debian-10 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:10-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/arm-linux-gnueabi-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/arm-linux-gnueabi-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture armel && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:armel \
+ libfuse-dev:armel \
+ libgnutls28-dev:armel \
+ libxml2-dev:armel && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "arm-linux-gnueabi"
+ENV CONFIGURE_OPTS "--host=arm-linux-gnueabi"
diff --git a/ci/containers/debian-10-cross-armv7l.Dockerfile b/ci/containers/debian-10-cross-armv7l.Dockerfile
new file mode 100644
index 000000000000..d2e41c5fa121
--- /dev/null
+++ b/ci/containers/debian-10-cross-armv7l.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross armv7l debian-10 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:10-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/arm-linux-gnueabihf-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/arm-linux-gnueabihf-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture armhf && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:armhf \
+ libfuse-dev:armhf \
+ libgnutls28-dev:armhf \
+ libxml2-dev:armhf && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "arm-linux-gnueabihf"
+ENV CONFIGURE_OPTS "--host=arm-linux-gnueabihf"
diff --git a/ci/containers/debian-10-cross-i686.Dockerfile b/ci/containers/debian-10-cross-i686.Dockerfile
new file mode 100644
index 000000000000..f6bf49f66105
--- /dev/null
+++ b/ci/containers/debian-10-cross-i686.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross i686 debian-10 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:10-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/i686-linux-gnu-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/i686-linux-gnu-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture i386 && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:i386 \
+ libfuse-dev:i386 \
+ libgnutls28-dev:i386 \
+ libxml2-dev:i386 && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "i686-linux-gnu"
+ENV CONFIGURE_OPTS "--host=i686-linux-gnu"
diff --git a/ci/containers/debian-10-cross-mips.Dockerfile b/ci/containers/debian-10-cross-mips.Dockerfile
new file mode 100644
index 000000000000..2a575965fa5d
--- /dev/null
+++ b/ci/containers/debian-10-cross-mips.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross mips debian-10 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:10-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/mips-linux-gnu-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/mips-linux-gnu-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture mips && \
+ eatmydata apt-get update && \
+ 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-mips-linux-gnu \
+ libc6-dev:mips \
+ libfuse-dev:mips \
+ libgnutls28-dev:mips \
+ libxml2-dev:mips && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ mkdir -p /usr/local/share/meson/cross && \
+ echo "[binaries]\n\
+c = '/usr/bin/mips-linux-gnu-gcc'\n\
+ar = '/usr/bin/mips-linux-gnu-gcc-ar'\n\
+strip = '/usr/bin/mips-linux-gnu-strip'\n\
+pkgconfig = '/usr/bin/mips-linux-gnu-pkg-config'\n\
+\n\
+[host_machine]\n\
+system = 'linux'\n\
+cpu_family = 'mips'\n\
+cpu = 'mips'\n\
+endian = 'big'" > /usr/local/share/meson/cross/mips-linux-gnu
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "mips-linux-gnu"
+ENV CONFIGURE_OPTS "--host=mips-linux-gnu"
diff --git a/ci/containers/debian-10-cross-mips64el.Dockerfile b/ci/containers/debian-10-cross-mips64el.Dockerfile
new file mode 100644
index 000000000000..09c361f7a47c
--- /dev/null
+++ b/ci/containers/debian-10-cross-mips64el.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross mips64el debian-10 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:10-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/mips64el-linux-gnuabi64-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/mips64el-linux-gnuabi64-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture mips64el && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:mips64el \
+ libfuse-dev:mips64el \
+ libgnutls28-dev:mips64el \
+ libxml2-dev:mips64el && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "mips64el-linux-gnuabi64"
+ENV CONFIGURE_OPTS "--host=mips64el-linux-gnuabi64"
diff --git a/ci/containers/debian-10-cross-mipsel.Dockerfile b/ci/containers/debian-10-cross-mipsel.Dockerfile
new file mode 100644
index 000000000000..00825c8b6285
--- /dev/null
+++ b/ci/containers/debian-10-cross-mipsel.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross mipsel debian-10 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:10-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/mipsel-linux-gnu-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/mipsel-linux-gnu-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture mipsel && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:mipsel \
+ libfuse-dev:mipsel \
+ libgnutls28-dev:mipsel \
+ libxml2-dev:mipsel && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "mipsel-linux-gnu"
+ENV CONFIGURE_OPTS "--host=mipsel-linux-gnu"
diff --git a/ci/containers/debian-10-cross-ppc64le.Dockerfile b/ci/containers/debian-10-cross-ppc64le.Dockerfile
new file mode 100644
index 000000000000..4f4c835dd074
--- /dev/null
+++ b/ci/containers/debian-10-cross-ppc64le.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross ppc64le debian-10 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:10-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/powerpc64le-linux-gnu-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/powerpc64le-linux-gnu-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture ppc64el && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:ppc64el \
+ libfuse-dev:ppc64el \
+ libgnutls28-dev:ppc64el \
+ libxml2-dev:ppc64el && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "powerpc64le-linux-gnu"
+ENV CONFIGURE_OPTS "--host=powerpc64le-linux-gnu"
diff --git a/ci/containers/debian-10-cross-s390x.Dockerfile b/ci/containers/debian-10-cross-s390x.Dockerfile
new file mode 100644
index 000000000000..3753a67d8056
--- /dev/null
+++ b/ci/containers/debian-10-cross-s390x.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross s390x debian-10 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:10-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/s390x-linux-gnu-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/s390x-linux-gnu-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture s390x && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:s390x \
+ libfuse-dev:s390x \
+ libgnutls28-dev:s390x \
+ libxml2-dev:s390x && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "s390x-linux-gnu"
+ENV CONFIGURE_OPTS "--host=s390x-linux-gnu"
diff --git a/ci/containers/debian-10.Dockerfile b/ci/containers/debian-10.Dockerfile
new file mode 100644
index 000000000000..4444271bb7d6
--- /dev/null
+++ b/ci/containers/debian-10.Dockerfile
@@ -0,0 +1,50 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile debian-10 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:10-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libc6-dev \
+ libfuse-dev \
+ libgnutls28-dev \
+ libtool-bin \
+ libxml2-dev \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+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
new file mode 100644
index 000000000000..81aab437f18f
--- /dev/null
+++ b/ci/containers/debian-sid-cross-aarch64.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross aarch64 debian-sid libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:sid-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/aarch64-linux-gnu-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/aarch64-linux-gnu-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture arm64 && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:arm64 \
+ libfuse-dev:arm64 \
+ libgnutls28-dev:arm64 \
+ libxml2-dev:arm64 && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "aarch64-linux-gnu"
+ENV CONFIGURE_OPTS "--host=aarch64-linux-gnu"
diff --git a/ci/containers/debian-sid-cross-armv6l.Dockerfile b/ci/containers/debian-sid-cross-armv6l.Dockerfile
new file mode 100644
index 000000000000..b766138eb73d
--- /dev/null
+++ b/ci/containers/debian-sid-cross-armv6l.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross armv6l debian-sid libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:sid-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/arm-linux-gnueabi-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/arm-linux-gnueabi-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture armel && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:armel \
+ libfuse-dev:armel \
+ libgnutls28-dev:armel \
+ libxml2-dev:armel && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "arm-linux-gnueabi"
+ENV CONFIGURE_OPTS "--host=arm-linux-gnueabi"
diff --git a/ci/containers/debian-sid-cross-armv7l.Dockerfile b/ci/containers/debian-sid-cross-armv7l.Dockerfile
new file mode 100644
index 000000000000..7151aa4f6194
--- /dev/null
+++ b/ci/containers/debian-sid-cross-armv7l.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross armv7l debian-sid libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:sid-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/arm-linux-gnueabihf-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/arm-linux-gnueabihf-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture armhf && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:armhf \
+ libfuse-dev:armhf \
+ libgnutls28-dev:armhf \
+ libxml2-dev:armhf && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "arm-linux-gnueabihf"
+ENV CONFIGURE_OPTS "--host=arm-linux-gnueabihf"
diff --git a/ci/containers/debian-sid-cross-i686.Dockerfile b/ci/containers/debian-sid-cross-i686.Dockerfile
new file mode 100644
index 000000000000..c1ce5b67ff2a
--- /dev/null
+++ b/ci/containers/debian-sid-cross-i686.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross i686 debian-sid libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:sid-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/i686-linux-gnu-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/i686-linux-gnu-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture i386 && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:i386 \
+ libfuse-dev:i386 \
+ libgnutls28-dev:i386 \
+ libxml2-dev:i386 && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "i686-linux-gnu"
+ENV CONFIGURE_OPTS "--host=i686-linux-gnu"
diff --git a/ci/containers/debian-sid-cross-mips64el.Dockerfile b/ci/containers/debian-sid-cross-mips64el.Dockerfile
new file mode 100644
index 000000000000..9f994afa78c0
--- /dev/null
+++ b/ci/containers/debian-sid-cross-mips64el.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross mips64el debian-sid libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:sid-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/mips64el-linux-gnuabi64-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/mips64el-linux-gnuabi64-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture mips64el && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:mips64el \
+ libfuse-dev:mips64el \
+ libgnutls28-dev:mips64el \
+ libxml2-dev:mips64el && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "mips64el-linux-gnuabi64"
+ENV CONFIGURE_OPTS "--host=mips64el-linux-gnuabi64"
diff --git a/ci/containers/debian-sid-cross-mipsel.Dockerfile b/ci/containers/debian-sid-cross-mipsel.Dockerfile
new file mode 100644
index 000000000000..c3684ee11d40
--- /dev/null
+++ b/ci/containers/debian-sid-cross-mipsel.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross mipsel debian-sid libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:sid-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/mipsel-linux-gnu-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/mipsel-linux-gnu-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture mipsel && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:mipsel \
+ libfuse-dev:mipsel \
+ libgnutls28-dev:mipsel \
+ libxml2-dev:mipsel && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "mipsel-linux-gnu"
+ENV CONFIGURE_OPTS "--host=mipsel-linux-gnu"
diff --git a/ci/containers/debian-sid-cross-ppc64le.Dockerfile b/ci/containers/debian-sid-cross-ppc64le.Dockerfile
new file mode 100644
index 000000000000..216893c6e066
--- /dev/null
+++ b/ci/containers/debian-sid-cross-ppc64le.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross ppc64le debian-sid libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:sid-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/powerpc64le-linux-gnu-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/powerpc64le-linux-gnu-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture ppc64el && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:ppc64el \
+ libfuse-dev:ppc64el \
+ libgnutls28-dev:ppc64el \
+ libxml2-dev:ppc64el && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "powerpc64le-linux-gnu"
+ENV CONFIGURE_OPTS "--host=powerpc64le-linux-gnu"
diff --git a/ci/containers/debian-sid-cross-s390x.Dockerfile b/ci/containers/debian-sid-cross-s390x.Dockerfile
new file mode 100644
index 000000000000..cc1612a6ed45
--- /dev/null
+++ b/ci/containers/debian-sid-cross-s390x.Dockerfile
@@ -0,0 +1,75 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross s390x debian-sid libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:sid-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libtool-bin \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/s390x-linux-gnu-cc && \
+ ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/s390x-linux-gnu-$(basename /usr/bin/gcc)
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ dpkg --add-architecture s390x && \
+ eatmydata apt-get update && \
+ 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 \
+ libc6-dev:s390x \
+ libfuse-dev:s390x \
+ libgnutls28-dev:s390x \
+ libxml2-dev:s390x && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "s390x-linux-gnu"
+ENV CONFIGURE_OPTS "--host=s390x-linux-gnu"
diff --git a/ci/containers/debian-sid.Dockerfile b/ci/containers/debian-sid.Dockerfile
new file mode 100644
index 000000000000..dbb2847492d9
--- /dev/null
+++ b/ci/containers/debian-sid.Dockerfile
@@ -0,0 +1,50 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile debian-sid libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/debian:sid-slim
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libc6-dev \
+ libfuse-dev \
+ libgnutls28-dev \
+ libtool-bin \
+ libxml2-dev \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/fedora-32.Dockerfile b/ci/containers/fedora-32.Dockerfile
new file mode 100644
index 000000000000..f1769e784f8b
--- /dev/null
+++ b/ci/containers/fedora-32.Dockerfile
@@ -0,0 +1,55 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile fedora-32 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM registry.fedoraproject.org/fedora:32
+
+RUN dnf install -y nosync && \
+ echo -e '#!/bin/sh\n\
+if test -d /usr/lib64\n\
+then\n\
+ export LD_PRELOAD=/usr/lib64/nosync/nosync.so\n\
+else\n\
+ export LD_PRELOAD=/usr/lib/nosync/nosync.so\n\
+fi\n\
+exec "$@"' > /usr/bin/nosync && \
+ chmod +x /usr/bin/nosync && \
+ nosync dnf update -y && \
+ nosync dnf install -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ fuse-devel \
+ gcc \
+ git \
+ glibc-devel \
+ glibc-langpack-en \
+ gnutls-devel \
+ golang \
+ libtool \
+ libxml2-devel \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconfig \
+ python3-devel \
+ qemu-img \
+ sed && \
+ nosync dnf autoremove -y && \
+ nosync dnf clean all -y && \
+ 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/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/fedora-33.Dockerfile b/ci/containers/fedora-33.Dockerfile
new file mode 100644
index 000000000000..dbacd41ef99d
--- /dev/null
+++ b/ci/containers/fedora-33.Dockerfile
@@ -0,0 +1,55 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile fedora-33 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM registry.fedoraproject.org/fedora:33
+
+RUN dnf install -y nosync && \
+ echo -e '#!/bin/sh\n\
+if test -d /usr/lib64\n\
+then\n\
+ export LD_PRELOAD=/usr/lib64/nosync/nosync.so\n\
+else\n\
+ export LD_PRELOAD=/usr/lib/nosync/nosync.so\n\
+fi\n\
+exec "$@"' > /usr/bin/nosync && \
+ chmod +x /usr/bin/nosync && \
+ nosync dnf update -y && \
+ nosync dnf install -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ fuse-devel \
+ gcc \
+ git \
+ glibc-devel \
+ glibc-langpack-en \
+ gnutls-devel \
+ golang \
+ libtool \
+ libxml2-devel \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconfig \
+ python3-devel \
+ qemu-img \
+ sed && \
+ nosync dnf autoremove -y && \
+ nosync dnf clean all -y && \
+ 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/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+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
new file mode 100644
index 000000000000..c8f952825843
--- /dev/null
+++ b/ci/containers/fedora-rawhide-cross-mingw32.Dockerfile
@@ -0,0 +1,60 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross mingw32 fedora-rawhide libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM registry.fedoraproject.org/fedora:rawhide
+
+RUN dnf update -y --nogpgcheck fedora-gpg-keys && \
+ dnf install -y nosync && \
+ echo -e '#!/bin/sh\n\
+if test -d /usr/lib64\n\
+then\n\
+ export LD_PRELOAD=/usr/lib64/nosync/nosync.so\n\
+else\n\
+ export LD_PRELOAD=/usr/lib/nosync/nosync.so\n\
+fi\n\
+exec "$@"' > /usr/bin/nosync && \
+ chmod +x /usr/bin/nosync && \
+ nosync dnf update -y && \
+ nosync dnf install -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ coreutils \
+ diffutils \
+ git \
+ glibc-langpack-en \
+ golang \
+ libtool \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ python3-devel \
+ qemu-img \
+ sed && \
+ nosync dnf autoremove -y && \
+ nosync dnf clean all -y && \
+ 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-$(basename /usr/bin/gcc)
+
+RUN nosync dnf install -y \
+ mingw32-gcc \
+ mingw32-gnutls \
+ mingw32-headers \
+ mingw32-libxml2 \
+ mingw32-pkg-config && \
+ nosync dnf clean all -y
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "i686-w64-mingw32"
+ENV CONFIGURE_OPTS "--host=i686-w64-mingw32"
diff --git a/ci/containers/fedora-rawhide-cross-mingw64.Dockerfile b/ci/containers/fedora-rawhide-cross-mingw64.Dockerfile
new file mode 100644
index 000000000000..b31c72cb9a77
--- /dev/null
+++ b/ci/containers/fedora-rawhide-cross-mingw64.Dockerfile
@@ -0,0 +1,60 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile --cross mingw64 fedora-rawhide libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM registry.fedoraproject.org/fedora:rawhide
+
+RUN dnf update -y --nogpgcheck fedora-gpg-keys && \
+ dnf install -y nosync && \
+ echo -e '#!/bin/sh\n\
+if test -d /usr/lib64\n\
+then\n\
+ export LD_PRELOAD=/usr/lib64/nosync/nosync.so\n\
+else\n\
+ export LD_PRELOAD=/usr/lib/nosync/nosync.so\n\
+fi\n\
+exec "$@"' > /usr/bin/nosync && \
+ chmod +x /usr/bin/nosync && \
+ nosync dnf update -y && \
+ nosync dnf install -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ coreutils \
+ diffutils \
+ git \
+ glibc-langpack-en \
+ golang \
+ libtool \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ python3-devel \
+ qemu-img \
+ sed && \
+ nosync dnf autoremove -y && \
+ nosync dnf clean all -y && \
+ 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-$(basename /usr/bin/gcc)
+
+RUN nosync dnf install -y \
+ mingw64-gcc \
+ mingw64-gnutls \
+ mingw64-headers \
+ mingw64-libxml2 \
+ mingw64-pkg-config && \
+ nosync dnf clean all -y
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
+
+ENV ABI "x86_64-w64-mingw32"
+ENV CONFIGURE_OPTS "--host=x86_64-w64-mingw32"
diff --git a/ci/containers/fedora-rawhide.Dockerfile b/ci/containers/fedora-rawhide.Dockerfile
new file mode 100644
index 000000000000..8d1f255fc319
--- /dev/null
+++ b/ci/containers/fedora-rawhide.Dockerfile
@@ -0,0 +1,56 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile fedora-rawhide libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM registry.fedoraproject.org/fedora:rawhide
+
+RUN dnf update -y --nogpgcheck fedora-gpg-keys && \
+ dnf install -y nosync && \
+ echo -e '#!/bin/sh\n\
+if test -d /usr/lib64\n\
+then\n\
+ export LD_PRELOAD=/usr/lib64/nosync/nosync.so\n\
+else\n\
+ export LD_PRELOAD=/usr/lib/nosync/nosync.so\n\
+fi\n\
+exec "$@"' > /usr/bin/nosync && \
+ chmod +x /usr/bin/nosync && \
+ nosync dnf update -y && \
+ nosync dnf install -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ fuse-devel \
+ gcc \
+ git \
+ glibc-devel \
+ glibc-langpack-en \
+ gnutls-devel \
+ golang \
+ libtool \
+ libxml2-devel \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconfig \
+ python3-devel \
+ qemu-img \
+ sed && \
+ nosync dnf autoremove -y && \
+ nosync dnf clean all -y && \
+ 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/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/opensuse-152.Dockerfile b/ci/containers/opensuse-152.Dockerfile
new file mode 100644
index 000000000000..e051a5c92f11
--- /dev/null
+++ b/ci/containers/opensuse-152.Dockerfile
@@ -0,0 +1,44 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile opensuse-152 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM registry.opensuse.org/opensuse/leap:15.2
+
+RUN zypper update -y && \
+ zypper install -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ fuse-devel \
+ gcc \
+ git \
+ glibc-devel \
+ glibc-locale \
+ go \
+ libgnutls-devel \
+ libtool \
+ libxml2-devel \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconfig \
+ python3-devel \
+ qemu-tools \
+ sed && \
+ zypper clean --all && \
+ 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/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/refresh b/ci/containers/refresh
new file mode 100755
index 000000000000..327f642ed2ec
--- /dev/null
+++ b/ci/containers/refresh
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+if test -z "$1"
+then
+ echo "syntax: $0 PATH-TO-LCITOOL"
+ exit 1
+fi
+
+LCITOOL=$1
+
+if ! test -x "$LCITOOL"
+then
+ echo "$LCITOOL is not executable"
+ exit 1
+fi
+
+HOSTS=$($LCITOOL hosts | grep -Ev 'freebsd|macos')
+
+for host in $HOSTS
+do
+ case "$host" in
+ fedora-rawhide)
+ for cross in mingw32 mingw64
+ do
+ $LCITOOL dockerfile $host libnbd --cross $cross > $host-cross-$cross.Dockerfile
+ done
+ ;;
+ debian-*)
+ for cross in aarch64 armv6l armv7l i686 mips mips64el mipsel ppc64le s390x
+ do
+ if test "$host-cross-$cross" = "debian-9-cross-i686" ||
+ test "$host-cross-$cross" = "debian-sid-cross-mips"
+ then
+ continue
+ fi
+ $LCITOOL dockerfile $host libnbd --cross $cross > $host-cross-$cross.Dockerfile
+ done
+ ;;
+ esac
+
+ $LCITOOL dockerfile $host libnbd > $host.Dockerfile
+done
diff --git a/ci/containers/ubuntu-1804.Dockerfile b/ci/containers/ubuntu-1804.Dockerfile
new file mode 100644
index 000000000000..3df4fbe6b5df
--- /dev/null
+++ b/ci/containers/ubuntu-1804.Dockerfile
@@ -0,0 +1,50 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile ubuntu-1804 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/ubuntu:18.04
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libc6-dev \
+ libfuse-dev \
+ libgnutls28-dev \
+ libtool-bin \
+ libxml2-dev \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
diff --git a/ci/containers/ubuntu-2004.Dockerfile b/ci/containers/ubuntu-2004.Dockerfile
new file mode 100644
index 000000000000..6361b945c5b6
--- /dev/null
+++ b/ci/containers/ubuntu-2004.Dockerfile
@@ -0,0 +1,50 @@
+# THIS FILE WAS AUTO-GENERATED
+#
+# $ lcitool dockerfile ubuntu-2004 libnbd
+#
+# https://gitlab.com/libvirt/libvirt-ci/-/commit/ea3fb1a9a5976a2c70b85e4621...
+
+FROM docker.io/library/ubuntu:20.04
+
+RUN export DEBIAN_FRONTEND=noninteractive && \
+ apt-get update && \
+ apt-get install -y eatmydata && \
+ eatmydata apt-get dist-upgrade -y && \
+ eatmydata apt-get install --no-install-recommends -y \
+ autoconf \
+ automake \
+ bash-completion \
+ ca-certificates \
+ ccache \
+ clang \
+ coreutils \
+ diffutils \
+ gcc \
+ git \
+ golang \
+ libc6-dev \
+ libfuse-dev \
+ libgnutls28-dev \
+ libtool-bin \
+ libxml2-dev \
+ locales \
+ make \
+ ocaml \
+ ocaml-findlib \
+ perl \
+ pkgconf \
+ python3-dev \
+ qemu-utils \
+ sed && \
+ eatmydata apt-get autoremove -y && \
+ eatmydata apt-get autoclean -y && \
+ 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/$(basename /usr/bin/gcc)
+
+ENV LANG "en_US.UTF-8"
+ENV MAKE "/usr/bin/make"
+ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
--
2.31.1
3 years, 6 months
[libnbd PATCH] interop: Tolerate qemu-nbd 6.0 change in behavior
by Eric Blake
Qemu 6.0 commit 0da9856851 (nbd: server: Report holes for faw images)
intentionally changed how holes are reported, not only for raw images,
but for known-zero portions of qcow2 files. As the point of our
dirty-bitmap test is more about reading multiple contexts from a
single qemu-nbd process, it is okay to accept both behaviors for
base:allocation reporting on a block of zeros.
---
interop/dirty-bitmap.c | 40 +++++++++++++++++++++++++++++-----------
1 file changed, 29 insertions(+), 11 deletions(-)
diff --git a/interop/dirty-bitmap.c b/interop/dirty-bitmap.c
index 5f9fa12f..ed445712 100644
--- a/interop/dirty-bitmap.c
+++ b/interop/dirty-bitmap.c
@@ -1,5 +1,5 @@
/* NBD client library in userspace
- * Copyright (C) 2013-2019 Red Hat Inc.
+ * Copyright (C) 2013-2021 Red Hat Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -48,7 +48,10 @@ cb (void *opaque, const char *metacontext, uint64_t offset,
/* libnbd does not actually verify that a server is fully compliant
* to the spec; the asserts marked [qemu-nbd] are thus dependent on
- * the fact that qemu-nbd is compliant.
+ * the fact that qemu-nbd is compliant. Furthermore, qemu 5.2 and
+ * 6.0 disagree on whether base:allocation includes the hole bit for
+ * the zeroes at 512k (both answers are compliant); but we care more
+ * that the zeroes show up in the dirty bitmap
*/
assert (offset == 0);
assert (!*error || (data->fail && data->count == 1 && *error == EPROTO));
@@ -57,19 +60,34 @@ cb (void *opaque, const char *metacontext, uint64_t offset,
if (strcmp (metacontext, LIBNBD_CONTEXT_BASE_ALLOCATION) == 0) {
assert (!data->seen_base); /* [qemu-nbd] */
data->seen_base = true;
- assert (len == (data->req_one ? 2 : 8)); /* [qemu-nbd] */
+ if (data->req_one)
+ assert (len == 2); /* [qemu-nbd] */
+ else
+ assert ((len & 1) == 0 && len > 2); /* [qemu-nbd] */
/* Data block offset 0 size 128k */
assert (entries[0] == 131072); assert (entries[1] == 0);
if (!data->req_one) {
- /* hole|zero offset 128k size 384k */
- assert (entries[2] == 393216); assert (entries[3] == (LIBNBD_STATE_HOLE|
- LIBNBD_STATE_ZERO));
- /* allocated zero offset 512k size 64k */
- assert (entries[4] == 65536); assert (entries[5] == LIBNBD_STATE_ZERO);
- /* hole|zero offset 576k size 448k */
- assert (entries[6] == 458752); assert (entries[7] == (LIBNBD_STATE_HOLE|
- LIBNBD_STATE_ZERO));
+ if (len == 4) {
+ /* hole|zero offset 128k size 896k */
+ assert (entries[2] == 917504);
+ assert (entries[3] == (LIBNBD_STATE_HOLE|
+ LIBNBD_STATE_ZERO));
+ }
+ else {
+ assert (len == 8);
+ /* hole|zero offset 128k size 384k */
+ assert (entries[2] == 393216);
+ assert (entries[3] == (LIBNBD_STATE_HOLE|
+ LIBNBD_STATE_ZERO));
+ /* allocated zero offset 512k size 64k */
+ assert (entries[4] == 65536);
+ assert (entries[5] == LIBNBD_STATE_ZERO);
+ /* hole|zero offset 576k size 448k */
+ assert (entries[6] == 458752);
+ assert (entries[7] == (LIBNBD_STATE_HOLE|
+ LIBNBD_STATE_ZERO));
+ }
}
}
else if (strcmp (metacontext, bitmap) == 0) {
--
2.31.1
3 years, 6 months