[libvirt PATCH v2] port libvirt to Meson build system

Pavel Hrdina posted 1 patch 1 week ago
Failed in applying to current master (apply log)

[libvirt PATCH v2] port libvirt to Meson build system

Posted by Pavel Hrdina 1 week ago
The second time around I will not post the complete series as it doesn't
make that much sense. Instead I'll post a diff between the two series to
provide the changes between these series together with links to both
versions pushed to gitlab repository.

Patches for v2 are available from my gitlab repository:

    git clone -b meson https://gitlab.com/phrdina/libvirt.git

and link to gitlab pipeline:

    https://gitlab.com/phrdina/libvirt/-/pipelines/172042918

Patches for v1 are available from different branch 'meson-v1' in the
same repository. You can get the attached diff by running:

    git diff meson-v1 meson


During review we discovered some areas that should be improved once the
meson rewrite is merged into libvirt master:

- As of June 2020 we can drop library check for yal2 and use pkg-confg
  only check because openSUSE Leap 42.3 is no longer supported by
  libvirt and latest SLES 15 was released on 2018-07-16.


- It was suggested to drop README file which is just a link to
  README.rst and with meson no longer required as it was with autotools.


- There is a warning while building libvirt:

../tests/qemuxml2xmltest.c: In function ‘mymain’:
../tests/qemuxml2xmltest.c:132:1: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
  132 | mymain(void)
      | ^~~~~~


- Review discovered that with meson we no longer link with
  libnl-route-3. Meson links only with libraries that are actually
  required and we never used any symbol from this library so it can
  be dropped.


- During review it was pointed out that we can refactor how meson
  generates html files by removing meson-html-gen.py and moving the
  logic directly to meson.


- There was a question why we install augeas test files so we should
  figure out if we need to install them or it can be dropped.


Here is the list of main changes done in v2, I will not list all of them
as it can be easily checked in the diff:

- I've reordered and changed the patches to not break git bisect. Now
  patch 'meson: remove automake specific directives' doesn't remove
  BUILD_SOURCES because that would break running 'autogen.sh'.

  Patch 'meson: m4: drop not relevant m4 files' was renamed to
  'meson: drop remaining m4 helper files' and moved at the end of the
  series as it would again break running 'autogen.sh'.

  Patch 'meson: tests: remove '.libs' from all relevant paths' was moved
  in the middle of the series before adding 'src' directory into meson
  because it would break running 'make check'.

  To not break git bisect we agreed that meson will fail with error
  until the whole rewrite is done and we will have a temporary option
  'force_incomplete_build' that will skip the error and force to run
  meson setup.

  I've added a new patch 'meson: add driver_remote option only into meson_options.txt'
  to break circular dependency between driver_remote and libssh,
  libssh2, sasl and xdr options to make
  meson build -Dforce_incomplete_build work properly.


- We started running tests on FreeBSD which discovered an issue with
  meson build. Meson defines _FILE_OFFSET_BITS=64 all the time so I had
  to introduce a patch that handles this issue:
  'meson: tests: virmockstathelpers: replace check for _FILE_OFFSET_BITS'


- All scripts except for meson-python.sh wrapper which sets environment
  variables were converted from shell to python.


- Removed autoconf options debug_logs, default_editor and test_suite as
  we will not convert them to meson.


- Introduced git_werror meson option to copy the behavior of --werror
  option from autotools. It's not the same as with autotools but it is
  a close compromise.


- Fixed virt-aa-helper-test which had hard-coded path to compiled
  virt-aa-helper binary and that failed with meson.


- Correctly replace all SYSCONFDIR and RUNSTATEDIR in man pages files.


- Changed the way how we run syntax-check. Instead of having single
  target it is now part of meson test with suite label 'syntax-checl'.
  We will not define sytax-check tests if building from tarball, only
  if we are building from git. We use git to get list of files.


- Fixed all issues discovered during review with linking binaries,
  missing docs and cpu_map files, typos, etc.


- Meson cross compile configuration files were moved to libvirt-ci.

Pavel
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 623bbc82ac2..bceb1b82ba0 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,5 @@
 variables:
-  GIT_DEPTH: 1000
+  GIT_DEPTH: 100
 
 stages:
   - sanity_checks
@@ -453,7 +453,8 @@ codestyle:
     - *script_variables
   script:
     - meson build || (cat build/meson-logs/meson-log.txt && exit 1)
-    - ninja -C build syntax-check
+    - ninja -C build libvirt-pot-dep
+    - meson test -C build --suite syntax-check --no-rebuild || (cat build/meson-logs/testlog.txt && exit 1)
 
 
 # This artifact published by this job is downloaded to push to Weblate
@@ -492,3 +493,5 @@ check-dco:
   except:
     variables:
       - $CI_PROJECT_NAMESPACE == 'libvirt'
+  variables:
+    GIT_DEPTH: 1000
diff --git a/AUTHORS.in b/AUTHORS.in
index 443006640ff..f4ab42ea9f5 100644
--- a/AUTHORS.in
+++ b/AUTHORS.in
@@ -93,7 +93,7 @@ Stefan de Konink <dekonink@kinkrsoftware.nl>
 Takahashi Tomohiro <takatom@jp.fujitsu.com>
 Tatsuro Enokura <fj7716hz@aa.jp.fujitsu.com>
 
-#contributorslist#
+@contributorslist@
 
 The libvirt logo was designed by Diana Fong
 
diff --git a/build-aux/meson.build b/build-aux/meson.build
index de916793cad..1dd85b889b9 100644
--- a/build-aux/meson.build
+++ b/build-aux/meson.build
@@ -15,16 +15,34 @@ configure_file(
   configuration: syntax_check_conf,
 )
 
-make_prog = find_program('make')
+if host_machine.system() == 'freebsd'
+  make_prog = find_program('gmake')
+else
+  make_prog = find_program('make')
+endif
 
-# There is no way how to pass value to -j using run_target so let's use
-# it without any value to run all tests in parallel.
-run_target(
-  'syntax-check',
-  command: [
-    make_prog, '-C', meson.current_build_dir(), '-j', 'syntax-check',
-  ],
-  depends: [
-    potfiles_dep,
-  ],
+rc = run_command(
+  'sed', '-n',
+  's/^\\(sc_[a-zA-Z0-9_-]*\\):.*/\\1/p',
+  meson.current_source_dir() / 'syntax-check.mk',
+  check: true,
 )
+
+sc_tests = rc.stdout().strip().split()
+
+
+# Skip syntax-check if not building from git because we get the list of files
+# to check using git commands and it fails if we are not in git repository.
+if git
+  foreach target : sc_tests
+    test(
+      target,
+      make_prog,
+      args: [ '-C', meson.current_build_dir(), target ],
+      depends: [
+        potfiles_dep,
+      ],
+      suite: 'syntax-check',
+    )
+  endforeach
+endif
diff --git a/ci/aarch64-linux-gnu.meson b/ci/aarch64-linux-gnu.meson
deleted file mode 100644
index 1da8d6025c0..00000000000
--- a/ci/aarch64-linux-gnu.meson
+++ /dev/null
@@ -1,11 +0,0 @@
-[binaries]
-c = '/usr/bin/aarch64-linux-gnu-gcc'
-ar = '/usr/bin/aarch64-linux-gnu-gcc-ar'
-strip = '/usr/bin/aarch64-linux-gnu-strip'
-pkgconfig = '/usr/bin/aarch64-linux-gnu-pkg-config'
-
-[host_machine]
-system = 'linux'
-cpu_family = 'aarch64'
-cpu = 'aarch64'
-endian = 'little'
diff --git a/ci/arm-linux-gnueabi.meson b/ci/arm-linux-gnueabi.meson
deleted file mode 100644
index 9e5e06b84dc..00000000000
--- a/ci/arm-linux-gnueabi.meson
+++ /dev/null
@@ -1,11 +0,0 @@
-[binaries]
-c = '/usr/bin/arm-linux-gnueabi-gcc'
-ar = '/usr/bin/arm-linux-gnueabi-gcc-ar'
-strip = '/usr/bin/arm-linux-gnueabi-strip'
-pkgconfig = '/usr/bin/arm-linux-gnueabi-pkg-config'
-
-[host_machine]
-system = 'linux'
-cpu_family = 'arm'
-cpu = 'arm'
-endian = 'little'
diff --git a/ci/arm-linux-gnueabihf.meson b/ci/arm-linux-gnueabihf.meson
deleted file mode 100644
index c761707d495..00000000000
--- a/ci/arm-linux-gnueabihf.meson
+++ /dev/null
@@ -1,11 +0,0 @@
-[binaries]
-c = '/usr/bin/arm-linux-gnueabihf-gcc'
-ar = '/usr/bin/arm-linux-gnueabihf-gcc-ar'
-strip = '/usr/bin/arm-linux-gnueabihf-strip'
-pkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config'
-
-[host_machine]
-system = 'linux'
-cpu_family = 'arm'
-cpu = 'armhf'
-endian = 'little'
diff --git a/ci/cirrus/build.yml b/ci/cirrus/build.yml
index 6e9d2d72c48..912284b9062 100644
--- a/ci/cirrus/build.yml
+++ b/ci/cirrus/build.yml
@@ -15,7 +15,7 @@ build_task:
     - @INSTALL_COMMAND@ @PKGS@
     - @PIP@ install @PYPI_PKGS@
   clone_script:
-    - git clone --depth 1000 "$CI_REPOSITORY_URL" .
+    - git clone --depth 100 "$CI_REPOSITORY_URL" .
     - git fetch origin "$CI_COMMIT_REF_NAME"
     - git reset --hard "$CI_COMMIT_SHA"
   build_script:
diff --git a/ci/containers/libvirt-debian-10-cross-aarch64.Dockerfile b/ci/containers/libvirt-debian-10-cross-aarch64.Dockerfile
index d9437bbd4dd..5e1d8c66293 100644
--- a/ci/containers/libvirt-debian-10-cross-aarch64.Dockerfile
+++ b/ci/containers/libvirt-debian-10-cross-aarch64.Dockerfile
@@ -109,7 +109,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:arm64 \
             xfslibs-dev:arm64 && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/aarch64-linux-gnu-gcc'\nar = '/usr/bin/aarch64-linux-gnu-gcc-ar'\nstrip = '/usr/bin/aarch64-linux-gnu-strip'\npkgconfig = '/usr/bin/aarch64-linux-gnu-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'aarch64'\ncpu = 'aarch64'\nendian = 'little'" > /usr/local/share/meson/cross/aarch64-linux-gnu
 
 RUN pip3 install \
          meson==0.54.0
@@ -124,4 +126,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "aarch64-linux-gnu"
 ENV CONFIGURE_OPTS "--host=aarch64-linux-gnu"
-ENV MESON_OPTS "--cross-file=ci/aarch64-linux-gnu.meson"
+ENV MESON_OPTS "--cross-file=aarch64-linux-gnu"
diff --git a/ci/containers/libvirt-debian-10-cross-armv6l.Dockerfile b/ci/containers/libvirt-debian-10-cross-armv6l.Dockerfile
index 98c550ded57..1e2d518979f 100644
--- a/ci/containers/libvirt-debian-10-cross-armv6l.Dockerfile
+++ b/ci/containers/libvirt-debian-10-cross-armv6l.Dockerfile
@@ -108,7 +108,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:armel \
             xfslibs-dev:armel && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/arm-linux-gnueabi-gcc'\nar = '/usr/bin/arm-linux-gnueabi-gcc-ar'\nstrip = '/usr/bin/arm-linux-gnueabi-strip'\npkgconfig = '/usr/bin/arm-linux-gnueabi-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'arm'\ncpu = 'arm'\nendian = 'little'" > /usr/local/share/meson/cross/arm-linux-gnueabi
 
 RUN pip3 install \
          meson==0.54.0
@@ -123,4 +125,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "arm-linux-gnueabi"
 ENV CONFIGURE_OPTS "--host=arm-linux-gnueabi"
-ENV MESON_OPTS "--cross-file=ci/arm-linux-gnueabi.meson"
+ENV MESON_OPTS "--cross-file=arm-linux-gnueabi"
diff --git a/ci/containers/libvirt-debian-10-cross-armv7l.Dockerfile b/ci/containers/libvirt-debian-10-cross-armv7l.Dockerfile
index ff2c48d278c..b7d38aec25c 100644
--- a/ci/containers/libvirt-debian-10-cross-armv7l.Dockerfile
+++ b/ci/containers/libvirt-debian-10-cross-armv7l.Dockerfile
@@ -109,7 +109,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:armhf \
             xfslibs-dev:armhf && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/arm-linux-gnueabihf-gcc'\nar = '/usr/bin/arm-linux-gnueabihf-gcc-ar'\nstrip = '/usr/bin/arm-linux-gnueabihf-strip'\npkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'arm'\ncpu = 'armhf'\nendian = 'little'" > /usr/local/share/meson/cross/arm-linux-gnueabihf
 
 RUN pip3 install \
          meson==0.54.0
@@ -124,4 +126,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "arm-linux-gnueabihf"
 ENV CONFIGURE_OPTS "--host=arm-linux-gnueabihf"
-ENV MESON_OPTS "--cross-file=ci/arm-linux-gnueabihf.meson"
+ENV MESON_OPTS "--cross-file=arm-linux-gnueabihf"
diff --git a/ci/containers/libvirt-debian-10-cross-i686.Dockerfile b/ci/containers/libvirt-debian-10-cross-i686.Dockerfile
index 758c81176b8..7da851b1188 100644
--- a/ci/containers/libvirt-debian-10-cross-i686.Dockerfile
+++ b/ci/containers/libvirt-debian-10-cross-i686.Dockerfile
@@ -108,7 +108,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:i386 \
             xfslibs-dev:i386 && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/i686-linux-gnu-gcc'\nar = '/usr/bin/i686-linux-gnu-gcc-ar'\nstrip = '/usr/bin/i686-linux-gnu-strip'\npkgconfig = '/usr/bin/i686-linux-gnu-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'x86'\ncpu = 'i686'\nendian = 'little'" > /usr/local/share/meson/cross/i686-linux-gnu
 
 RUN pip3 install \
          meson==0.54.0
@@ -123,4 +125,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "i686-linux-gnu"
 ENV CONFIGURE_OPTS "--host=i686-linux-gnu"
-ENV MESON_OPTS "--cross-file=ci/i686-linux-gnu.meson"
+ENV MESON_OPTS "--cross-file=i686-linux-gnu"
diff --git a/ci/containers/libvirt-debian-10-cross-mips.Dockerfile b/ci/containers/libvirt-debian-10-cross-mips.Dockerfile
index 8cb3ca64da2..29af178dba8 100644
--- a/ci/containers/libvirt-debian-10-cross-mips.Dockerfile
+++ b/ci/containers/libvirt-debian-10-cross-mips.Dockerfile
@@ -108,7 +108,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:mips \
             xfslibs-dev:mips && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/mips-linux-gnu-gcc'\nar = '/usr/bin/mips-linux-gnu-gcc-ar'\nstrip = '/usr/bin/mips-linux-gnu-strip'\npkgconfig = '/usr/bin/mips-linux-gnu-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'mips'\ncpu = 'mips'\nendian = 'little'" > /usr/local/share/meson/cross/mips-linux-gnu
 
 RUN pip3 install \
          meson==0.54.0
@@ -123,4 +125,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "mips-linux-gnu"
 ENV CONFIGURE_OPTS "--host=mips-linux-gnu"
-ENV MESON_OPTS "--cross-file=ci/mips-linux-gnu.meson"
+ENV MESON_OPTS "--cross-file=mips-linux-gnu"
diff --git a/ci/containers/libvirt-debian-10-cross-mips64el.Dockerfile b/ci/containers/libvirt-debian-10-cross-mips64el.Dockerfile
index 9921f65116c..b291a48f062 100644
--- a/ci/containers/libvirt-debian-10-cross-mips64el.Dockerfile
+++ b/ci/containers/libvirt-debian-10-cross-mips64el.Dockerfile
@@ -108,7 +108,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:mips64el \
             xfslibs-dev:mips64el && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/mips64el-linux-gnuabi64-gcc'\nar = '/usr/bin/mips64el-linux-gnuabi64-gcc-ar'\nstrip = '/usr/bin/mips64el-linux-gnuabi64-strip'\npkgconfig = '/usr/bin/mips64el-linux-gnuabi64-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'mips64'\ncpu = 'mips64el'\nendian = 'little'" > /usr/local/share/meson/cross/mips64el-linux-gnuabi64
 
 RUN pip3 install \
          meson==0.54.0
@@ -123,4 +125,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "mips64el-linux-gnuabi64"
 ENV CONFIGURE_OPTS "--host=mips64el-linux-gnuabi64"
-ENV MESON_OPTS "--cross-file=ci/mips64el-linux-gnuabi64.meson"
+ENV MESON_OPTS "--cross-file=mips64el-linux-gnuabi64"
diff --git a/ci/containers/libvirt-debian-10-cross-mipsel.Dockerfile b/ci/containers/libvirt-debian-10-cross-mipsel.Dockerfile
index 3f9910f63e9..a63af12213d 100644
--- a/ci/containers/libvirt-debian-10-cross-mipsel.Dockerfile
+++ b/ci/containers/libvirt-debian-10-cross-mipsel.Dockerfile
@@ -108,7 +108,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:mipsel \
             xfslibs-dev:mipsel && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/mipsel-linux-gnu-gcc'\nar = '/usr/bin/mipsel-linux-gnu-gcc-ar'\nstrip = '/usr/bin/mipsel-linux-gnu-strip'\npkgconfig = '/usr/bin/mipsel-linux-gnu-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'mips'\ncpu = 'mipsel'\nendian = 'little'" > /usr/local/share/meson/cross/mipsel-linux-gnu
 
 RUN pip3 install \
          meson==0.54.0
@@ -123,4 +125,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "mipsel-linux-gnu"
 ENV CONFIGURE_OPTS "--host=mipsel-linux-gnu"
-ENV MESON_OPTS "--cross-file=ci/mipsel-linux-gnu.meson"
+ENV MESON_OPTS "--cross-file=mipsel-linux-gnu"
diff --git a/ci/containers/libvirt-debian-10-cross-ppc64le.Dockerfile b/ci/containers/libvirt-debian-10-cross-ppc64le.Dockerfile
index 3aef1e711e4..09477cdc0e5 100644
--- a/ci/containers/libvirt-debian-10-cross-ppc64le.Dockerfile
+++ b/ci/containers/libvirt-debian-10-cross-ppc64le.Dockerfile
@@ -108,7 +108,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:ppc64el \
             xfslibs-dev:ppc64el && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/powerpc64le-linux-gnu-gcc'\nar = '/usr/bin/powerpc64le-linux-gnu-gcc-ar'\nstrip = '/usr/bin/powerpc64le-linux-gnu-strip'\npkgconfig = '/usr/bin/powerpc64le-linux-gnu-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'ppc64'\ncpu = 'powerpc64le'\nendian = 'little'" > /usr/local/share/meson/cross/powerpc64le-linux-gnu
 
 RUN pip3 install \
          meson==0.54.0
@@ -123,4 +125,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "powerpc64le-linux-gnu"
 ENV CONFIGURE_OPTS "--host=powerpc64le-linux-gnu"
-ENV MESON_OPTS "--cross-file=ci/powerpc64le-linux-gnu.meson"
+ENV MESON_OPTS "--cross-file=powerpc64le-linux-gnu"
diff --git a/ci/containers/libvirt-debian-10-cross-s390x.Dockerfile b/ci/containers/libvirt-debian-10-cross-s390x.Dockerfile
index dc2e345767a..4a688374fae 100644
--- a/ci/containers/libvirt-debian-10-cross-s390x.Dockerfile
+++ b/ci/containers/libvirt-debian-10-cross-s390x.Dockerfile
@@ -108,7 +108,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:s390x \
             xfslibs-dev:s390x && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/s390x-linux-gnu-gcc'\nar = '/usr/bin/s390x-linux-gnu-gcc-ar'\nstrip = '/usr/bin/s390x-linux-gnu-strip'\npkgconfig = '/usr/bin/s390x-linux-gnu-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 's390x'\ncpu = 's390x'\nendian = 'little'" > /usr/local/share/meson/cross/s390x-linux-gnu
 
 RUN pip3 install \
          meson==0.54.0
@@ -123,4 +125,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "s390x-linux-gnu"
 ENV CONFIGURE_OPTS "--host=s390x-linux-gnu"
-ENV MESON_OPTS "--cross-file=ci/s390x-linux-gnu.meson"
+ENV MESON_OPTS "--cross-file=s390x-linux-gnu"
diff --git a/ci/containers/libvirt-debian-sid-cross-aarch64.Dockerfile b/ci/containers/libvirt-debian-sid-cross-aarch64.Dockerfile
index 77f1e6e44fb..90350750522 100644
--- a/ci/containers/libvirt-debian-sid-cross-aarch64.Dockerfile
+++ b/ci/containers/libvirt-debian-sid-cross-aarch64.Dockerfile
@@ -109,7 +109,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:arm64 \
             xfslibs-dev:arm64 && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/aarch64-linux-gnu-gcc'\nar = '/usr/bin/aarch64-linux-gnu-gcc-ar'\nstrip = '/usr/bin/aarch64-linux-gnu-strip'\npkgconfig = '/usr/bin/aarch64-linux-gnu-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'aarch64'\ncpu = 'aarch64'\nendian = 'little'" > /usr/local/share/meson/cross/aarch64-linux-gnu
 
 RUN pip3 install \
          meson==0.54.0
@@ -124,4 +126,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "aarch64-linux-gnu"
 ENV CONFIGURE_OPTS "--host=aarch64-linux-gnu"
-ENV MESON_OPTS "--cross-file=ci/aarch64-linux-gnu.meson"
+ENV MESON_OPTS "--cross-file=aarch64-linux-gnu"
diff --git a/ci/containers/libvirt-debian-sid-cross-armv6l.Dockerfile b/ci/containers/libvirt-debian-sid-cross-armv6l.Dockerfile
index ee09125fffd..7de3084662f 100644
--- a/ci/containers/libvirt-debian-sid-cross-armv6l.Dockerfile
+++ b/ci/containers/libvirt-debian-sid-cross-armv6l.Dockerfile
@@ -108,7 +108,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:armel \
             xfslibs-dev:armel && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/arm-linux-gnueabi-gcc'\nar = '/usr/bin/arm-linux-gnueabi-gcc-ar'\nstrip = '/usr/bin/arm-linux-gnueabi-strip'\npkgconfig = '/usr/bin/arm-linux-gnueabi-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'arm'\ncpu = 'arm'\nendian = 'little'" > /usr/local/share/meson/cross/arm-linux-gnueabi
 
 RUN pip3 install \
          meson==0.54.0
@@ -123,4 +125,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "arm-linux-gnueabi"
 ENV CONFIGURE_OPTS "--host=arm-linux-gnueabi"
-ENV MESON_OPTS "--cross-file=ci/arm-linux-gnueabi.meson"
+ENV MESON_OPTS "--cross-file=arm-linux-gnueabi"
diff --git a/ci/containers/libvirt-debian-sid-cross-armv7l.Dockerfile b/ci/containers/libvirt-debian-sid-cross-armv7l.Dockerfile
index fbcf73fe7f9..e868b07c51a 100644
--- a/ci/containers/libvirt-debian-sid-cross-armv7l.Dockerfile
+++ b/ci/containers/libvirt-debian-sid-cross-armv7l.Dockerfile
@@ -109,7 +109,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:armhf \
             xfslibs-dev:armhf && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/arm-linux-gnueabihf-gcc'\nar = '/usr/bin/arm-linux-gnueabihf-gcc-ar'\nstrip = '/usr/bin/arm-linux-gnueabihf-strip'\npkgconfig = '/usr/bin/arm-linux-gnueabihf-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'arm'\ncpu = 'armhf'\nendian = 'little'" > /usr/local/share/meson/cross/arm-linux-gnueabihf
 
 RUN pip3 install \
          meson==0.54.0
@@ -124,4 +126,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "arm-linux-gnueabihf"
 ENV CONFIGURE_OPTS "--host=arm-linux-gnueabihf"
-ENV MESON_OPTS "--cross-file=ci/arm-linux-gnueabihf.meson"
+ENV MESON_OPTS "--cross-file=arm-linux-gnueabihf"
diff --git a/ci/containers/libvirt-debian-sid-cross-i686.Dockerfile b/ci/containers/libvirt-debian-sid-cross-i686.Dockerfile
index 5d94848a3af..bdc37608085 100644
--- a/ci/containers/libvirt-debian-sid-cross-i686.Dockerfile
+++ b/ci/containers/libvirt-debian-sid-cross-i686.Dockerfile
@@ -108,7 +108,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:i386 \
             xfslibs-dev:i386 && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/i686-linux-gnu-gcc'\nar = '/usr/bin/i686-linux-gnu-gcc-ar'\nstrip = '/usr/bin/i686-linux-gnu-strip'\npkgconfig = '/usr/bin/i686-linux-gnu-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'x86'\ncpu = 'i686'\nendian = 'little'" > /usr/local/share/meson/cross/i686-linux-gnu
 
 RUN pip3 install \
          meson==0.54.0
@@ -123,4 +125,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "i686-linux-gnu"
 ENV CONFIGURE_OPTS "--host=i686-linux-gnu"
-ENV MESON_OPTS "--cross-file=ci/i686-linux-gnu.meson"
+ENV MESON_OPTS "--cross-file=i686-linux-gnu"
diff --git a/ci/containers/libvirt-debian-sid-cross-mips64el.Dockerfile b/ci/containers/libvirt-debian-sid-cross-mips64el.Dockerfile
index b42c599cb46..0ed85cd5755 100644
--- a/ci/containers/libvirt-debian-sid-cross-mips64el.Dockerfile
+++ b/ci/containers/libvirt-debian-sid-cross-mips64el.Dockerfile
@@ -108,7 +108,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:mips64el \
             xfslibs-dev:mips64el && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/mips64el-linux-gnuabi64-gcc'\nar = '/usr/bin/mips64el-linux-gnuabi64-gcc-ar'\nstrip = '/usr/bin/mips64el-linux-gnuabi64-strip'\npkgconfig = '/usr/bin/mips64el-linux-gnuabi64-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'mips64'\ncpu = 'mips64el'\nendian = 'little'" > /usr/local/share/meson/cross/mips64el-linux-gnuabi64
 
 RUN pip3 install \
          meson==0.54.0
@@ -123,4 +125,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "mips64el-linux-gnuabi64"
 ENV CONFIGURE_OPTS "--host=mips64el-linux-gnuabi64"
-ENV MESON_OPTS "--cross-file=ci/mips64el-linux-gnuabi64.meson"
+ENV MESON_OPTS "--cross-file=mips64el-linux-gnuabi64"
diff --git a/ci/containers/libvirt-debian-sid-cross-mipsel.Dockerfile b/ci/containers/libvirt-debian-sid-cross-mipsel.Dockerfile
index b076c7d2cd2..580d3170e73 100644
--- a/ci/containers/libvirt-debian-sid-cross-mipsel.Dockerfile
+++ b/ci/containers/libvirt-debian-sid-cross-mipsel.Dockerfile
@@ -108,7 +108,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:mipsel \
             xfslibs-dev:mipsel && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/mipsel-linux-gnu-gcc'\nar = '/usr/bin/mipsel-linux-gnu-gcc-ar'\nstrip = '/usr/bin/mipsel-linux-gnu-strip'\npkgconfig = '/usr/bin/mipsel-linux-gnu-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'mips'\ncpu = 'mipsel'\nendian = 'little'" > /usr/local/share/meson/cross/mipsel-linux-gnu
 
 RUN pip3 install \
          meson==0.54.0
@@ -123,4 +125,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "mipsel-linux-gnu"
 ENV CONFIGURE_OPTS "--host=mipsel-linux-gnu"
-ENV MESON_OPTS "--cross-file=ci/mipsel-linux-gnu.meson"
+ENV MESON_OPTS "--cross-file=mipsel-linux-gnu"
diff --git a/ci/containers/libvirt-debian-sid-cross-ppc64le.Dockerfile b/ci/containers/libvirt-debian-sid-cross-ppc64le.Dockerfile
index aece53541b7..d1d401c8eb4 100644
--- a/ci/containers/libvirt-debian-sid-cross-ppc64le.Dockerfile
+++ b/ci/containers/libvirt-debian-sid-cross-ppc64le.Dockerfile
@@ -108,7 +108,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:ppc64el \
             xfslibs-dev:ppc64el && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/powerpc64le-linux-gnu-gcc'\nar = '/usr/bin/powerpc64le-linux-gnu-gcc-ar'\nstrip = '/usr/bin/powerpc64le-linux-gnu-strip'\npkgconfig = '/usr/bin/powerpc64le-linux-gnu-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 'ppc64'\ncpu = 'powerpc64le'\nendian = 'little'" > /usr/local/share/meson/cross/powerpc64le-linux-gnu
 
 RUN pip3 install \
          meson==0.54.0
@@ -123,4 +125,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "powerpc64le-linux-gnu"
 ENV CONFIGURE_OPTS "--host=powerpc64le-linux-gnu"
-ENV MESON_OPTS "--cross-file=ci/powerpc64le-linux-gnu.meson"
+ENV MESON_OPTS "--cross-file=powerpc64le-linux-gnu"
diff --git a/ci/containers/libvirt-debian-sid-cross-s390x.Dockerfile b/ci/containers/libvirt-debian-sid-cross-s390x.Dockerfile
index 9cf7081aaa0..6bd7eb6a4c3 100644
--- a/ci/containers/libvirt-debian-sid-cross-s390x.Dockerfile
+++ b/ci/containers/libvirt-debian-sid-cross-s390x.Dockerfile
@@ -108,7 +108,9 @@ RUN export DEBIAN_FRONTEND=noninteractive && \
             libyajl-dev:s390x \
             xfslibs-dev:s390x && \
     apt-get autoremove -y && \
-    apt-get autoclean -y
+    apt-get autoclean -y && \
+    mkdir -p /usr/local/share/meson/cross && \
+    echo "[binaries]\nc = '/usr/bin/s390x-linux-gnu-gcc'\nar = '/usr/bin/s390x-linux-gnu-gcc-ar'\nstrip = '/usr/bin/s390x-linux-gnu-strip'\npkgconfig = '/usr/bin/s390x-linux-gnu-pkg-config'\n\n[host_machine]\nsystem = 'linux'\ncpu_family = 's390x'\ncpu = 's390x'\nendian = 'little'" > /usr/local/share/meson/cross/s390x-linux-gnu
 
 RUN pip3 install \
          meson==0.54.0
@@ -123,4 +125,4 @@ ENV CCACHE_WRAPPERSDIR "/usr/libexec/ccache-wrappers"
 
 ENV ABI "s390x-linux-gnu"
 ENV CONFIGURE_OPTS "--host=s390x-linux-gnu"
-ENV MESON_OPTS "--cross-file=ci/s390x-linux-gnu.meson"
+ENV MESON_OPTS "--cross-file=s390x-linux-gnu"
diff --git a/ci/i686-linux-gnu.meson b/ci/i686-linux-gnu.meson
deleted file mode 100644
index 638113e1d21..00000000000
--- a/ci/i686-linux-gnu.meson
+++ /dev/null
@@ -1,11 +0,0 @@
-[binaries]
-c = '/usr/bin/i686-linux-gnu-gcc'
-ar = '/usr/bin/i686-linux-gnu-gcc-ar'
-strip = '/usr/bin/i686-linux-gnu-strip'
-pkgconfig = '/usr/bin/i686-linux-gnu-pkg-config'
-
-[host_machine]
-system = 'linux'
-cpu_family = 'x86'
-cpu = 'i686'
-endian = 'little'
diff --git a/ci/mips-linux-gnu.meson b/ci/mips-linux-gnu.meson
deleted file mode 100644
index 2c4c21c1e02..00000000000
--- a/ci/mips-linux-gnu.meson
+++ /dev/null
@@ -1,11 +0,0 @@
-[binaries]
-c = '/usr/bin/mips-linux-gnu-gcc'
-ar = '/usr/bin/mips-linux-gnu-gcc-ar'
-strip = '/usr/bin/mips-linux-gnu-strip'
-pkgconfig = '/usr/bin/mips-linux-gnu-pkg-config'
-
-[host_machine]
-system = 'linux'
-cpu_family = 'mips'
-cpu = 'mips'
-endian = 'little'
diff --git a/ci/mips64el-linux-gnuabi64.meson b/ci/mips64el-linux-gnuabi64.meson
deleted file mode 100644
index 459c8154d7b..00000000000
--- a/ci/mips64el-linux-gnuabi64.meson
+++ /dev/null
@@ -1,11 +0,0 @@
-[binaries]
-c = '/usr/bin/mips64el-linux-gnuabi64-gcc'
-ar = '/usr/bin/mips64el-linux-gnuabi64-gcc-ar'
-strip = '/usr/bin/mips64el-linux-gnuabi64-strip'
-pkgconfig = '/usr/bin/mips64el-linux-gnuabi64-pkg-config'
-
-[host_machine]
-system = 'linux'
-cpu_family = 'mips64'
-cpu = 'mips64el'
-endian = 'little'
diff --git a/ci/mipsel-linux-gnu.meson b/ci/mipsel-linux-gnu.meson
deleted file mode 100644
index 308bda511ee..00000000000
--- a/ci/mipsel-linux-gnu.meson
+++ /dev/null
@@ -1,11 +0,0 @@
-[binaries]
-c = '/usr/bin/mipsel-linux-gnu-gcc'
-ar = '/usr/bin/mipsel-linux-gnu-gcc-ar'
-strip = '/usr/bin/mipsel-linux-gnu-strip'
-pkgconfig = '/usr/bin/mipsel-linux-gnu-pkg-config'
-
-[host_machine]
-system = 'linux'
-cpu_family = 'mips'
-cpu = 'mipsel'
-endian = 'little'
diff --git a/ci/powerpc64le-linux-gnu.meson b/ci/powerpc64le-linux-gnu.meson
deleted file mode 100644
index 9a151e2c12f..00000000000
--- a/ci/powerpc64le-linux-gnu.meson
+++ /dev/null
@@ -1,11 +0,0 @@
-[binaries]
-c = '/usr/bin/powerpc64le-linux-gnu-gcc'
-ar = '/usr/bin/powerpc64le-linux-gnu-gcc-ar'
-strip = '/usr/bin/powerpc64le-linux-gnu-strip'
-pkgconfig = '/usr/bin/powerpc64le-linux-gnu-pkg-config'
-
-[host_machine]
-system = 'linux'
-cpu_family = 'ppc64'
-cpu = 'powerpc64le'
-endian = 'little'
diff --git a/ci/s390x-linux-gnu.meson b/ci/s390x-linux-gnu.meson
deleted file mode 100644
index 28a292c7203..00000000000
--- a/ci/s390x-linux-gnu.meson
+++ /dev/null
@@ -1,11 +0,0 @@
-[binaries]
-c = '/usr/bin/s390x-linux-gnu-gcc'
-ar = '/usr/bin/s390x-linux-gnu-gcc-ar'
-strip = '/usr/bin/s390x-linux-gnu-strip'
-pkgconfig = '/usr/bin/s390x-linux-gnu-pkg-config'
-
-[host_machine]
-system = 'linux'
-cpu_family = 's390x'
-cpu = 's390x'
-endian = 'little'
diff --git a/docs/advanced-tests.rst b/docs/advanced-tests.rst
index c8c02eabe06..bc20bbf4d9e 100644
--- a/docs/advanced-tests.rst
+++ b/docs/advanced-tests.rst
@@ -7,7 +7,6 @@ The basic requirement before submitting changes to libvirt is that
 ::
 
   $ ninja test
-  $ ninja syntax-check
 
 succeed after each commit.
 
diff --git a/docs/best-practices.rst b/docs/best-practices.rst
index b2572c81100..8283f627cea 100644
--- a/docs/best-practices.rst
+++ b/docs/best-practices.rst
@@ -25,9 +25,8 @@ with minimal back-and-forth.
    self-contained if possible, with an explanation of each patch
    and an explanation of how the sequence of patches fits
    together. Moreover, please keep in mind that it's required to
-   be able to compile cleanly (**including**
-   ``ninja test`` and ``ninja syntax-check``) after each
-   patch. A feature does not have to work until the end of a
+   be able to compile cleanly (**including** ``ninja test``) after
+   each patch. A feature does not have to work until the end of a
    series, but intermediate patches must compile and not cause
    test-suite failures (this is to preserve the usefulness of
    ``git bisect``, among other things).
diff --git a/docs/committer-guidelines.rst b/docs/committer-guidelines.rst
index 1f879ddf934..d2c530d8952 100644
--- a/docs/committer-guidelines.rst
+++ b/docs/committer-guidelines.rst
@@ -12,8 +12,8 @@ objection on the list it should be good to go. If the patch
 touches a part of the code where you're not the main maintainer,
 or where you do not have a very clear idea of how things work,
 it's better to wait for a more authoritative feedback though.
-Before committing, please also rebuild locally, run 'ninja test
-syntax-check', and make sure you don't raise errors.
+Before committing, please also rebuild locally, run 'ninja test',
+and make sure you don't raise errors.
 
 An exception to 'review and approval on the list first' is fixing
 failures to build:
@@ -21,11 +21,10 @@ failures to build:
 -  if a recently committed patch breaks compilation on a platform
    or for a given driver, then it's fine to commit a minimal fix
    directly without getting the review feedback first
--  if ninja test or ninja syntax-check breaks, if there is an
-   obvious fix, it's fine to commit immediately. The patch should
-   still be sent to the list (or tell what the fix was if
-   trivial), and 'ninja test syntax-check' should pass too, before
-   committing anything
+-  if ninja test breaks, if there is an obvious fix, it's fine to
+   commit immediately. The patch should still be sent to the list
+   (or tell what the fix was if trivial), and 'ninja test' should
+   pass too, before committing anything
 -  fixes for documentation and code comments can be managed in the
    same way, but still make sure they get reviewed if non-trivial.
 -  (ir)regular pulls from other repositories or automated updates,
diff --git a/docs/hacking.rst b/docs/hacking.rst
index 4a9a1e19565..3fc5888a712 100644
--- a/docs/hacking.rst
+++ b/docs/hacking.rst
@@ -31,7 +31,6 @@ changes. That is:
 ::
 
   $ ninja test
-  $ ninja syntax-check
 
 These tests help making sure that your changes don't introduce
 regressions in libvirt, as well as validating that any new code
diff --git a/docs/internals/meson.build b/docs/internals/meson.build
index e600c84af60..18fd6620d49 100644
--- a/docs/internals/meson.build
+++ b/docs/internals/meson.build
@@ -15,7 +15,8 @@ foreach name : internals_in_files
     output: html_file,
     command: [
       meson_python_prog,
-      meson_html_gen_prog,
+      python3_prog.path(),
+      meson_html_gen_prog.path(),
       xsltproc_prog.path(),
       xmllint_prog.path(),
       meson.build_root(),
diff --git a/docs/kbase/meson.build b/docs/kbase/meson.build
index d46289245b2..a964e999f7d 100644
--- a/docs/kbase/meson.build
+++ b/docs/kbase/meson.build
@@ -1,6 +1,8 @@
 docs_kbase_files = [
   'backing_chains',
   'domainstatecapture',
+  'incrementalbackupinternals',
+  'kvm-realtime',
   'launch_security_sev',
   'locking-lockd',
   'locking',
@@ -8,6 +10,7 @@ docs_kbase_files = [
   'migrationinternals',
   'qemu-passthrough-security',
   'rpm-deployment',
+  's390_protected_virt',
   'secureusage',
   'virtiofs',
 ]
@@ -24,7 +27,8 @@ foreach name : docs_kbase_files
     output: html_file,
     command: [
       meson_python_prog,
-      meson_html_gen_prog,
+      python3_prog.path(),
+      meson_html_gen_prog.path(),
       xsltproc_prog.path(),
       xmllint_prog.path(),
       meson.build_root(),
diff --git a/docs/logging.html.in b/docs/logging.html.in
index b4e7d0c3864..3ff0dd3eb67 100644
--- a/docs/logging.html.in
+++ b/docs/logging.html.in
@@ -209,7 +209,7 @@ $ journalctl MESSAGE_ID=8ae2f3fb-2dbe-498e-8fbd-012d40afa361 --output=json
   "LIBVIRT_QEMU_BINARY" : "/bin/qemu-system-xtensa",
   "MESSAGE" : "Failed to probe capabilities for /bin/qemu-system-xtensa:" \
               "internal error: Child process (LC_ALL=C LD_LIBRARY_PATH=/home/berrange" \
-              "/src/virt/libvirt/src PATH=/usr/lib64/ccache:/usr/local/sbin:" \
+              "/src/virt/libvirt/src/.libs PATH=/usr/lib64/ccache:/usr/local/sbin:" \
               "/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin HOME=/root " \
               "USER=root LOGNAME=root /bin/qemu-system-xtensa -help) unexpected " \
               "exit status 127: /bin/qemu-system-xtensa: error while loading shared " \
diff --git a/docs/manpages/index.rst.in b/docs/manpages/index.rst
similarity index 100%
rename from docs/manpages/index.rst.in
rename to docs/manpages/index.rst
diff --git a/docs/manpages/libvirtd.rst.in b/docs/manpages/libvirtd.rst
similarity index 93%
rename from docs/manpages/libvirtd.rst.in
rename to docs/manpages/libvirtd.rst
index 4125604f9ad..c88e2dd7e17 100644
--- a/docs/manpages/libvirtd.rst.in
+++ b/docs/manpages/libvirtd.rst
@@ -131,29 +131,29 @@ FILES
 When run as *root*
 ------------------
 
-* ``SYSCONFDIR/libvirt/libvirtd.conf``
+* ``@SYSCONFDIR@/libvirt/libvirtd.conf``
 
 The default configuration file used by libvirtd, unless overridden on the
 command line using the ``-f`` | ``--config`` option.
 
-* ``RUNSTATEDIR/libvirt/libvirt-sock``
-* ``RUNSTATEDIR/libvirt/libvirt-sock-ro``
+* ``@RUNSTATEDIR@/libvirt/libvirt-sock``
+* ``@RUNSTATEDIR@/libvirt/libvirt-sock-ro``
 
 The sockets libvirtd will use.
 
-* ``SYSCONFDIR/pki/CA/cacert.pem``
+* ``@SYSCONFDIR@/pki/CA/cacert.pem``
 
 The TLS **Certificate Authority** certificate libvirtd will use.
 
-* ``SYSCONFDIR/pki/libvirt/servercert.pem``
+* ``@SYSCONFDIR@/pki/libvirt/servercert.pem``
 
 The TLS **Server** certificate libvirtd will use.
 
-* ``SYSCONFDIR/pki/libvirt/private/serverkey.pem``
+* ``@SYSCONFDIR@/pki/libvirt/private/serverkey.pem``
 
 The TLS **Server** private key libvirtd will use.
 
-* ``RUNSTATEDIR/libvirtd.pid``
+* ``@RUNSTATEDIR@/libvirtd.pid``
 
 The PID file to use, unless overridden by the ``-p`` | ``--pid-file`` option.
 
@@ -210,8 +210,8 @@ To start libvirtd, instructing it to daemonize and create a PID file:
 .. code-block::
 
   # libvirtd -d
-  # ls -la RUNSTATEDIR/libvirtd.pid
-  -rw-r--r-- 1 root root 6 Jul  9 02:40 RUNSTATEDIR/libvirtd.pid
+  # ls -la @RUNSTATEDIR@/libvirtd.pid
+  -rw-r--r-- 1 root root 6 Jul  9 02:40 @RUNSTATEDIR@/libvirtd.pid
 
 
 BUGS
diff --git a/docs/manpages/meson.build b/docs/manpages/meson.build
index c53109c8d29..d07af810e6e 100644
--- a/docs/manpages/meson.build
+++ b/docs/manpages/meson.build
@@ -28,7 +28,7 @@ foreach name : keycode_list
     input: keymap_src_file,
     output: 'virkeycode-@0@.rst'.format(name),
     command: [
-      meson_python_prog, python3_prog, keymap_gen_prog, 'code-docs',
+      meson_python_prog, python3_prog.path(), keymap_gen_prog.path(), 'code-docs',
       '--lang', 'rst',
       '--title', 'virkeycode-@0@'.format(name),
       '--subtitle', 'Key code values for @0@'.format(name),
@@ -49,7 +49,7 @@ foreach name : keyname_list
     input: keymap_src_file,
     output: 'virkeyname-@0@.rst'.format(name),
     command: [
-      meson_python_prog, python3_prog, keymap_gen_prog, 'name-docs',
+      meson_python_prog, python3_prog.path(), keymap_gen_prog.path(), 'name-docs',
       '--lang', 'rst',
       '--title', 'virkeyname-@0@'.format(name),
       '--subtitle', 'Key name values for @0@'.format(name),
@@ -69,7 +69,7 @@ docs_man_conf.set('SYSCONFDIR', sysconfdir)
 docs_man_conf.set('RUNSTATEDIR', runstatedir)
 
 foreach data : docs_man_files
-  rst_in_file = '@0@.rst.in'.format(data['name'])
+  rst_in_file = '@0@.rst'.format(data['name'])
   html_in_file = '@0@.html.in'.format(data['name'])
   html_file = '@0@.html'.format(data['name'])
 
@@ -109,7 +109,8 @@ foreach data : docs_man_files
     output: html_file,
     command: [
       meson_python_prog,
-      meson_html_gen_prog,
+      python3_prog.path(),
+      meson_html_gen_prog.path(),
       xsltproc_prog.path(),
       xmllint_prog.path(),
       meson.build_root(),
diff --git a/docs/manpages/virsh.rst.in b/docs/manpages/virsh.rst
similarity index 100%
rename from docs/manpages/virsh.rst.in
rename to docs/manpages/virsh.rst
diff --git a/docs/manpages/virt-admin.rst.in b/docs/manpages/virt-admin.rst
similarity index 100%
rename from docs/manpages/virt-admin.rst.in
rename to docs/manpages/virt-admin.rst
diff --git a/docs/manpages/virt-host-validate.rst.in b/docs/manpages/virt-host-validate.rst
similarity index 100%
rename from docs/manpages/virt-host-validate.rst.in
rename to docs/manpages/virt-host-validate.rst
diff --git a/docs/manpages/virt-login-shell.rst.in b/docs/manpages/virt-login-shell.rst
similarity index 100%
rename from docs/manpages/virt-login-shell.rst.in
rename to docs/manpages/virt-login-shell.rst
diff --git a/docs/manpages/virt-pki-validate.rst.in b/docs/manpages/virt-pki-validate.rst
similarity index 100%
rename from docs/manpages/virt-pki-validate.rst.in
rename to docs/manpages/virt-pki-validate.rst
diff --git a/docs/manpages/virt-qemu-run.rst.in b/docs/manpages/virt-qemu-run.rst
similarity index 100%
rename from docs/manpages/virt-qemu-run.rst.in
rename to docs/manpages/virt-qemu-run.rst
diff --git a/docs/manpages/virt-sanlock-cleanup.rst.in b/docs/manpages/virt-sanlock-cleanup.rst
similarity index 100%
rename from docs/manpages/virt-sanlock-cleanup.rst.in
rename to docs/manpages/virt-sanlock-cleanup.rst
diff --git a/docs/manpages/virt-xml-validate.rst.in b/docs/manpages/virt-xml-validate.rst
similarity index 100%
rename from docs/manpages/virt-xml-validate.rst.in
rename to docs/manpages/virt-xml-validate.rst
diff --git a/docs/manpages/virtlockd.rst.in b/docs/manpages/virtlockd.rst
similarity index 94%
rename from docs/manpages/virtlockd.rst.in
rename to docs/manpages/virtlockd.rst
index 1dc106d6fca..ea37b25d05d 100644
--- a/docs/manpages/virtlockd.rst.in
+++ b/docs/manpages/virtlockd.rst
@@ -79,16 +79,16 @@ FILES
 When run as *root*
 ------------------
 
-* ``SYSCONFDIR/libvirt/virtlockd.conf``
+* ``@SYSCONFDIR@/libvirt/virtlockd.conf``
 
 The default configuration file used by ``virtlockd``, unless overridden on the
 command line using the ``-f`` | ``--config`` option.
 
-* ``RUNSTATEDIR/libvirt/virtlockd-sock``
+* ``@RUNSTATEDIR@/libvirt/virtlockd-sock``
 
 The sockets ``virtlockd`` will use.
 
-* ``RUNSTATEDIR/virtlockd.pid``
+* ``@RUNSTATEDIR@/virtlockd.pid``
 
 The PID file to use, unless overridden by the ``-p`` | ``--pid-file`` option.
 
@@ -130,8 +130,8 @@ To start ``virtlockd``, instructing it to daemonize and create a PID file:
 .. code-block::
 
   # virtlockd -d
-  # ls -la RUNSTATEDIR/virtlockd.pid
-  -rw-r--r-- 1 root root 6 Jul  9 02:40 RUNSTATEDIR/virtlockd.pid
+  # ls -la @RUNSTATEDIR@/virtlockd.pid
+  -rw-r--r-- 1 root root 6 Jul  9 02:40 @RUNSTATEDIR@/virtlockd.pid
 
 BUGS
 ====
diff --git a/docs/manpages/virtlogd.rst.in b/docs/manpages/virtlogd.rst
similarity index 94%
rename from docs/manpages/virtlogd.rst.in
rename to docs/manpages/virtlogd.rst
index c84ab2e6219..edf8288230e 100644
--- a/docs/manpages/virtlogd.rst.in
+++ b/docs/manpages/virtlogd.rst
@@ -80,16 +80,16 @@ FILES
 When run as *root*
 ------------------
 
-* ``SYSCONFDIR/libvirt/virtlogd.conf``
+* ``@SYSCONFDIR@/libvirt/virtlogd.conf``
 
 The default configuration file used by ``virtlogd``, unless overridden on the
 command line using the ``-f``  | ``--config`` option.
 
-* ``RUNSTATEDIR/libvirt/virtlogd-sock``
+* ``@RUNSTATEDIR@/libvirt/virtlogd-sock``
 
 The sockets ``virtlogd`` will use.
 
-* ``RUNSTATEDIR/virtlogd.pid``
+* ``@RUNSTATEDIR@/virtlogd.pid``
 
 The PID file to use, unless overridden by the ``-p`` | ``--pid-file`` option.
 
@@ -131,8 +131,8 @@ To start ``virtlogd``, instructing it to daemonize and create a PID file:
 .. code-block::
 
   # virtlogd -d
-  # ls -la RUNSTATEDIR/virtlogd.pid
-  -rw-r--r-- 1 root root 6 Jul  9 02:40 RUNSTATEDIR/virtlogd.pid
+  # ls -la @RUNSTATEDIR@/virtlogd.pid
+  -rw-r--r-- 1 root root 6 Jul  9 02:40 @RUNSTATEDIR@/virtlogd.pid
 
 
 BUGS
diff --git a/docs/meson.build b/docs/meson.build
index 773e127ca74..1d24f2a9e2c 100644
--- a/docs/meson.build
+++ b/docs/meson.build
@@ -140,12 +140,14 @@ aclperms_gen = custom_target(
   input: access_perm_h,
   output: 'aclperms.htmlinc',
   command: [
-    meson_python_prog, genaclperms_prog, '@INPUT@',
+    meson_python_prog, python3_prog.path(), genaclperms_prog.path(), '@INPUT@',
   ],
   capture: true,
 )
 
-docs_timestamp = run_command(meson_timestamp_prog).stdout()
+docs_timestamp = run_command(
+  python3_prog, meson_timestamp_prog.path(), env: runutf8
+).stdout().strip()
 
 site_xsl = files('site.xsl')
 subsite_xsl = files('subsite.xsl')
@@ -161,8 +163,7 @@ docs_api_generated = custom_target(
     'libvirt-admin-api.xml',
   ],
   command: [
-    meson_python_prog,
-    apibuild_prog,
+    meson_python_prog, python3_prog.path(), apibuild_prog.path(),
     meson.current_source_dir(),
     meson.current_build_dir(),
   ],
@@ -201,7 +202,8 @@ foreach name : docs_html_in_files
     output: html_file,
     command: [
       meson_python_prog,
-      meson_html_gen_prog,
+      python3_prog.path(),
+      meson_html_gen_prog.path(),
       xsltproc_prog.path(),
       xmllint_prog.path(),
       meson.build_root(),
@@ -240,7 +242,8 @@ hvsupport_html_in = custom_target(
   output: 'hvsupport.html.in',
   command: [
     meson_python_prog,
-    hvsupport_prog,
+    python3_prog.path(),
+    hvsupport_prog.path(),
     meson.source_root(),
     meson.build_root(),
   ],
@@ -275,7 +278,8 @@ foreach data : docs_html_in_gen
     output: html_file,
     command: [
       meson_python_prog,
-      meson_html_gen_prog,
+      python3_prog.path(),
+      meson_html_gen_prog.path(),
       xsltproc_prog.path(),
       xmllint_prog.path(),
       meson.build_root(),
@@ -314,6 +318,9 @@ endforeach
 
 run_target(
   'install-web',
-  command: [ meson_python_prog, meson_install_web_prog.path(), install_web_files ],
+  command: [
+    meson_python_prog, python3_prog.path(), meson_install_web_prog.path(),
+    install_web_files,
+  ],
   depends: install_web_deps,
 )
diff --git a/libvirt.spec.in b/libvirt.spec.in
index d7450acc399..e64cfdb561e 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -259,6 +259,8 @@ BuildRequires: python36-docutils
 BuildRequires: python3-docutils
 %endif
 BuildRequires: gcc
+BuildRequires: meson >= 0.54.0
+BuildRequires: ninja-build
 BuildRequires: make
 BuildRequires: git
 %if 0%{?fedora} || 0%{?rhel} > 7
@@ -1279,7 +1281,7 @@ mv $RPM_BUILD_ROOT%{_datadir}/systemtap/tapset/libvirt_qemu_probes.stp \
 %endif
 
 %check
-VIR_TEST_DEBUG=1 %meson_test
+VIR_TEST_DEBUG=1 %meson_test --no-suite syntax-check
 
 %post libs
 %if 0%{?rhel} == 7
diff --git a/meson.build b/meson.build
index 4e43a526cc6..772708946b1 100644
--- a/meson.build
+++ b/meson.build
@@ -16,7 +16,7 @@ project(
 
 git = run_command('test', '-d', '.git').returncode() == 0
 
-if git and not get_option('no-git')
+if git and not get_option('no_git')
   run_command('git', 'submodule', 'update', '--init')
 endif
 
@@ -127,8 +127,6 @@ endif
 
 # test options
 
-use_test_suite = get_option('test_suite')
-
 if get_option('expensive_tests').auto()
   use_expensive_tests = not git
 else
@@ -144,7 +142,8 @@ if get_option('test_coverage')
 endif
 
 
-# Detect when running under the
+# Detect when running under the clang static analyzer's scan-build driver
+# or Coverity-prevent's cov-build. Define STATIC_ANALYSIS accordingly.
 
 rc = run_command(
   'sh', '-c',
@@ -205,8 +204,14 @@ libvirt_lib_version = '@0@.@1@.@2@'.format(libvirt_so_version, libvirt_age, libv
 # check compile flags
 
 cc = meson.get_compiler('c')
+cc_flags = []
 
-cc_flags = [
+git_werror = get_option('git_werror')
+if git_werror.enabled() or git_werror.auto() and git
+  cc_flags += [ '-Werror' ]
+endif
+
+cc_flags += [
   '-fno-common',
   '-W',
   '-Wabsolute-value',
@@ -360,7 +365,7 @@ size_max = cc.sizeof('size_t', prefix: '#include <stdint.h>')
 # in order to convert it to numbers to be able to pick the smaller one.
 alloc_max = run_command(
   'python3', '-c',
-  'print(min(2**@0@ - 1, 2**@1@ - 1))'.format(ptrdiff_max * 8 - 1, size_max * 8),
+  'print(min(2**(@0@ * 8 - 1) - 1, 2**(@1@ * 8) - 1))'.format(ptrdiff_max, size_max),
 )
 cc_flags += [
   '-Walloc-size-larger-than=@0@'.format(alloc_max.stdout().strip()),
@@ -390,7 +395,8 @@ cc_flags += [
   # We don't use -Wc++-compat so we have to enable it explicitly
   '-Wjump-misses-init',
 
-  # TODO comment
+  # -Wswitch is enabled but that doesn't report missing enums if a default:
+  # is present
   '-Wswitch-enum',
 
   # -Wformat=2 implies -Wformat-nonliteral so we need to manually exclude it
@@ -419,13 +425,9 @@ cc_flags += [
   '-Wno-suggest-attribute=const',
 ]
 
-if git
-  cc_flags += [ '-Werror' ]
-endif
-
 # on aarch64 error: -fstack-protector not supported for this target
 if host_machine.cpu_family() != 'aarch64'
-  if host_machine.system() in [ 'linux', 'freebsd' ]
+  if host_machine.system() in [ 'linux', 'freebsd', 'windows' ]
     # we prefer -fstack-protector-strong but fallback to -fstack-protector-all
     fstack_cflags = cc.first_supported_argument([
       '-fstack-protector-strong',
@@ -623,7 +625,7 @@ libvirt_export_dynamic = cc.first_supported_link_argument([
 ])
 
 
-# check availability of various common functions (non-fatal i missing)
+# check availability of various common functions (non-fatal if missing)
 
 functions = [
   '__lxstat',
@@ -789,7 +791,7 @@ if host_machine.system() == 'linux'
 endif
 
 foreach symbol : symbols
-  if cc.has_header_symbol(symbol[0], symbol[1])
+  if cc.has_header_symbol(symbol[0], symbol[1], args: '-D_GNU_SOURCE')
     conf.set('HAVE_DECL_@0@'.format(symbol[1].to_upper()), 1)
   endif
 endforeach
@@ -958,7 +960,7 @@ else
   acl_dep = dependency('', required: false)
 endif
 
-apparmor_dep = cc.find_library('AppArmor', required: get_option('apparmor'))
+apparmor_dep = dependency('libapparmor', required: get_option('apparmor'))
 if apparmor_dep.found()
   conf.set('WITH_APPARMOR', 1)
   conf.set_quoted('APPARMOR_DIR', '/etc/apparmor.d')
@@ -966,6 +968,9 @@ if apparmor_dep.found()
 endif
 
 attr_dep = cc.find_library('attr', required: get_option('attr'))
+if attr_dep.found()
+  conf.set('HAVE_LIBATTR', 1)
+endif
 
 audit_dep = cc.find_library('audit', required: get_option('audit'))
 if audit_dep.found()
@@ -1124,6 +1129,8 @@ if get_option('driver_remote').enabled()
   if libssh_dep.found()
     conf.set('WITH_LIBSSH', 1)
 
+    # Check if new functions exists, if not redefine them with old deprecated ones.
+    # List of [ new_function, deprecated_function ].
     functions = [
       [ 'ssh_get_server_publickey', 'ssh_get_publickey' ],
       [ 'ssh_session_is_known_server', 'ssh_is_server_known' ],
@@ -2066,12 +2073,6 @@ if chrdev_lock_files != ''
   conf.set_quoted('VIR_CHRDEV_LOCK_FILE_PATH', chrdev_lock_files)
 endif
 
-if get_option('debug_logs')
-  conf.set('ENABLE_DEBUG', 1)
-endif
-
-conf.set_quoted('DEFAULT_EDITOR', get_option('default_editor'))
-
 driver_modules_flags = []
 if conf.has('WITH_LIBVIRTD')
   if not conf.has('HAVE_DLFCN_H') or not dlopen_dep.found()
@@ -2107,6 +2108,14 @@ else
   init_script = get_option('init_script')
 endif
 
+loader_nvram = get_option('loader_nvram')
+if loader_nvram != ''
+  if (loader_nvram.split(':').length() % 2) != 0
+    error('Malformed loader_nvram option')
+  endif
+  conf.set_quoted('DEFAULT_LOADER_NVRAM', loader_nvram)
+endif
+
 if not get_option('login_shell').disabled() and host_machine.system() == 'linux'
   conf.set('WITH_LOGIN_SHELL', 1)
 elif get_option('login_shell').enabled()
@@ -2271,7 +2280,7 @@ if git
     )
   endforeach
 
-  authors = run_command(meson_gen_authors_prog)
+  authors = run_command(python3_prog, meson_gen_authors_prog.path(), env: runutf8)
   authors_file = 'AUTHORS.in'
 
   authors_conf = configuration_data()
@@ -2290,7 +2299,10 @@ if git
   ]
 
   foreach file : dist_files
-    meson.add_dist_script(meson_dist_prog.path(), meson.build_root(), file)
+    meson.add_dist_script(
+      meson_python_prog.path(), python3_prog.path(), meson_dist_prog.path(),
+      meson.build_root(), file
+    )
   endforeach
 endif
 
@@ -2307,7 +2319,7 @@ configure_file(
   output: 'run',
   configuration: run_conf,
 )
-run_command('scripts/meson-change-perms.sh', 'a+x', 'run')
+run_command('chmod', 'a+x', meson.current_build_dir() / 'run')
 
 
 # generate developer tooling files
@@ -2435,15 +2447,19 @@ test_summary = {
 }
 summary(test_summary, section: 'Test suite', bool_yn: true)
 
+if conf.has('DEFAULT_LOADER_NVRAM')
+  loader_res = '@0@ !!! Using this configure option is strongly discouraged !!!'.format(conf.get_unquoted('DEFAULT_LOADER_NVRAM'))
+else
+  loader_res = ''
+endif
 misc_summary = {
-  'Debug': conf.has('ENABLE_DEBUG'),
   'Use -Werror': cc_flags.contains('-Werror'),
   'Warning Flags': supported_cc_flags,
   'DTrace': conf.has('WITH_DTRACE_PROBES'),
   'numad': conf.has('HAVE_NUMAD'),
   'Init script': init_script,
   'Char device locks': chrdev_lock_files,
-  'Default Editor': conf.get_unquoted('DEFAULT_EDITOR'),
+  'Loader/NVRAM': loader_res,
   'virt-login-shell': conf.has('WITH_LOGIN_SHELL'),
   'virt-host-validate': conf.has('WITH_HOST_VALIDATE'),
   'TLS priority': conf.get_unquoted('TLS_PRIORITY'),
diff --git a/meson_options.txt b/meson_options.txt
index dbbacf7e8ff..a1bb6505b8c 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,11 +1,11 @@
-option('no-git', type: 'boolean', value: false, description: 'Disable git submodule update')
+option('no_git', type: 'boolean', value: false, description: 'Disable git submodule update')
 option('packager', type: 'string', value: '', description: 'Extra packager name')
 option('packager_version', type: 'string', value: '', description: 'Extra packager version')
 option('system', type: 'boolean', value: false, description: 'Set install paths to system ones')
 option('runstatedir', type: 'string', value: '', description: 'State directory for temporary sockets, pid files, etc')
-option('test_suite', type: 'boolean', value: true, description: 'Whether to enable and build test suite by default')
 option('expensive_tests', type: 'feature', value: 'auto', description: 'set the default for enabling expensive tests (long timeouts), use VIR_TEST_EXPENSIVE to override')
 option('test_coverage', type: 'boolean', value: false, description: 'turn on code coverage instrumentation')
+option('git_werror', type: 'feature', value: 'auto', description: 'use -Werror if building from GIT')
 
 
 # build dependencies options
@@ -47,7 +47,7 @@ option('yajl', type: 'feature', value: 'auto', description: 'yajl support')
 
 
 # build driver options
-option('driver_bhyve', type: 'feature', value: 'auto', description: 'BHyVe driver')
+option('driver_bhyve', type: 'feature', value: 'auto', description: 'bhyve driver')
 option('driver_esx', type: 'feature', value: 'enabled', description: 'esx driver')
 option('driver_hyperv', type: 'feature', value: 'auto', description: 'Hyper-V driver')
 option('driver_interface', type: 'feature', value: 'auto', description: 'host interface driver')
@@ -91,11 +91,10 @@ option('storage_zfs', type: 'feature', value: 'auto', description: 'ZFS backend
 
 # build feature options
 option('chrdev_lock_files', type: 'string', value: '', description: 'location for UUCP style lock files for character devices (leave empty for default paths on some platforms)')
-option('debug_logs', type: 'boolean', value: true, description: 'enable debugging output')
-option('default_editor', type: 'string', value: 'vi', description: 'Editor to use for interactive commands')
 option('dtrace', type: 'feature', value: 'auto', description: 'use dtrace for static probing')
 option('host_validate', type: 'feature', value: 'auto', description: 'build virt-host-validate')
 option('init_script', type: 'combo', choices: ['systemd', 'openrc', 'check', 'none'], value: 'check', description: 'Style of init script to install')
+option('loader_nvram', type: 'string', value: '', description: 'Pass list of pairs of <loader>:<nvram> paths. Both pairs and list items are separated by a colon.')
 option('login_shell', type: 'feature', value: 'auto', description: 'build virt-login-shell')
 option('nss', type: 'feature', value: 'auto', description: 'enable Name Service Switch plugin for resolving guest IP addresses')
 option('numad', type: 'feature', value: 'auto', description: 'use numad to manage CPU placement dynamically')
diff --git a/scripts/check-augeas.sh b/scripts/check-augeas.sh
deleted file mode 100644
index 68609d555a7..00000000000
--- a/scripts/check-augeas.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-AUGPARSE=$1
-srcdir=$2
-builddir=$3
-augeastest=$4
-
-set -vx
-
-for f in $augeastest; do
-    ${AUGPARSE} -I "$srcdir" -I "$builddir" $f
-done
diff --git a/scripts/check-file-access.py b/scripts/check-file-access.py
index f0e98f4b652..2636eb4f96d 100755
--- a/scripts/check-file-access.py
+++ b/scripts/check-file-access.py
@@ -22,16 +22,16 @@
 #
 
 import os
-import random
 import re
-import string
 import sys
+import tempfile
 
 abs_builddir = os.environ.get('abs_builddir', '')
 abs_srcdir = os.environ.get('abs_srcdir', '')
 
-filename = ''.join(random.choice(string.ascii_letters) for _ in range(16))
-access_file = os.path.join(abs_builddir, 'file-access-{0}.txt'.format(filename))
+access_fd, access_file = tempfile.mkstemp(dir=abs_builddir,
+                                          prefix='file-access-',
+                                          suffix='.txt')
 permitted_file = os.path.join(abs_srcdir, 'permitted_file_access.txt')
 
 os.environ['VIR_TEST_FILE_ACCESS_OUTPUT'] = access_file
@@ -40,7 +40,9 @@ test = ' '.join(sys.argv[1:])
 
 ret = os.system(test)
 
-if ret != 0 or not os.is_file(access_file):
+if ret != 0 or os.read(access_fd, 10) == b'':
+    os.close(access_fd)
+    os.remove(access_file)
     sys.exit(ret)
 
 known_actions = ["open", "fopen", "access", "stat", "lstat", "connect"]
@@ -48,7 +50,7 @@ known_actions = ["open", "fopen", "access", "stat", "lstat", "connect"]
 files = []
 permitted = []
 
-with open(access_file, "r") as fh:
+with os.fdopen(access_fd, "r") as fh:
     for line in fh:
         line = line.rstrip("\n")
 
diff --git a/scripts/check-remote-protocol.py b/scripts/check-remote-protocol.py
index 00b8570f9bb..0a6135376e6 100644
--- a/scripts/check-remote-protocol.py
+++ b/scripts/check-remote-protocol.py
@@ -32,11 +32,14 @@ import subprocess
 import sys
 
 name = sys.argv[1]
-libname = sys.argv[2]
-builddir = sys.argv[3]
+targetname = sys.argv[2]
+libpath = sys.argv[3]
 pdwtags = sys.argv[4]
 expected = sys.argv[5]
 
+builddir = os.path.dirname(libpath)
+libname = os.path.basename(libpath)
+
 
 def get_subdir(dirname, subdir):
     objectdir = ""
@@ -52,7 +55,18 @@ def get_subdir(dirname, subdir):
     return os.path.join(dirname, objectdir)
 
 
-objectdir = get_subdir(builddir, r'.*@{0}@.*'.format(libname))
+# Figure out where is the meson target private directory that contains
+# generated object files.
+# With meson version < 0.55.0 the directory pattern is:
+#
+#   `hash_string@@target_name@bin_type` for example `25a6634@@vir_net_rpc@sta`
+#
+# but this was changed in meson 0.55.0 to a new pattern:
+#
+#   `output_file_name.p` for example `libvirt_net_rpc.a.p`
+objectdir = get_subdir(
+    builddir,
+    r'(.*@{0}@.*|{1}\.p)'.format(targetname, re.escape(libname)))
 
 proto_o = get_subdir(objectdir, r'.*{0}\.c\.o'.format(name))
 
diff --git a/scripts/esx_vi_generator.py b/scripts/esx_vi_generator.py
index 048f5dde9ee..863c8af9640 100755
--- a/scripts/esx_vi_generator.py
+++ b/scripts/esx_vi_generator.py
@@ -1250,12 +1250,7 @@ def is_known_type(type):
             type in enums_by_name)
 
 
-def open_and_print(filename):
-    if filename.startswith("./"):
-        print("  GEN      " + filename[2:])
-    else:
-        print("  GEN      " + filename)
-
+def open_file(filename):
     return open(filename, "wt")
 
 
@@ -1327,17 +1322,17 @@ input_filename = os.path.join(sys.argv[1], "esx/esx_vi_generator.input")
 output_dirname = os.path.join(sys.argv[2], "esx")
 
 
-types_typedef = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typedef"))
-types_typeenum = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typeenum"))
-types_typetostring = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typetostring"))
-types_typefromstring = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.typefromstring"))
-types_header = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.h"))
-types_source = open_and_print(os.path.join(output_dirname, "esx_vi_types.generated.c"))
-methods_header = open_and_print(os.path.join(output_dirname, "esx_vi_methods.generated.h"))
-methods_source = open_and_print(os.path.join(output_dirname, "esx_vi_methods.generated.c"))
-methods_macro = open_and_print(os.path.join(output_dirname, "esx_vi_methods.generated.macro"))
-helpers_header = open_and_print(os.path.join(output_dirname, "esx_vi.generated.h"))
-helpers_source = open_and_print(os.path.join(output_dirname, "esx_vi.generated.c"))
+types_typedef = open_file(os.path.join(output_dirname, "esx_vi_types.generated.typedef"))
+types_typeenum = open_file(os.path.join(output_dirname, "esx_vi_types.generated.typeenum"))
+types_typetostring = open_file(os.path.join(output_dirname, "esx_vi_types.generated.typetostring"))
+types_typefromstring = open_file(os.path.join(output_dirname, "esx_vi_types.generated.typefromstring"))
+types_header = open_file(os.path.join(output_dirname, "esx_vi_types.generated.h"))
+types_source = open_file(os.path.join(output_dirname, "esx_vi_types.generated.c"))
+methods_header = open_file(os.path.join(output_dirname, "esx_vi_methods.generated.h"))
+methods_source = open_file(os.path.join(output_dirname, "esx_vi_methods.generated.c"))
+methods_macro = open_file(os.path.join(output_dirname, "esx_vi_methods.generated.macro"))
+helpers_header = open_file(os.path.join(output_dirname, "esx_vi.generated.h"))
+helpers_source = open_file(os.path.join(output_dirname, "esx_vi.generated.c"))
 
 
 number = 0
diff --git a/scripts/gen-def-files.sh b/scripts/gen-def-files.sh
deleted file mode 100755
index 1ec7b083802..00000000000
--- a/scripts/gen-def-files.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-printf 'EXPORTS\n'
-sed -e '/^$/d; /#/d; /:/d; /}/d; /\*/d; /LIBVIRT_/d' \
-    -e 's/[  ]*\(.*\)\;/    \1/g' $1
diff --git a/scripts/gen-sym-files.sh b/scripts/gen-sym-files.sh
deleted file mode 100755
index 913a684d064..00000000000
--- a/scripts/gen-sym-files.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-
-version="$1"
-shift
-public="$1"
-shift
-private="$@"
-
-printf "# WARNING: generated from the following files:\n\n"
-cat $public
-printf "\n\n# Private symbols\n\n"
-printf "$version {\n\n"
-printf "global:\n\n"
-cat $private
-printf "\n\nlocal:\n*;\n\n};"
diff --git a/scripts/hyperv_wmi_generator.py b/scripts/hyperv_wmi_generator.py
index 736eabd598c..ac03cf526f5 100755
--- a/scripts/hyperv_wmi_generator.py
+++ b/scripts/hyperv_wmi_generator.py
@@ -372,12 +372,7 @@ class Property:
         return '    { "%s", "%s", %s },\n' % (self.name, self.type.lower(), str(self.is_array).lower())
 
 
-def open_and_print(filename):
-    if filename.startswith("./"):
-        print("  GEN      " + filename[2:])
-    else:
-        print("  GEN      " + filename)
-
+def open_file(filename):
     return open(filename, "wt")
 
 
@@ -438,9 +433,9 @@ def main():
     input_filename = os.path.join(sys.argv[1], "hyperv", "hyperv_wmi_generator.input")
     output_dirname = os.path.join(sys.argv[2], "hyperv")
 
-    classes_typedef = open_and_print(os.path.join(output_dirname, "hyperv_wmi_classes.generated.typedef"))
-    classes_header = open_and_print(os.path.join(output_dirname, "hyperv_wmi_classes.generated.h"))
-    classes_source = open_and_print(os.path.join(output_dirname, "hyperv_wmi_classes.generated.c"))
+    classes_typedef = open_file(os.path.join(output_dirname, "hyperv_wmi_classes.generated.typedef"))
+    classes_header = open_file(os.path.join(output_dirname, "hyperv_wmi_classes.generated.h"))
+    classes_source = open_file(os.path.join(output_dirname, "hyperv_wmi_classes.generated.c"))
 
     # parse input file
     number = 0
diff --git a/scripts/install-dirs.sh b/scripts/install-dirs.sh
deleted file mode 100644
index 27558d53fe9..00000000000
--- a/scripts/install-dirs.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-for dir in "$@"; do
-    mkdir -p $DESTDIR/$dir
-done
diff --git a/scripts/install-symlink.sh b/scripts/install-symlink.sh
deleted file mode 100644
index bfd1f5ad37d..00000000000
--- a/scripts/install-symlink.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-
-mkdir -p $DESTDIR/$1
-
-cd $DESTDIR/$1
-
-ln -f -s $2 $3
diff --git a/scripts/meson-change-perms.sh b/scripts/meson-change-perms.sh
deleted file mode 100644
index b366d80077e..00000000000
--- a/scripts/meson-change-perms.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-perms=$1
-file=$2
-
-chmod $perms $MESON_BUILD_ROOT/$file
diff --git a/scripts/meson-dist.py b/scripts/meson-dist.py
new file mode 100755
index 00000000000..a1d36c2533d
--- /dev/null
+++ b/scripts/meson-dist.py
@@ -0,0 +1,14 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+meson_build_root = sys.argv[1]
+file_name = sys.argv[2]
+
+meson_dist_root = os.environ['MESON_DIST_ROOT']
+
+os.system('cp {0} {1}'.format(
+    os.path.join(meson_build_root, file_name),
+    os.path.join(meson_dist_root, file_name)
+))
diff --git a/scripts/meson-dist.sh b/scripts/meson-dist.sh
deleted file mode 100755
index fdcc0154e02..00000000000
--- a/scripts/meson-dist.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/sh
-
-MESON_BUILD_ROOT=$1
-FILE=$2
-
-cp $MESON_BUILD_ROOT/$FILE $MESON_DIST_ROOT/$FILE
diff --git a/scripts/meson-gen-authors.py b/scripts/meson-gen-authors.py
new file mode 100755
index 00000000000..f58bf6383bf
--- /dev/null
+++ b/scripts/meson-gen-authors.py
@@ -0,0 +1,8 @@
+#!/usr/bin/env python3
+
+import os
+
+meson_source_root = os.environ['MESON_SOURCE_ROOT']
+
+os.chdir(meson_source_root)
+os.system('git log --pretty=format:"%aN <%aE>" | sort -u')
diff --git a/scripts/meson-gen-authors.sh b/scripts/meson-gen-authors.sh
deleted file mode 100755
index bf0a3b63886..00000000000
--- a/scripts/meson-gen-authors.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-cd $MESON_SOURCE_ROOT
-git log --pretty=format:'* %aN <%aE>' | sort -u
diff --git a/scripts/meson-gen-def.py b/scripts/meson-gen-def.py
new file mode 100755
index 00000000000..06c9bdf66ab
--- /dev/null
+++ b/scripts/meson-gen-def.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python3
+
+import re
+import sys
+
+if len(sys.argv) != 3:
+    print('invalid arguments')
+    print('usage: {0} INPUT OUTPUT'.format(sys.argv[0]))
+    sys.exit(1)
+
+infilepath = sys.argv[1]
+outfilepath = sys.argv[2]
+
+with open(infilepath) as f:
+    text = f.read()
+
+text = re.sub(r'^(|.*[#:}*].*|LIBVIRT_.*)\n?', '', text, flags=re.M)
+text = re.sub(r'\n$', '', text)
+text = re.sub(r'^[ ]*(.*);', r'    \1', text, flags=re.M)
+
+with open(outfilepath, 'w') as f:
+    f.write('EXPORTS\n')
+    f.write(text)
diff --git a/scripts/meson-gen-sym.py b/scripts/meson-gen-sym.py
new file mode 100755
index 00000000000..65a13e550a1
--- /dev/null
+++ b/scripts/meson-gen-sym.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+
+import sys
+
+if len(sys.argv) < 5:
+    print('invalid arguments')
+    print('usage: {0} OUTPUT VERSION PUBLIC PRIVATE ...')
+    sys.exit(1)
+
+outfilepath = sys.argv[1]
+version = sys.argv[2]
+public = sys.argv[3]
+private = sys.argv[4:]
+
+with open(outfilepath, 'w') as out:
+    out.write('# WARNING: generated from the following files:\n\n')
+
+    with open(public) as tmp:
+        out.write(tmp.read())
+
+    out.write('\n\n# Private symbols\n\n')
+    out.write('{0} {{\n\n'.format(version))
+    out.write('global:\n\n')
+
+    for priv in private:
+        with open(priv) as tmp:
+            out.write(tmp.read())
+
+    out.write('\n\nlocal:\n*;\n\n};')
diff --git a/scripts/meson-html-gen.py b/scripts/meson-html-gen.py
index 9ac649a9ef7..26de64dc788 100755
--- a/scripts/meson-html-gen.py
+++ b/scripts/meson-html-gen.py
@@ -21,9 +21,6 @@ rstfile = pagesrc.replace('.html.in', '.rst')
 if os.path.exists(rstfile):
     pagesrc = rstfile
 
-with open(args.infile, 'rb') as infile:
-    html_in_data = infile.read()
-
 html_tmp = subprocess.run(
     [
         args.xsltproc,
@@ -31,9 +28,8 @@ html_tmp = subprocess.run(
         '--stringparam', 'pagesrc', pagesrc,
         '--stringparam', 'builddir', args.builddir,
         '--stringparam', 'timestamp', args.timestamp,
-        '--nonet', args.style, '-',
+        '--nonet', args.style, args.infile,
     ],
-    input=html_in_data,
     stdout=subprocess.PIPE,
     stderr=subprocess.PIPE,
 )
diff --git a/scripts/meson-install-dirs.py b/scripts/meson-install-dirs.py
new file mode 100644
index 00000000000..14ec6b93e85
--- /dev/null
+++ b/scripts/meson-install-dirs.py
@@ -0,0 +1,9 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+destdir = os.environ.get('DESTDIR', os.sep)
+
+for dirname in sys.argv[1:]:
+    os.makedirs(os.path.join(destdir, dirname.strip(os.sep)), exist_ok=True)
diff --git a/scripts/meson-install-symlink.py b/scripts/meson-install-symlink.py
new file mode 100644
index 00000000000..e38507072d9
--- /dev/null
+++ b/scripts/meson-install-symlink.py
@@ -0,0 +1,15 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+
+destdir = os.environ.get('DESTDIR', os.sep)
+dirname = sys.argv[1]
+target = sys.argv[2]
+link = sys.argv[3]
+
+workdir = os.path.join(destdir, dirname.strip(os.sep))
+
+os.makedirs(workdir, exist_ok=True)
+os.chdir(workdir)
+os.symlink(target, link)
diff --git a/scripts/meson-timestamp.py b/scripts/meson-timestamp.py
new file mode 100755
index 00000000000..f109cad66e8
--- /dev/null
+++ b/scripts/meson-timestamp.py
@@ -0,0 +1,13 @@
+#!/usr/bin/env python3
+
+import os
+
+from datetime import datetime, timezone
+
+timestamp = os.environ.get('SOURCE_DATE_EPOCH', None)
+timeformat = '%c %Z'
+
+if timestamp:
+    print(datetime.fromtimestamp(int(timestamp), tz=timezone.utc).strftime(timeformat))
+else:
+    print(datetime.now(tz=timezone.utc).strftime(timeformat))
diff --git a/scripts/meson-timestamp.sh b/scripts/meson-timestamp.sh
deleted file mode 100755
index e68be1926cf..00000000000
--- a/scripts/meson-timestamp.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-
-if test -n "$SOURCE_DATE_EPOCH";
-then
-    date -u --date="$SOURCE_DATE_EPOCH"
-else
-    date -u
-fi
diff --git a/scripts/meson.build b/scripts/meson.build
index 2f46ece59fb..59b3c9bacda 100644
--- a/scripts/meson.build
+++ b/scripts/meson.build
@@ -3,7 +3,6 @@ scripts = [
   'augeas-gentest.py',
   'check-aclperms.py',
   'check-aclrules.py',
-  'check-augeas.sh',
   'check-driverimpls.py',
   'check-drivername.py',
   'check-file-access.py',
@@ -12,8 +11,6 @@ scripts = [
   'check-symsorting.py',
   'dtrace2systemtap.py',
   'esx_vi_generator.py',
-  'gen-def-files.sh',
-  'gen-sym-files.sh',
   'genaclperms.py',
   'genpolkit.py',
   'gensystemtap.py',
@@ -21,14 +18,16 @@ scripts = [
   'header-ifdef.py',
   'hvsupport.py',
   'hyperv_wmi_generator.py',
-  'install-dirs.sh',
-  'install-symlink.sh',
-  'meson-dist.sh',
-  'meson-gen-authors.sh',
+  'meson-dist.py',
+  'meson-gen-authors.py',
+  'meson-gen-def.py',
+  'meson-gen-sym.py',
   'meson-html-gen.py',
+  'meson-install-dirs.py',
+  'meson-install-symlink.py',
   'meson-install-web.py',
   'meson-python.sh',
-  'meson-timestamp.sh',
+  'meson-timestamp.py',
   'mock-noinline.py',
   'prohibit-duplicate-header.py',
   'test-wrap-argv.py',
diff --git a/src/access/meson.build b/src/access/meson.build
index beb61eddaf5..b23838a7762 100644
--- a/src/access/meson.build
+++ b/src/access/meson.build
@@ -78,7 +78,7 @@ if conf.has('WITH_POLKIT')
       'org.libvirt.api.policy',
       input: access_perm_h,
       output: 'org.libvirt.api.policy',
-      command: [ meson_python_prog, genpolkit_prog, '@INPUT@' ],
+      command: [ meson_python_prog, python3_prog.path(), genpolkit_prog.path(), '@INPUT@' ],
       capture: true,
       install: true,
       install_dir: datadir / 'polkit-1' / 'actions',
diff --git a/src/admin/meson.build b/src/admin/meson.build
index 394ac2b04ad..215767f02af 100644
--- a/src/admin/meson.build
+++ b/src/admin/meson.build
@@ -66,8 +66,10 @@ libvirt_admin_syms = custom_target(
     libvirt_admin_private_syms,
   ],
   output: 'libvirt_admin.syms',
-  command: [ gen_sym_files_prog, 'LIBVIRT_ADMIN_PRIVATE_' + meson.project_version(), '@INPUT@' ],
-  capture: true,
+  command: [
+    meson_python_prog, python3_prog.path(), meson_gen_sym_prog.path(),
+    '@OUTPUT@', 'LIBVIRT_ADMIN_PRIVATE_' + meson.project_version(), '@INPUT@',
+  ],
 )
 libvirt_admin_syms_file = libvirt_admin_syms
 if host_machine.system() == 'windows'
@@ -75,8 +77,10 @@ if host_machine.system() == 'windows'
     'libvirt_admin.def',
     input: libvirt_admin_syms,
     output: 'libvirt_admin.def',
-    command: [ gen_def_files_prog, '@INPUT@' ],
-    capture: true,
+    command: [
+      meson_python_prog, python3_prog.path(), meson_gen_def_prog.path(),
+      '@INPUT@', '@OUTPUT@',
+    ],
   )
   libvirt_admin_syms_file = libvirt_admin_def
 endif
@@ -100,13 +104,9 @@ admin_driver_lib = static_library(
   ],
 )
 
-libvirt_libs += admin_driver_lib
-
 check_protocols += {
   'name': 'admin_protocol',
-  'libname': 'virt_admin_driver',
-  'builddir': meson.current_build_dir(),
-  'depends': admin_driver_lib,
+  'lib': admin_driver_lib,
 }
 
 virt_conf_files += files('libvirt-admin.conf')
diff --git a/src/bhyve/meson.build b/src/bhyve/meson.build
index 6dc8b7d29ff..643e72680ed 100644
--- a/src/bhyve/meson.build
+++ b/src/bhyve/meson.build
@@ -57,6 +57,5 @@ if conf.has('WITH_BHYVE')
 
   virt_daemon_confs += {
     'name': 'virtbhyved',
-    'name_uc': 'Virtbhyved',
   }
 endif
diff --git a/src/cpu_map/meson.build b/src/cpu_map/meson.build
index d89106dfcbd..19daa7157bb 100644
--- a/src/cpu_map/meson.build
+++ b/src/cpu_map/meson.build
@@ -21,6 +21,7 @@ cpumap_data = [
   'x86_Broadwell-noTSX-IBRS.xml',
   'x86_Broadwell-noTSX.xml',
   'x86_Broadwell.xml',
+  'x86_Cascadelake-Server-noTSX.xml',
   'x86_Cascadelake-Server.xml',
   'x86_Conroe.xml',
   'x86_Cooperlake.xml',
@@ -28,6 +29,7 @@ cpumap_data = [
   'x86_coreduo.xml',
   'x86_cpu64-rhel5.xml',
   'x86_cpu64-rhel6.xml',
+  'x86_Dhyana.xml',
   'x86_EPYC-IBPB.xml',
   'x86_EPYC.xml',
   'x86_features.xml',
diff --git a/src/esx/meson.build b/src/esx/meson.build
index 469c2044c63..f2d59462feb 100644
--- a/src/esx/meson.build
+++ b/src/esx/meson.build
@@ -31,8 +31,7 @@ esx_gen_sources = custom_target(
     'esx_vi_types.generated.typetostring',
   ],
   command: [
-    meson_python_prog,
-    esx_vi_generator_prog,
+    meson_python_prog, python3_prog.path(), esx_vi_generator_prog.path(),
     meson.source_root() / 'src',
     meson.build_root() / 'src',
   ],
diff --git a/src/hyperv/meson.build b/src/hyperv/meson.build
index d499889b01b..84fcedce38f 100644
--- a/src/hyperv/meson.build
+++ b/src/hyperv/meson.build
@@ -16,8 +16,7 @@ hyperv_gen_sources = custom_target(
     'hyperv_wmi_classes.generated.typedef',
   ],
   command: [
-    meson_python_prog,
-    hyperv_wmi_generator_prog,
+    meson_python_prog, python3_prog.path(), hyperv_wmi_generator_prog.path(),
     meson.source_root() / 'src',
     meson.build_root() / 'src',
   ],
diff --git a/src/interface/meson.build b/src/interface/meson.build
index bf9d649282e..1092c5a2673 100644
--- a/src/interface/meson.build
+++ b/src/interface/meson.build
@@ -40,7 +40,6 @@ if conf.has('WITH_INTERFACE')
 
   virt_daemon_confs += {
     'name': 'virtinterfaced',
-    'name_uc': 'Virtinterfaced',
   }
 
   virt_daemon_units += {
diff --git a/src/libxl/meson.build b/src/libxl/meson.build
index b2e9ca07d4a..7afde2f81f0 100644
--- a/src/libxl/meson.build
+++ b/src/libxl/meson.build
@@ -58,7 +58,6 @@ if conf.has('WITH_LIBXL')
 
   virt_daemon_confs += {
     'name': 'virtxend',
-    'name_uc': 'Virtxend',
   }
 
   virt_daemon_units += {
diff --git a/src/locking/meson.build b/src/locking/meson.build
index 4c30acb2eb9..a67a41298b1 100644
--- a/src/locking/meson.build
+++ b/src/locking/meson.build
@@ -92,9 +92,7 @@ if conf.has('WITH_LIBVIRTD')
 
   check_protocols += {
     'name': 'lock_protocol',
-    'libname': 'lockd_impl',
-    'builddir': meson.current_build_dir(),
-    'depends': lockd_lib_impl,
+    'lib': lockd_lib_impl,
   }
 
   lockdriver_dir = libdir / 'libvirt' / 'lock-driver'
diff --git a/src/logging/meson.build b/src/logging/meson.build
index 8e913fb352f..1f06a51e935 100644
--- a/src/logging/meson.build
+++ b/src/logging/meson.build
@@ -6,7 +6,7 @@ log_protocol = 'log_protocol.x'
 
 log_protocol_generated = []
 
-log_protocol_generated += custom_target(
+log_protocol_header_generated = custom_target(
   'log_protocol.h',
   input: log_protocol,
   output: 'log_protocol.h',
@@ -14,6 +14,7 @@ log_protocol_generated += custom_target(
     genprotocol_prog, rpcgen_prog, '-h', '@INPUT@', '@OUTPUT@'
   ],
 )
+log_protocol_generated += log_protocol_header_generated
 
 log_protocol_generated += custom_target(
   'log_protocol.c',
@@ -98,3 +99,10 @@ if conf.has('WITH_LIBVIRTD')
     'file': files('virtlogd.sysconf'),
   }
 endif
+
+log_inc_dir = include_directories('.')
+
+log_dep = declare_dependency(
+  include_directories: log_inc_dir,
+  sources: log_protocol_header_generated,
+)
diff --git a/src/lxc/meson.build b/src/lxc/meson.build
index 093ad809029..11526b637b2 100644
--- a/src/lxc/meson.build
+++ b/src/lxc/meson.build
@@ -101,9 +101,7 @@ if conf.has('WITH_LXC')
 
   check_protocols += {
     'name': 'lxc_monitor_protocol',
-    'libname': 'virt_driver_lxc_impl',
-    'builddir': meson.current_build_dir(),
-    'depends': lxc_driver_impl_lib,
+    'lib': lxc_driver_impl_lib,
   }
 
   virt_modules += {
@@ -160,7 +158,6 @@ if conf.has('WITH_LXC')
 
   virt_daemon_confs += {
     'name': 'virtlxcd',
-    'name_uc': 'Virtlxcd',
   }
 
   virt_daemon_units += {
diff --git a/src/meson.build b/src/meson.build
index 66aa6201550..59370744161 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -15,7 +15,13 @@ src_dep = declare_dependency(
     src_inc_dir,
     top_inc_dir,
   ],
-  link_args: libvirt_relro + libvirt_no_indirect + coverage_flags + driver_modules_flags + win32_link_flags,
+  link_args: (
+    libvirt_relro
+    + libvirt_no_indirect
+    + coverage_flags
+    + driver_modules_flags
+    + win32_link_flags
+  ),
 )
 
 
@@ -68,7 +74,10 @@ if conf.has('WITH_DTRACE_PROBES')
     out_stp,
     input: infile,
     output: out_stp,
-    command: [ meson_python_prog, dtrace2systemtap_prog, bindir, sbindir, libdir, '@INPUT@' ],
+    command: [
+      meson_python_prog, python3_prog.path(), dtrace2systemtap_prog.path(),
+      bindir, sbindir, libdir, '@INPUT@'
+    ],
     capture: true,
     install: true,
     install_dir: systemtap_dir,
@@ -135,7 +144,7 @@ virt_modules = []
 
 # virt_daemons:
 #   each entry is a dictionary with following items:
-#   * name - binary name (rquired)
+#   * name - binary name (required)
 #   * sources - binary sources (optional, default remote_daemon_sources)
 #   * c_args - compile arguments (optional, default [])
 #   * include = include_directories (optional, default [])
@@ -170,7 +179,6 @@ virt_test_aug_files = []
 #   generation libvirt daemon conf files
 #   each entry is a dictionary with following items:
 #   * name - daemon name (required)
-#   * name_uc - daemon name with first letter uppercase (required)
 #   * with_ip - only for libvirtd and virtproxyd (optional, default false)
 virt_daemon_confs = []
 
@@ -220,9 +228,7 @@ stateful_driver_source_files = []
 # check_protocols:
 #   check if $name.x is in sync with $name-structs
 #   name - name of the protocol (required)
-#   libname - name of the meson library (required)
-#   builddir - build directory for the library (required)
-#   depends - library that this test depends on (required)
+#   lib - library that this test depends on (required)
 check_protocols = []
 
 
@@ -345,8 +351,10 @@ libvirt_syms = custom_target(
   'libvirt.syms',
   input: [ public_sym_file ] + used_sym_files + generated_sym_files,
   output: 'libvirt.syms',
-  command: [ gen_sym_files_prog, 'LIBVIRT_PRIVATE_' + meson.project_version(), '@INPUT@' ],
-  capture: true,
+  command: [
+    meson_python_prog, python3_prog.path(), meson_gen_sym_prog.path(),
+    '@OUTPUT@', 'LIBVIRT_PRIVATE_' + meson.project_version(), '@INPUT@',
+  ],
 )
 libvirt_syms_file = libvirt_syms
 if host_machine.system() == 'windows'
@@ -354,8 +362,10 @@ if host_machine.system() == 'windows'
     'libvirt.def',
     input: libvirt_syms,
     output: 'libvirt.def',
-    command: [ gen_def_files_prog, '@INPUT@' ],
-    capture: true,
+    command: [
+      meson_python_prog, python3_prog.path(), meson_gen_def_prog.path(),
+      '@INPUT@', '@OUTPUT@',
+    ],
   )
   libvirt_syms_file = libvirt_def
 endif
@@ -402,8 +412,10 @@ if host_machine.system() == 'windows'
     'libvirt_qemu.def',
     input: libvirt_qemu_syms,
     output: 'libvirt_qemu.def',
-    command: [ gen_def_files_prog, '@INPUT@' ],
-    capture: true,
+    command: [
+      meson_python_prog, python3_prog.path(), meson_gen_def_prog.path(),
+      '@INPUT@', '@OUTPUT@',
+    ],
   )
   libvirt_qemu_syms_file = libvirt_qemu_def
   libvirt_qemu_syms_path = libvirt_qemu_def.full_path()
@@ -454,8 +466,10 @@ if host_machine.system() == 'windows'
     'libvirt_lxc.def',
     input: libvirt_lxc_syms,
     output: 'libvirt_lxc.def',
-    command: [ gen_def_files_prog, '@INPUT@' ],
-    capture: true,
+    command: [
+      meson_python_prog, python3_prog.path(), meson_gen_def_prog.path(),
+      '@INPUT@', '@OUTPUT@',
+    ],
   )
   libvirt_lxc_syms_file = libvirt_lxc_def
   libvirt_lxc_syms_path = libvirt_lxc_def.full_path()
@@ -659,22 +673,31 @@ foreach data : virt_test_aug_files
     data['name'],
     input: [ data['conf'], data['aug'] ],
     output: data['name'],
-    command: [ meson_python_prog, augeas_gentest_prog, '@INPUT@' ],
+    command: [
+      meson_python_prog, python3_prog.path(), augeas_gentest_prog.path(),
+      '@INPUT@',
+    ],
     capture: true,
     install: true,
     install_dir: virt_test_aug_dir,
   )
 endforeach
 
+# augeas_test_data:
+#   each entry is a dictionary with following items:
+#   * name: daemon name to run the test for (required)
+#   * file: test file to use (required)
 augeas_test_data = []
 
 foreach data : virt_daemon_confs
+  capitalize_args = [ '-c', 'print("@0@".capitalize())'.format(data['name']) ]
+  name_uc = run_command(python3_prog, capitalize_args, check: true).stdout().strip()
   daemon_conf = configuration_data()
   daemon_conf.set('runstatedir', runstatedir)
   daemon_conf.set('sbindir', sbindir)
   daemon_conf.set('sysconfdir', sysconfdir)
   daemon_conf.set('DAEMON_NAME', data['name'])
-  daemon_conf.set('DAEMON_NAME_UC', data['name_uc'])
+  daemon_conf.set('DAEMON_NAME_UC', name_uc)
   # to silence meson warning about missing 'CONFIG' in the configuration_data
   daemon_conf.set('CONFIG', '@CONFIG@')
 
@@ -720,12 +743,15 @@ foreach data : virt_daemon_confs
     test_aug_out,
     input: [ conf_out, test_aug_tmp ],
     output: test_aug_out,
-    command: [ meson_python_prog, augeas_gentest_prog, '@INPUT@' ],
+    command: [
+      meson_python_prog, python3_prog.path(), augeas_gentest_prog.path(),
+      '@INPUT@',
+    ],
     capture: true,
     install: true,
     install_dir: virt_test_aug_dir,
   )
-  augeas_test_data += augeas_test_file
+  augeas_test_data += { 'name': data['name'], 'file': augeas_test_file }
 endforeach
 
 
@@ -827,7 +853,10 @@ if conf.has('WITH_DTRACE_PROBES')
     'libvirt_functions.stp',
     input: rpc_probe_files,
     output: 'libvirt_functions.stp',
-    command: [ meson_python_prog, gensystemtap_prog, '@INPUT@' ],
+    command: [
+      meson_python_prog, python3_prog.path(), gensystemtap_prog.path(),
+      '@INPUT@',
+    ],
     capture: true,
     install: true,
     install_dir: systemtap_dir,
@@ -844,7 +873,10 @@ virt_install_dirs += [
   localstatedir / 'lib' / 'libvirt' / 'boot',
 ]
 
-meson.add_install_script(install_dirs_prog.path(), virt_install_dirs)
+meson.add_install_script(
+  meson_python_prog.path(), python3_prog.path(), meson_install_dirs_prog.path(),
+  virt_install_dirs,
+)
 
 
 # Check driver files
@@ -921,29 +953,35 @@ test(
 )
 
 if augparse_prog.found()
-  test(
-    'check-augeas',
-    check_augeas_prog,
-    args: [
-      augparse_prog.path(),
-      meson.current_source_dir(),
-      meson.current_build_dir(),
-      augeas_test_data,
-    ],
-  )
+  foreach data : augeas_test_data
+    test(
+      'check-augeas-@0@'.format(data['name']),
+      augparse_prog,
+      args: [
+        '-I', meson.current_source_dir(),
+        '-I', meson.current_build_dir(),
+        data['file'].full_path(),
+      ],
+    )
+  endforeach
 endif
 
-if pdwtags_prog.found()
+if pdwtags_prog.found() and cc.get_id() != 'clang'
   foreach proto : check_protocols
+    lib = proto['lib']
     test(
       'check-@0@'.format(proto['name']),
       python3_prog,
       args: [
-        check_remote_protocol_prog.path(), proto['name'], proto['libname'],
-        proto['builddir'], pdwtags_prog.path(), files('@0@-structs'.format(proto['name'])),
+        check_remote_protocol_prog.path(),
+        proto['name'],
+        lib.name(),
+        lib.full_path(),
+        pdwtags_prog.path(),
+        files('@0@-structs'.format(proto['name'])),
       ],
       env: runutf8,
-      depends: proto['depends'],
+      depends: [ lib ],
     )
   endforeach
 endif
diff --git a/src/network/meson.build b/src/network/meson.build
index a3836bb12be..2e031e811fc 100644
--- a/src/network/meson.build
+++ b/src/network/meson.build
@@ -51,7 +51,6 @@ if conf.has('WITH_NETWORK')
 
   virt_daemon_confs += {
     'name': 'virtnetworkd',
-    'name_uc': 'Virtnetworkd',
   }
 
   virt_helpers += {
@@ -114,7 +113,7 @@ if conf.has('WITH_NETWORK')
   endif
 
   meson.add_install_script(
-    install_symlink_prog.path(),
+    meson_python_prog.path(), python3_prog.path(), meson_install_symlink_prog.path(),
     confdir / 'qemu' / 'networks' / 'autostart',
     '../default.xml', 'default.xml',
   )
diff --git a/src/node_device/meson.build b/src/node_device/meson.build
index d833b329da4..5953c6b8ed6 100644
--- a/src/node_device/meson.build
+++ b/src/node_device/meson.build
@@ -53,7 +53,6 @@ if conf.has('WITH_NODE_DEVICES')
 
   virt_daemon_confs += {
     'name': 'virtnodedevd',
-    'name_uc': 'Virtnodedevd',
   }
 
   virt_daemon_units += {
diff --git a/src/nwfilter/meson.build b/src/nwfilter/meson.build
index 6e9734e6a26..dcdc30f3731 100644
--- a/src/nwfilter/meson.build
+++ b/src/nwfilter/meson.build
@@ -47,7 +47,6 @@ if conf.has('WITH_NWFILTER')
 
   virt_daemon_confs += {
     'name': 'virtnwfilterd',
-    'name_uc': 'Virtnwfilterd',
   }
 
   virt_daemon_units += {
diff --git a/src/qemu/meson.build b/src/qemu/meson.build
index 640ef273ca8..644d74479b2 100644
--- a/src/qemu/meson.build
+++ b/src/qemu/meson.build
@@ -67,7 +67,10 @@ if conf.has('WITH_DTRACE_PROBES')
     out_stp,
     input: infile,
     output: out_stp,
-    command: [ meson_python_prog, dtrace2systemtap_prog, bindir, sbindir, libdir, '@INPUT@' ],
+    command: [
+      meson_python_prog, python3_prog.path(), dtrace2systemtap_prog.path(),
+      bindir, sbindir, libdir, '@INPUT@',
+    ],
     capture: true,
     install: conf.has('WITH_QEMU'),
     install_dir: systemtap_dir,
@@ -90,6 +93,7 @@ if conf.has('WITH_QEMU')
       capng_dep,
       gnutls_dep,
       libnl_dep,
+      log_dep,
       selinux_dep,
       src_dep,
       xdr_dep,
@@ -139,7 +143,6 @@ if conf.has('WITH_QEMU')
 
   virt_daemon_confs += {
     'name': 'virtqemud',
-    'name_uc': 'Virtqemud',
   }
 
   virt_daemon_units += {
diff --git a/src/remote/meson.build b/src/remote/meson.build
index 130d246fcec..25712c943b7 100644
--- a/src/remote/meson.build
+++ b/src/remote/meson.build
@@ -65,30 +65,49 @@ foreach name : [ 'remote', 'qemu', 'lxc' ]
   )
 endforeach
 
+# libvirt_conf_files:
+#   Generate libvirtd and virtd template files that are used to generate
+#   daemon configuration files.
+#   Each entry is a dictionary with following items:
+#   * input: source config file (required)
+#   * libvirtd: libvirtd config output template file (required)
+#   * virtd: virtd config output template file (required)
 libvirt_conf_files = [
-  [ 'libvirtd.conf.in', 'libvirtd.conf.tmp', 'virtd.conf.tmp' ],
-  [ 'libvirtd.aug.in', 'libvirtd.aug.tmp', 'virtd.aug.tmp' ],
-  [ 'test_libvirtd.aug.in', 'test_libvirtd.aug.tmp', 'test_virtd.aug.tmp' ],
+  {
+    'input':'libvirtd.conf.in',
+    'libvirtd':'libvirtd.conf.tmp',
+    'virtd':'virtd.conf.tmp',
+  },
+  {
+    'input':'libvirtd.aug.in',
+    'libvirtd':'libvirtd.aug.tmp',
+    'virtd':'virtd.aug.tmp',
+  },
+  {
+    'input':'test_libvirtd.aug.in',
+    'libvirtd':'test_libvirtd.aug.tmp',
+    'virtd':'test_virtd.aug.tmp',
+  },
 ]
 
 foreach name : libvirt_conf_files
   tmp = configure_file(
-    input: name[0],
-    output: name[1],
+    input: name['input'],
+    output: name['libvirtd'],
     command: [ 'sed', '-e', '/[@]CUT_ENABLE_IP[@]/d', '-e', '/[@]END[@]/d', '@INPUT@' ],
     capture: true,
   )
-  set_variable(name[1].underscorify(), tmp)
+  set_variable(name['libvirtd'].underscorify(), tmp)
 endforeach
 
 foreach name : libvirt_conf_files
   tmp = configure_file(
-    input: name[0],
-    output: name[2],
+    input: name['input'],
+    output: name['virtd'],
     command: [ 'sed', '-e', '/[@]CUT_ENABLE_IP[@]/,/[@]END[@]/d', '@INPUT@' ],
     capture: true,
   )
-  set_variable(name[2].underscorify(), tmp)
+  set_variable(name['virtd'].underscorify(), tmp)
 endforeach
 
 libvirtd_socket_unit_files = [
@@ -128,23 +147,17 @@ if conf.has('WITH_REMOTE')
 
   check_protocols += {
     'name': 'remote_protocol',
-    'libname': 'virt_remote_driver',
-    'builddir': meson.current_build_dir(),
-    'depends': remote_driver_lib,
+    'lib': remote_driver_lib,
   }
 
   check_protocols += {
     'name': 'qemu_protocol',
-    'libname': 'virt_remote_driver',
-    'builddir': meson.current_build_dir(),
-    'depends': remote_driver_lib,
+    'lib': remote_driver_lib,
   }
 
   check_protocols += {
     'name': 'lxc_protocol',
-    'libname': 'virt_remote_driver',
-    'builddir': meson.current_build_dir(),
-    'depends': remote_driver_lib,
+    'lib': remote_driver_lib,
   }
 
   libvirt_libs += remote_driver_lib
@@ -164,7 +177,6 @@ if conf.has('WITH_REMOTE')
 
     virt_daemon_confs += {
       'name': 'libvirtd',
-      'name_uc': 'Libvirtd',
       'with_ip': true,
     }
 
@@ -199,7 +211,6 @@ if conf.has('WITH_REMOTE')
 
     virt_daemon_confs += {
       'name': 'virtproxyd',
-      'name_uc': 'Virtproxyd',
       'with_ip': true,
     }
 
diff --git a/src/rpc/meson.build b/src/rpc/meson.build
index 18ea0602602..e249b9d534b 100644
--- a/src/rpc/meson.build
+++ b/src/rpc/meson.build
@@ -83,16 +83,12 @@ virt_rpc_lib = static_library(
 
 check_protocols += {
   'name': 'virnetprotocol',
-  'libname': 'virt_net_rpc',
-  'builddir': meson.current_build_dir(),
-  'depends': virt_rpc_lib,
+  'lib': virt_rpc_lib,
 }
 
 check_protocols += {
   'name': 'virkeepaliveprotocol',
-  'libname': 'virt_net_rpc',
-  'builddir': meson.current_build_dir(),
-  'depends': virt_rpc_lib,
+  'lib': virt_rpc_lib,
 }
 
 virt_rpc_server_lib = static_library(
diff --git a/src/secret/meson.build b/src/secret/meson.build
index 1605729f49b..d576d3218eb 100644
--- a/src/secret/meson.build
+++ b/src/secret/meson.build
@@ -29,7 +29,6 @@ if conf.has('WITH_SECRETS')
 
   virt_daemon_confs += {
     'name': 'virtsecretd',
-    'name_uc': 'Virtsecretd',
   }
 
   virt_daemon_units += {
diff --git a/src/storage/meson.build b/src/storage/meson.build
index 86abfedbdde..18ea0f3fb51 100644
--- a/src/storage/meson.build
+++ b/src/storage/meson.build
@@ -127,7 +127,6 @@ if conf.has('WITH_STORAGE')
 
   virt_daemon_confs += {
     'name': 'virtstoraged',
-    'name_uc': 'Virtstoraged',
   }
 
   virt_daemon_units += {
diff --git a/src/util/meson.build b/src/util/meson.build
index af60283cbc7..a7017f459f6 100644
--- a/src/util/meson.build
+++ b/src/util/meson.build
@@ -144,7 +144,7 @@ foreach name : keycode_list
     input: keymap_src_file,
     output: 'virkeycodetable_@0@.h'.format(name),
     command: [
-      meson_python_prog, python3_prog, keymap_gen_prog, 'code-table',
+      meson_python_prog, python3_prog.path(), keymap_gen_prog.path(), 'code-table',
       '--lang', 'stdc',
       '--varname', 'virKeyCodeTable_@0@'.format(name),
       '@INPUT@', name,
@@ -159,7 +159,7 @@ foreach name : keyname_list
     input: keymap_src_file,
     output: 'virkeynametable_@0@.h'.format(name),
     command: [
-      meson_python_prog, python3_prog, keymap_gen_prog, 'name-table',
+      meson_python_prog, python3_prog.path(), keymap_gen_prog.path(), 'name-table',
       '--lang', 'stdc',
       '--varname', 'virKeyNameTable_@0@'.format(name),
       '@INPUT@', name,
diff --git a/src/util/virfile.c b/src/util/virfile.c
index 5ec43832461..c6f4a18a7a8 100644
--- a/src/util/virfile.c
+++ b/src/util/virfile.c
@@ -1782,32 +1782,17 @@ virFileFindResource(const char *filename,
  * virFileActivateDirOverrideForProg:
  * @argv0: argv[0] of the calling program
  *
- * Combine $PWD and @argv0, canonicalize it and check if abs_top_builddir
+ * Canonicalize current process path from argv0 and check if abs_top_builddir
  * matches as prefix in the path.
  */
 void
 virFileActivateDirOverrideForProg(const char *argv0)
 {
-    const char *pwd = g_getenv("PWD");
-    g_autofree char *fullPath = NULL;
-    g_autofree char *canonPath = NULL;
-    const char *path = NULL;
+    g_autofree char *path = virFileCanonicalizePath(argv0);
 
-    if (!pwd)
+    if (!path) {
+        VIR_DEBUG("Failed to get canonicalized path errno=%d", errno);
         return;
-
-    if (argv0[0] != '/') {
-        fullPath = g_strdup_printf("%s/%s", pwd, argv0);
-        canonPath = virFileCanonicalizePath(fullPath);
-
-        if (!canonPath) {
-            VIR_DEBUG("Failed to get canonicalized path errno=%d", errno);
-            return;
-        }
-
-        path = canonPath;
-    } else {
-        path = argv0;
     }
 
     if (STRPREFIX(path, abs_top_builddir)) {
diff --git a/src/util/virlog.h b/src/util/virlog.h
index feb2f859041..716fb9a3783 100644
--- a/src/util/virlog.h
+++ b/src/util/virlog.h
@@ -78,29 +78,8 @@ struct _virLogSource {
         .serial = 0, \
     }
 
-/*
- * If configured with --enable-debug=yes then library calls
- * are printed to stderr for debugging or to an appropriate channel
- * defined at runtime from the libvirt daemon configuration file
- */
-#ifdef ENABLE_DEBUG
-# define VIR_DEBUG_INT(src, filename, linenr, funcname, ...) \
+#define VIR_DEBUG_INT(src, filename, linenr, funcname, ...) \
     virLogMessage(src, VIR_LOG_DEBUG, filename, linenr, funcname, NULL, __VA_ARGS__)
-#else
-/**
- * virLogEatParams:
- *
- * Do nothing but eat parameters.
- */
-static inline void virLogEatParams(virLogSourcePtr unused, ...)
-{
-    /* Silence gcc */
-    unused = unused;
-}
-# define VIR_DEBUG_INT(src, filename, linenr, funcname, ...) \
-    virLogEatParams(src, filename, linenr, funcname, __VA_ARGS__)
-#endif /* !ENABLE_DEBUG */
-
 #define VIR_INFO_INT(src, filename, linenr, funcname, ...) \
     virLogMessage(src, VIR_LOG_INFO, filename, linenr, funcname, NULL, __VA_ARGS__)
 #define VIR_WARN_INT(src, filename, linenr, funcname, ...) \
diff --git a/src/vbox/meson.build b/src/vbox/meson.build
index 8451e3018be..3e608fa1018 100644
--- a/src/vbox/meson.build
+++ b/src/vbox/meson.build
@@ -54,7 +54,6 @@ if conf.has('WITH_VBOX')
 
   virt_daemon_confs += {
     'name': 'virtvboxd',
-    'name_uc': 'Virtvboxd',
   }
 
   virt_daemon_units += {
diff --git a/src/vz/meson.build b/src/vz/meson.build
index 0ab83731071..2859dc79793 100644
--- a/src/vz/meson.build
+++ b/src/vz/meson.build
@@ -44,7 +44,6 @@ if conf.has('WITH_VZ')
 
   virt_daemon_confs += {
     'name': 'virtvzd',
-    'name_uc': 'Virtvzd',
   }
 
   virt_daemon_units += {
diff --git a/tests/meson.build b/tests/meson.build
index 1510d6ef3f3..b5f6e2267aa 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -240,38 +240,48 @@ executable(
 #   * deps - additional dependencies (optional, default [])
 #   * include - include_directories (optional, default [])
 #   * link_with - compiled libraries to link with (optional, default [])
+#   * link_whole - compiled libraries to link whole (optional, default [])
+
 tests = []
 
 cputest_link_with = []
+cputest_link_whole = []
 if conf.has('WITH_QEMU')
-  cputest_link_with += [ test_utils_qemu_lib, test_utils_qemu_monitor_lib, test_qemu_driver_lib ]
+  cputest_link_with += [ test_utils_qemu_monitor_lib, test_qemu_driver_lib ]
+  cputest_link_whole += [ test_utils_qemu_lib ]
 endif
 
-domaincapstest_link_with = [ test_file_wrapper_lib ]
+domaincapstest_link_with = []
+domaincapstest_link_whole = [ test_file_wrapper_lib ]
 if conf.has('WITH_BHYVE')
   domaincapstest_link_with += [ bhyve_driver_impl ]
 endif
 if conf.has('WITH_LIBXL')
-  domaincapstest_link_with += [ test_utils_xen_lib, test_xen_driver_lib ]
+  domaincapstest_link_with += [ test_xen_driver_lib ]
+  domaincapstest_link_whole += [ test_utils_xen_lib ]
 endif
 if conf.has('WITH_QEMU')
-  domaincapstest_link_with += [ test_utils_qemu_lib, test_qemu_driver_lib ]
+  domaincapstest_link_with += [ test_qemu_driver_lib ]
+  domaincapstest_link_whole += [ test_utils_qemu_lib ]
 endif
 
 vircapstest_link_with = []
+vircapstest_link_whole = []
 vircapstest_sources = [ 'vircapstest.c' ]
 if conf.has('WITH_LXC')
-  vircapstest_link_with += [ test_utils_lxc_lib, lxc_driver_impl_lib ]
+  vircapstest_link_with += [ lxc_driver_impl_lib ]
+  vircapstest_link_whole += [ test_utils_lxc_lib ]
 endif
 if conf.has('WITH_QEMU')
-  vircapstest_link_with += [ test_utils_qemu_lib, qemu_driver_impl ]
+  vircapstest_link_with += [ qemu_driver_impl ]
+  vircapstest_link_whole += [ test_utils_qemu_lib ]
   vircapstest_sources += [ qemu_dtrace_gen_objects ]
 endif
 
 tests += [
   { 'name': 'commandtest' },
-  { 'name': 'cputest', 'link_with': cputest_link_with },
-  { 'name': 'domaincapstest', 'link_with': domaincapstest_link_with },
+  { 'name': 'cputest', 'link_with': cputest_link_with, 'link_whole': cputest_link_whole },
+  { 'name': 'domaincapstest', 'link_with': domaincapstest_link_with, 'link_whole': domaincapstest_link_whole },
   { 'name': 'domainconftest' },
   { 'name': 'genericxml2xmltest' },
   { 'name': 'interfacexml2xmltest' },
@@ -291,7 +301,7 @@ tests += [
   { 'name': 'virauthconfigtest' },
   { 'name': 'virbitmaptest' },
   { 'name': 'virbuftest' },
-  { 'name': 'vircapstest', 'sources': vircapstest_sources, 'link_with': vircapstest_link_with },
+  { 'name': 'vircapstest', 'sources': vircapstest_sources, 'link_with': vircapstest_link_with, 'link_whole': vircapstest_link_whole },
   { 'name': 'vircgrouptest' },
   { 'name': 'virconftest' },
   { 'name': 'vircryptotest' },
@@ -301,7 +311,7 @@ tests += [
   { 'name': 'virfiletest' },
   { 'name': 'virfirewalltest', 'deps': [ dbus_dep ] },
   { 'name': 'virhashtest' },
-  { 'name': 'virhostcputest', 'link_with': [ test_file_wrapper_lib ] },
+  { 'name': 'virhostcputest', 'link_whole': [ test_file_wrapper_lib ] },
   { 'name': 'virhostdevtest' },
   { 'name': 'viriscsitest' },
   { 'name': 'virkeycodetest' },
@@ -327,9 +337,9 @@ if host_machine.system() == 'linux'
   tests += [
     { 'name': 'fchosttest' },
     { 'name': 'scsihosttest' },
-    { 'name': 'vircaps2xmltest', 'link_with': [ test_file_wrapper_lib ] },
+    { 'name': 'vircaps2xmltest', 'link_whole': [ test_file_wrapper_lib ] },
     { 'name': 'virnetdevbandwidthtest' },
-    { 'name': 'virresctrltest', 'link_with': [ test_file_wrapper_lib ] },
+    { 'name': 'virresctrltest', 'link_whole': [ test_file_wrapper_lib ] },
     { 'name': 'virscsitest' },
     { 'name': 'virusbtest' },
   ]
@@ -358,7 +368,7 @@ endif
 
 if conf.has('WITH_ESX')
   tests += [
-    { 'name': 'esxutilstest', 'include': [ esx_inc_dir ], 'deps': [ dbus_dep ] },
+    { 'name': 'esxutilstest', 'include': [ esx_inc_dir ] },
   ]
 endif
 
@@ -373,16 +383,16 @@ endif
 
 if conf.has('WITH_LIBXL')
   tests += [
-    { 'name': 'libxlxml2domconfigtest', 'link_with': [ test_utils_xen_lib, test_xen_driver_lib ], 'deps': [ libxl_dep ] },
-    { 'name': 'xlconfigtest', 'link_with': [ test_utils_xen_lib, test_xen_driver_lib ] },
-    { 'name': 'xmconfigtest', 'link_with': [ test_utils_xen_lib, test_xen_driver_lib ] },
+    { 'name': 'libxlxml2domconfigtest', 'link_with': [ test_xen_driver_lib ], 'link_whole': [ test_utils_xen_lib ], 'deps': [ libxl_dep ] },
+    { 'name': 'xlconfigtest', 'link_with': [ test_xen_driver_lib ], 'link_whole': [ test_utils_xen_lib ] },
+    { 'name': 'xmconfigtest', 'link_with': [ test_xen_driver_lib ], 'link_whole': [ test_utils_xen_lib ] },
   ]
 endif
 
 if conf.has('WITH_LXC')
   tests += [
-    { 'name': 'lxcconf2xmltest', 'link_with': [ test_utils_lxc_lib, lxc_driver_impl_lib ] },
-    { 'name': 'lxcxml2xmltest', 'link_with': [ test_utils_lxc_lib, lxc_driver_impl_lib ] },
+    { 'name': 'lxcconf2xmltest', 'link_with': [ lxc_driver_impl_lib ], 'link_whole': [ test_utils_lxc_lib ] },
+    { 'name': 'lxcxml2xmltest', 'link_with': [ lxc_driver_impl_lib ], 'link_whole': [ test_utils_lxc_lib ] },
   ]
 endif
 
@@ -432,22 +442,22 @@ endif
 
 if conf.has('WITH_QEMU')
   tests += [
-    { 'name': 'qemuagenttest', 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib, test_utils_qemu_monitor_lib ] },
-    { 'name': 'qemublocktest', 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib, test_utils_qemu_monitor_lib ] },
-    { 'name': 'qemucapabilitiestest', 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib, test_utils_qemu_monitor_lib ] },
-    { 'name': 'qemucaps2xmltest', 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib ] },
-    { 'name': 'qemucommandutiltest', 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib, test_utils_qemu_monitor_lib ] },
-    { 'name': 'qemudomaincheckpointxml2xmltest', 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib ] },
-    { 'name': 'qemudomainsnapshotxml2xmltest', 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib ] },
-    { 'name': 'qemufirmwaretest', 'link_with': [ test_qemu_driver_lib, test_file_wrapper_lib ] },
-    { 'name': 'qemuhotplugtest', 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib, test_utils_qemu_monitor_lib ] },
-    { 'name': 'qemumemlocktest', 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib ] },
-    { 'name': 'qemumigparamstest', 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib, test_utils_qemu_monitor_lib ] },
-    { 'name': 'qemumonitorjsontest', 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib, test_utils_qemu_monitor_lib ] },
-    { 'name': 'qemusecuritytest', 'sources': [ 'qemusecuritytest.c', 'qemusecuritymock.c' ], 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib ] },
-    { 'name': 'qemuvhostusertest', 'link_with': [ test_qemu_driver_lib, test_file_wrapper_lib ] },
-    { 'name': 'qemuxml2argvtest', 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib, test_utils_qemu_monitor_lib, test_file_wrapper_lib ] },
-    { 'name': 'qemuxml2xmltest', 'link_with': [ test_utils_qemu_lib, test_qemu_driver_lib, test_file_wrapper_lib ] },
+    { 'name': 'qemuagenttest', 'link_with': [ test_qemu_driver_lib, test_utils_qemu_monitor_lib ], 'link_whole': [ test_utils_qemu_lib ] },
+    { 'name': 'qemublocktest', 'link_with': [ test_qemu_driver_lib, test_utils_qemu_monitor_lib ], 'link_whole': [ test_utils_qemu_lib ] },
+    { 'name': 'qemucapabilitiestest', 'link_with': [ test_qemu_driver_lib, test_utils_qemu_monitor_lib ], 'link_whole': [ test_utils_qemu_lib ] },
+    { 'name': 'qemucaps2xmltest', 'link_with': [ test_qemu_driver_lib ], 'link_whole': [ test_utils_qemu_lib ] },
+    { 'name': 'qemucommandutiltest', 'link_with': [ test_qemu_driver_lib, test_utils_qemu_monitor_lib ], 'link_whole': [ test_utils_qemu_lib ] },
+    { 'name': 'qemudomaincheckpointxml2xmltest', 'link_with': [ test_qemu_driver_lib ], 'link_whole': [ test_utils_qemu_lib ] },
+    { 'name': 'qemudomainsnapshotxml2xmltest', 'link_with': [ test_qemu_driver_lib ], 'link_whole': [ test_utils_qemu_lib ] },
+    { 'name': 'qemufirmwaretest', 'link_with': [ test_qemu_driver_lib ], 'link_whole': [ test_file_wrapper_lib ] },
+    { 'name': 'qemuhotplugtest', 'link_with': [ test_qemu_driver_lib, test_utils_qemu_monitor_lib ], 'link_whole': [ test_utils_qemu_lib ] },
+    { 'name': 'qemumemlocktest', 'link_with': [ test_qemu_driver_lib ], 'link_whole': [ test_utils_qemu_lib ] },
+    { 'name': 'qemumigparamstest', 'link_with': [ test_qemu_driver_lib, test_utils_qemu_monitor_lib ], 'link_whole': [ test_utils_qemu_lib ] },
+    { 'name': 'qemumonitorjsontest', 'link_with': [ test_qemu_driver_lib, test_utils_qemu_monitor_lib ], 'link_whole': [ test_utils_qemu_lib ] },
+    { 'name': 'qemusecuritytest', 'sources': [ 'qemusecuritytest.c', 'qemusecuritymock.c' ], 'link_with': [ test_qemu_driver_lib ], 'link_whole': [ test_utils_qemu_lib ] },
+    { 'name': 'qemuvhostusertest', 'link_with': [ test_qemu_driver_lib ], 'link_whole': [ test_file_wrapper_lib ] },
+    { 'name': 'qemuxml2argvtest', 'link_with': [ test_qemu_driver_lib, test_utils_qemu_monitor_lib ], 'link_whole': [ test_utils_qemu_lib, test_file_wrapper_lib ] },
+    { 'name': 'qemuxml2xmltest', 'link_with': [ test_qemu_driver_lib ], 'link_whole': [ test_utils_qemu_lib, test_file_wrapper_lib ] },
   ]
 endif
 
@@ -481,7 +491,7 @@ if conf.has('WITH_SECDRIVER_SELINUX')
 
     if conf.has('WITH_QEMU')
       tests += [
-        { 'name': 'securityselinuxlabeltest', 'link_with': [ test_utils_qemu_lib ] },
+        { 'name': 'securityselinuxlabeltest', 'link_whole': [ test_utils_qemu_lib ] },
       ]
     endif
   endif
@@ -559,9 +569,12 @@ foreach data : tests
     ],
     link_with: [
       libvirt_lib,
-      test_utils_lib,
       data.get('link_with', []),
     ],
+    link_whole: [
+      test_utils_lib,
+      data.get('link_whole', []),
+    ],
     export_dynamic: true,
   )
   test(data['name'], test_bin, env: tests_env)
@@ -670,8 +683,9 @@ add_test_setup(
   'access',
   env: [
     'VIR_TEST_FILE_ACCESS=1',
+    runutf8,
   ],
-  exe_wrapper: [ meson_python_prog, check_file_access_prog ],
+  exe_wrapper: [ python3_prog, check_file_access_prog.path() ],
 )
 
 add_test_setup(
@@ -682,5 +696,6 @@ add_test_setup(
     '--suppressions=@0@'.format(meson.current_source_dir() / '.valgrind.supp'),
     '--error-exitcode=1',
   ],
+  # default timeout in meson is 30s
   timeout_multiplier: 4,
 )
diff --git a/tests/virmockstathelpers.c b/tests/virmockstathelpers.c
index ba26e7bd455..2c3715ae0cc 100644
--- a/tests/virmockstathelpers.c
+++ b/tests/virmockstathelpers.c
@@ -38,12 +38,13 @@
  *
  * On 32-bit hosts they refer to the 32-bit & 64-bit ABIs respectively.
  *
- * Libvirt uses _FILE_OFFSET_BITS=64 on 32-bit hosts, which causes the
- * C library to transparently rewrite stat() calls to be stat64() calls.
- * Libvirt will never see the 32-bit ABI from the traditional stat()
- * call. We cannot assume this rewriting is done using a macro. It might
- * be, but on GLibC it is done with a magic __asm__ statement to apply
- * the rewrite at link time instead of at preprocessing.
+ * With meson libvirt will have _FILE_OFFSET_BITS=64 always defined.
+ * On 32-bit hosts it causes the C library to transparently rewrite
+ * stat() calls to be stat64() calls. Libvirt will never see the 32-bit
+ * ABI from the traditional stat() call. We cannot assume this rewriting
+ * is done using a macro. It might be, but on GLibC it is done with a
+ * magic __asm__ statement to apply the rewrite at link time instead of
+ * at preprocessing.
  *
  * In GLibC there may be two additional functions exposed by the headers,
  * __xstat() and __xstat64(). When these exist, stat() and stat64() are
@@ -57,14 +58,7 @@
  * With all this in mind the list of functions we have to mock will depend
  * on several factors
  *
- *  - If _FILE_OFFSET_BITS is set, then we are on a 32-bit host, and we
- *    only need to mock stat64 and __xstat64. The other stat / __xstat
- *    functions exist, but we'll never call them so they can be ignored
- *    for mocking.
- *
- *  - If _FILE_OFFSET_BITS is not set, then we are on a 64-bit host and
- *    we should mock stat, stat64, __xstat & __xstat64. Either may be
- *    called by app code.
+ *  - If the stat or __xstat but there is no 64-bit version.
  *
  *  - If __xstat & __xstat64 exist, then stat & stat64 will not exist
  *    as symbols in the library, so the latter should not be mocked.
@@ -74,25 +68,25 @@
 
 
 
-#if defined(HAVE_STAT) && !defined(HAVE___XSTAT) && !defined(_FILE_OFFSET_BITS)
+#if defined(HAVE_STAT) && !defined(HAVE___XSTAT) && !defined(HAVE_STAT64)
 # define MOCK_STAT
 #endif
 #if defined(HAVE_STAT64) && !defined(HAVE___XSTAT64)
 # define MOCK_STAT64
 #endif
-#if defined(HAVE___XSTAT) && !defined(_FILE_OFFSET_BITS)
+#if defined(HAVE___XSTAT) && !defined(HAVE___XSTAT64)
 # define MOCK___XSTAT
 #endif
 #if defined(HAVE___XSTAT64)
 # define MOCK___XSTAT64
 #endif
-#if defined(HAVE_LSTAT) && !defined(HAVE___LXSTAT) && !defined(_FILE_OFFSET_BITS)
+#if defined(HAVE_LSTAT) && !defined(HAVE___LXSTAT) && !defined(HAVE_LSTAT64)
 # define MOCK_LSTAT
 #endif
 #if defined(HAVE_LSTAT64) && !defined(HAVE___LXSTAT64)
 # define MOCK_LSTAT64
 #endif
-#if defined(HAVE___LXSTAT) && !defined(_FILE_OFFSET_BITS)
+#if defined(HAVE___LXSTAT) && !defined(HAVE___LXSTAT64)
 # define MOCK___LXSTAT
 #endif
 #if defined(HAVE___LXSTAT64)
diff --git a/tests/virt-aa-helper-test b/tests/virt-aa-helper-test
index 8dbe82a6b98..83f53acef61 100755
--- a/tests/virt-aa-helper-test
+++ b/tests/virt-aa-helper-test
@@ -15,13 +15,13 @@ fi
 
 output="/dev/null"
 use_valgrind=""
-ld_library_path="../src/"
+ld_library_path="$abs_top_builddir/src/"
 if [ ! -z "$1" ] && [ "$1" = "-d" ]; then
     output="/dev/stdout"
     shift
 fi
 
-exe="../src/virt-aa-helper"
+exe="$abs_top_builddir/src/virt-aa-helper"
 if [ ! -z "$1" ]; then
     if [ "$1" = "-v" ]; then
         use_valgrind="yes"
diff --git a/tools/bash-completion/meson.build b/tools/bash-completion/meson.build
index 4cc0892accf..8924c93adf5 100644
--- a/tools/bash-completion/meson.build
+++ b/tools/bash-completion/meson.build
@@ -1,13 +1,11 @@
 install_data('vsh', install_dir: bash_completion_dir)
 
 meson.add_install_script(
-  install_symlink_prog.path(),
-  bash_completion_dir,
-  'vsh', 'virsh',
+  meson_python_prog.path(), python3_prog.path(), meson_install_symlink_prog.path(),
+  bash_completion_dir, 'vsh', 'virsh',
 )
 
 meson.add_install_script(
-  install_symlink_prog.path(),
-  bash_completion_dir,
-  'vsh', 'virt-admin',
+  meson_python_prog.path(), python3_prog.path(), meson_install_symlink_prog.path(),
+  bash_completion_dir, 'vsh', 'virt-admin',
 )
diff --git a/tools/meson.build b/tools/meson.build
index f2c2af764b7..090179470a5 100644
--- a/tools/meson.build
+++ b/tools/meson.build
@@ -12,7 +12,11 @@ tools_dep = declare_dependency(
     util_inc_dir,
     top_inc_dir,
   ],
-  link_args: libvirt_relro + libvirt_no_indirect + libvirt_no_undefined,
+  link_args: (
+    libvirt_relro
+    + libvirt_no_indirect
+    + libvirt_no_undefined
+  ),
 )
 
 libvirt_shell_lib = static_library(
@@ -235,6 +239,7 @@ configure_file(
   configuration: tools_conf,
   install: true,
   install_dir: bindir,
+  install_mode: 'rwxrwxr-x',
 )
 
 configure_file(
@@ -243,6 +248,7 @@ configure_file(
   configuration: tools_conf,
   install: true,
   install_dir: bindir,
+  install_mode: 'rwxrwxr-x',
 )
 
 if conf.has('WITH_SANLOCK')
@@ -252,6 +258,7 @@ if conf.has('WITH_SANLOCK')
     configuration: tools_conf,
     install: true,
     install_dir: sbindir,
+    install_mode: 'rwxrwxr-x',
   )
 endif
 
@@ -261,6 +268,7 @@ configure_file(
   configuration: tools_conf,
   install: true,
   install_dir: libexecdir,
+  install_mode: 'rwxrwxr-x',
 )
 
 if init_script == 'systemd'
diff --git a/tools/virsh.c b/tools/virsh.c
index 197a90636d3..06ff5e83365 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -614,9 +614,7 @@ virshShowVersion(vshControl *ctl G_GNUC_UNUSED)
 #ifdef WITH_SECRETS
     vshPrint(ctl, " Secrets");
 #endif
-#ifdef ENABLE_DEBUG
     vshPrint(ctl, " Debug");
-#endif
 #ifdef WITH_DTRACE_PROBES
     vshPrint(ctl, " DTrace");
 #endif
diff --git a/tools/virt-admin.c b/tools/virt-admin.c
index fef0332a0d3..8a166e2c7f7 100644
--- a/tools/virt-admin.c
+++ b/tools/virt-admin.c
@@ -1277,9 +1277,7 @@ vshAdmShowVersion(vshControl *ctl G_GNUC_UNUSED)
 #ifdef WITH_LIBVIRTD
     vshPrint(ctl, " Daemon");
 #endif
-#ifdef ENABLE_DEBUG
     vshPrint(ctl, " Debug");
-#endif
 #if WITH_READLINE
     vshPrint(ctl, " Readline");
 #endif
diff --git a/tools/vsh.c b/tools/vsh.c
index b65e99cbd20..9701613924b 100644
--- a/tools/vsh.c
+++ b/tools/vsh.c
@@ -2396,6 +2396,10 @@ vshEditWriteToTempFile(vshControl *ctl, const char *doc)
 #define ACCEPTED_CHARS \
   "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-/_.:@"
 
+/* Hard-code default editor used as a fallback if not configured by
+ * VISUAL or EDITOR environment variables. */
+#define DEFAULT_EDITOR "vi"
+
 int
 vshEditFile(vshControl *ctl, const char *filename)
 {

Re: [libvirt PATCH v2] port libvirt to Meson build system

Posted by Pavel Hrdina 6 days ago
On Wed, Jul 29, 2020 at 04:38:20PM +0200, Pavel Hrdina wrote:
> The second time around I will not post the complete series as it doesn't
> make that much sense. Instead I'll post a diff between the two series to
> provide the changes between these series together with links to both
> versions pushed to gitlab repository.
> 
> Patches for v2 are available from my gitlab repository:
> 
>     git clone -b meson https://gitlab.com/phrdina/libvirt.git
> 
> and link to gitlab pipeline:
> 
>     https://gitlab.com/phrdina/libvirt/-/pipelines/172042918
> 
> Patches for v1 are available from different branch 'meson-v1' in the
> same repository. You can get the attached diff by running:
> 
>     git diff meson-v1 meson

Thanks for the review and all the feedback. I just pushed the patches to
master.

Pavel

Re: [libvirt PATCH v2] port libvirt to Meson build system

Posted by Ján Tomko 5 days ago
On a Monday in 2020, Pavel Hrdina wrote:
>On Wed, Jul 29, 2020 at 04:38:20PM +0200, Pavel Hrdina wrote:
>> The second time around I will not post the complete series as it doesn't
>> make that much sense. Instead I'll post a diff between the two series to
>> provide the changes between these series together with links to both
>> versions pushed to gitlab repository.
>>
>> Patches for v2 are available from my gitlab repository:
>>
>>     git clone -b meson https://gitlab.com/phrdina/libvirt.git
>>
>> and link to gitlab pipeline:
>>
>>     https://gitlab.com/phrdina/libvirt/-/pipelines/172042918
>>
>> Patches for v1 are available from different branch 'meson-v1' in the
>> same repository. You can get the attached diff by running:
>>
>>     git diff meson-v1 meson
>
>Thanks for the review and all the feedback. I just pushed the patches to
>master.
>

https://cirrus-ci.com/task/6453169632837632?command=build#L1177

In file included from ../tests/qemuhotplugmock.c:21:
In file included from ../src/qemu/qemu_hotplug.h:25:
In file included from ../src/qemu/qemu_domain.h:42:
../src/logging/log_manager.h:25:10: fatal error: 'logging/log_protocol.h' file not found
#include "logging/log_protocol.h"

          ^~~~~~~~~~~~~~~~~~~~~~~~

1 error generated.


There might be some dependency issue.

Jano

Re: [libvirt PATCH v2] port libvirt to Meson build system

Posted by Daniel P. Berrangé 5 days ago
On Mon, Aug 03, 2020 at 09:37:17AM +0200, Pavel Hrdina wrote:
> On Wed, Jul 29, 2020 at 04:38:20PM +0200, Pavel Hrdina wrote:
> > The second time around I will not post the complete series as it doesn't
> > make that much sense. Instead I'll post a diff between the two series to
> > provide the changes between these series together with links to both
> > versions pushed to gitlab repository.
> > 
> > Patches for v2 are available from my gitlab repository:
> > 
> >     git clone -b meson https://gitlab.com/phrdina/libvirt.git
> > 
> > and link to gitlab pipeline:
> > 
> >     https://gitlab.com/phrdina/libvirt/-/pipelines/172042918
> > 
> > Patches for v1 are available from different branch 'meson-v1' in the
> > same repository. You can get the attached diff by running:
> > 
> >     git diff meson-v1 meson
> 
> Thanks for the review and all the feedback. I just pushed the patches to
> master.

I noticed a problem in a minimal build root, doesn't auto-disable ESX
for some reason:

meson.build:1607:2: ERROR: Problem encountered: Curl is required for the ESX driver


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

Re: [libvirt PATCH v2] port libvirt to Meson build system

Posted by Jim Fehlig 1 week ago
On 7/29/20 8:38 AM, Pavel Hrdina wrote:
> - As of June 2020 we can drop library check for yal2 and use pkg-confg
>    only check because openSUSE Leap 42.3 is no longer supported by
>    libvirt and latest SLES 15 was released on 2018-07-16.

openSUSE Leap 42.3 was EOL on July 1, 2019. As for SLES15, in the meantime SP1 
and SP2 have been released and both contain pkg-config files in libyajl-devel. 
Same for openSUSE Leap 15.1 and 15.2.

Regards,
Jim

Re: [libvirt PATCH v2] port libvirt to Meson build system

Posted by Neal Gompa 1 week ago
On Wed, Jul 29, 2020 at 10:38 AM Pavel Hrdina <phrdina@redhat.com> wrote:
>
> The second time around I will not post the complete series as it doesn't
> make that much sense. Instead I'll post a diff between the two series to
> provide the changes between these series together with links to both
> versions pushed to gitlab repository.
>
> Patches for v2 are available from my gitlab repository:
>
>     git clone -b meson https://gitlab.com/phrdina/libvirt.git
>
> and link to gitlab pipeline:
>
>     https://gitlab.com/phrdina/libvirt/-/pipelines/172042918
>
> Patches for v1 are available from different branch 'meson-v1' in the
> same repository. You can get the attached diff by running:
>
>     git diff meson-v1 meson
>
>
> During review we discovered some areas that should be improved once the
> meson rewrite is merged into libvirt master:
>
> - As of June 2020 we can drop library check for yal2 and use pkg-confg
>   only check because openSUSE Leap 42.3 is no longer supported by
>   libvirt and latest SLES 15 was released on 2018-07-16.
>
>
> - It was suggested to drop README file which is just a link to
>   README.rst and with meson no longer required as it was with autotools.
>
>
> - There is a warning while building libvirt:
>
> ../tests/qemuxml2xmltest.c: In function ‘mymain’:
> ../tests/qemuxml2xmltest.c:132:1: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
>   132 | mymain(void)
>       | ^~~~~~
>
>
> - Review discovered that with meson we no longer link with
>   libnl-route-3. Meson links only with libraries that are actually
>   required and we never used any symbol from this library so it can
>   be dropped.
>
>
> - During review it was pointed out that we can refactor how meson
>   generates html files by removing meson-html-gen.py and moving the
>   logic directly to meson.
>
>
> - There was a question why we install augeas test files so we should
>   figure out if we need to install them or it can be dropped.
>
>
> Here is the list of main changes done in v2, I will not list all of them
> as it can be easily checked in the diff:
>
> - I've reordered and changed the patches to not break git bisect. Now
>   patch 'meson: remove automake specific directives' doesn't remove
>   BUILD_SOURCES because that would break running 'autogen.sh'.
>
>   Patch 'meson: m4: drop not relevant m4 files' was renamed to
>   'meson: drop remaining m4 helper files' and moved at the end of the
>   series as it would again break running 'autogen.sh'.
>
>   Patch 'meson: tests: remove '.libs' from all relevant paths' was moved
>   in the middle of the series before adding 'src' directory into meson
>   because it would break running 'make check'.
>
>   To not break git bisect we agreed that meson will fail with error
>   until the whole rewrite is done and we will have a temporary option
>   'force_incomplete_build' that will skip the error and force to run
>   meson setup.
>
>   I've added a new patch 'meson: add driver_remote option only into meson_options.txt'
>   to break circular dependency between driver_remote and libssh,
>   libssh2, sasl and xdr options to make
>   meson build -Dforce_incomplete_build work properly.
>
>
> - We started running tests on FreeBSD which discovered an issue with
>   meson build. Meson defines _FILE_OFFSET_BITS=64 all the time so I had
>   to introduce a patch that handles this issue:
>   'meson: tests: virmockstathelpers: replace check for _FILE_OFFSET_BITS'
>
>
> - All scripts except for meson-python.sh wrapper which sets environment
>   variables were converted from shell to python.
>
>
> - Removed autoconf options debug_logs, default_editor and test_suite as
>   we will not convert them to meson.
>
>
> - Introduced git_werror meson option to copy the behavior of --werror
>   option from autotools. It's not the same as with autotools but it is
>   a close compromise.
>
>
> - Fixed virt-aa-helper-test which had hard-coded path to compiled
>   virt-aa-helper binary and that failed with meson.
>
>
> - Correctly replace all SYSCONFDIR and RUNSTATEDIR in man pages files.
>
>
> - Changed the way how we run syntax-check. Instead of having single
>   target it is now part of meson test with suite label 'syntax-checl'.
>   We will not define sytax-check tests if building from tarball, only
>   if we are building from git. We use git to get list of files.
>
>
> - Fixed all issues discovered during review with linking binaries,
>   missing docs and cpu_map files, typos, etc.
>
>
> - Meson cross compile configuration files were moved to libvirt-ci.
>
> Pavel

Series LGTM.

Reviewed-by: Neal Gompa <ngompa13@gmail.com>



-- 
真実はいつも一つ!/ Always, there's only one truth!


Re: [libvirt PATCH v2] port libvirt to Meson build system

Posted by Peter Krempa 1 week ago
On Wed, Jul 29, 2020 at 16:38:20 +0200, Pavel Hrdina wrote:
> The second time around I will not post the complete series as it doesn't
> make that much sense. Instead I'll post a diff between the two series to
> provide the changes between these series together with links to both
> versions pushed to gitlab repository.

Looks like that everything I've required is dealt with.

Since the version in the repository now correctly generates kbase files
which I've reported offline yesterday and I don't see any problem
myself:

Series

Reviewed-by: Peter Krempa <pkrempa@redhat.com>

Re: [libvirt PATCH v2] port libvirt to Meson build system

Posted by Pavel Hrdina 1 week ago
On Thu, Jul 30, 2020 at 01:19:54PM +0200, Peter Krempa wrote:
> On Wed, Jul 29, 2020 at 16:38:20 +0200, Pavel Hrdina wrote:
> > The second time around I will not post the complete series as it doesn't
> > make that much sense. Instead I'll post a diff between the two series to
> > provide the changes between these series together with links to both
> > versions pushed to gitlab repository.
> 
> Looks like that everything I've required is dealt with.
> 
> Since the version in the repository now correctly generates kbase files
> which I've reported offline yesterday and I don't see any problem
> myself:
> 
> Series
> 
> Reviewed-by: Peter Krempa <pkrempa@redhat.com>

Thanks a lot for the review, I take that the series is now somehow ready
to be pushed. Since I'll be pushing it right after the release is done
there is still some time for others to take a look and check that
everything is OK.

With the fix for generated kbase files the gitlab ci discovered a
race-condition with come generated header files. libvirt_driver.a static
library includes "rpc/virnetprotocol.h" in libvirt-stream.c but that
header file is generated during build time so we need to add a 'rpc_dep'
dependency to make sure that the header file is generated before
building this library.

There was a similar issue with virt_daemons where we indirectly include
"admin/admin_protocol.h" which is also generated at build time so we
need to add 'admin_dep'.

I've already pushed that fix into gitlab and the CI works correctly now.

Looking forward to finally have this huge task done \o/.

Re: [libvirt PATCH v2] port libvirt to Meson build system

Posted by Michal Privoznik 1 week ago
On 7/29/20 4:38 PM, Pavel Hrdina wrote:
 >

Maybe this was discussed already, but if not: do we want to have a 
script that would bundle meson + ninja commands, so that we could just 
"./build_and_dont_bother_me.sh". The advantage would be that we could 
set some defaults, just like we're doing for autogen.sh with "--system".

Michal

Re: [libvirt PATCH v2] port libvirt to Meson build system

Posted by Pavel Hrdina 1 week ago
On Wed, Jul 29, 2020 at 05:32:45PM +0200, Michal Privoznik wrote:
> On 7/29/20 4:38 PM, Pavel Hrdina wrote:
> >
> 
> Maybe this was discussed already, but if not: do we want to have a script
> that would bundle meson + ninja commands, so that we could just
> "./build_and_dont_bother_me.sh". The advantage would be that we could set
> some defaults, just like we're doing for autogen.sh with "--system".

When I was looking into this topic I found that some projects have
configure which is a shell script that calls meson setup and Makefile
which calls ninja -C build. Other projects switched completely and
removed all files related to autotools, automake, shell, make.

I don't think there is a need for such script as developers usually have
their own scripts to build projects. And for the --system option that
one is actually ported to meson, you can use it like this:

    meson build -Dsystem=true
    ninja -C build

    ./build/src/libvirtd
    ./build/tools/virsh

Pavel