qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH for-8.0 00/30] Meson changes for QEMU 8.0
@ 2022-12-09 11:23 Paolo Bonzini
  2022-12-09 11:23 ` [PATCH 01/30] configure: remove useless write_c_skeleton Paolo Bonzini
                   ` (30 more replies)
  0 siblings, 31 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

The final bout of conversions removes the remaining compiler tests
for emulators, applies a few cleanups that are enabled by version 0.63
of Meson, and updates the documentation.

Committing this however requires first a libvirt-ci update, in order to
enable using Python 3.8/3.9 on CentOS 8 and SLES 15.  I am still working
on it but the review can start early for these patches.

A final comparison for the effort has a net negative of around 4000
lines of code, despite the growth of QEMU itself in the meanwhile:

      before                             after
--------------------------------------------------------------------------
 8647 configure                     4240 meson.build
 1296 Makefile                      1970 configure                            
  985 tests/Makefile.include         337 Makefile
  440 rules.mak                      224 scripts/meson-buildoptions.py
  379 scripts/tap-driver.pl          171 tests/Makefile.include
  287 Makefile.target                129 scripts/nsis.py
  263 tests/tcg/configure.sh         113 scripts/mtest2make.py
  129 scripts/create_config           48 scripts/undefsym.py
~5500 various Makefile fragments   ~6500 various meson.build files
--------------------------------------------------------------------------
17926 total                        13732 total

Completing the conversion took roughly two years and a lot of the complexity
in how QEMU is built is indeed essential, but I think it's agreed that:

- the disruption to the developers was minimal, and even Windows only took
  a month or so to solidify;

- there is overall feature parity for both configure/Makefile<->meson and for
  tap-driver.pl<->"meson test", but with fewer bugs and fewer (though not zero)
  workarounds required.  For Meson, the main recurring issue is probably the
  gnutls headers issue on Homebrew; see for example commit 76f67bac79f6,
  "meson: Propagate gnutls dependency to migration", 2021-04-01)

- the original target of the conversion ("make it trivial to do trivial
  things; easy to extend existing things; possible to do everything else")
  has been achieved.  New dependencies such as ninja, were introduced in
  such a way as to make them familiar to shell/Make users, and did
  provide subtle quality of life improvements (e.g. rebuild targets
  on command line changes)

New build system features since the introduction of Meson include switching
to config/targets files, custom device configuration (--with-devices-ARCH=),
the modinfo mechanism for module loading, entitlement support for
Hypervisor.framework, the preinstall tree, autogenerated parsing of the
configure command line, and cross-compilation of pc-bios/ (admittedly
not done by Meson, but not hindered either).

Big thanks to Akihiko, Alex, Daniel, Marc-André, Richard, Thomas and
everybody else that shared the work and the reviews!

Thanks,

Paolo

Paolo Bonzini (30):
  configure: remove useless write_c_skeleton
  configure: remove dead function
  configure: remove useless test
  configure: preserve qemu-ga variables
  configure: remove backwards-compatibility and obsolete options
  meson: tweak hardening options for Windows
  meson: support meson 0.64 -Doptimization=plain
  meson: require 0.63.0
  meson: use prefer_static option
  meson: remove static_kwargs
  meson: cleanup dummy-cpus.c rules
  modinfo: lookup compile_commands.json by object
  configure: remove backwards-compatibility code
  configure: test all warnings
  meson: cleanup compiler detection
  build: move glib detection and workarounds to meson
  configure: remove pkg-config functions
  configure, meson: move --enable-modules to Meson
  configure, meson: move --enable-debug-info to Meson
  meson: prepare move of QEMU_CFLAGS to meson
  build: move sanitizer tests to meson
  build: move SafeStack tests to meson
  build: move coroutine backend selection to meson
  build: move stack protector flag selection to meson
  build: move warning flag selection to meson
  build: move remaining compiler flag tests to meson
  build: move compiler version check to meson
  docs: update build system docs
  configure: do not rerun the tests with -Werror
  meson: always log qemu-iotests verbosely

 accel/meson.build                             |   9 +-
 block/meson.build                             |   1 +
 configure                                     | 760 +-----------------
 contrib/plugins/Makefile                      |   7 +-
 docs/devel/build-system.rst                   | 286 ++++---
 meson                                         |   2 +-
 meson.build                                   | 684 +++++++++++-----
 meson_options.txt                             |  13 +
 plugins/meson.build                           |   2 +-
 qga/meson.build                               |   2 +-
 scripts/meson-buildoptions.py                 |   3 +
 scripts/meson-buildoptions.sh                 |  22 +
 scripts/modinfo-collect.py                    |  23 +-
 tcg/meson.build                               |   2 +-
 tests/qemu-iotests/meson.build                |   3 +-
 tests/unit/meson.build                        |   2 +-
 ...{coroutine-win32.c => coroutine-windows.c} |   0
 util/meson.build                              |   2 +-
 18 files changed, 716 insertions(+), 1107 deletions(-)
 rename util/{coroutine-win32.c => coroutine-windows.c} (100%)

-- 
2.38.1



^ permalink raw reply	[flat|nested] 92+ messages in thread

* [PATCH 01/30] configure: remove useless write_c_skeleton
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-09 11:38   ` Peter Maydell
  2022-12-16 14:33   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 02/30] configure: remove dead function Paolo Bonzini
                   ` (29 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

This is not needed ever since QEMU stopped detecting -liberty; this
happened with the Meson switch but it is quite likely that the
library was not really necessary years before.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure | 1 -
 1 file changed, 1 deletion(-)

diff --git a/configure b/configure
index 26c7bc515468..e31d4522ea63 100755
--- a/configure
+++ b/configure
@@ -638,7 +638,6 @@ if test "$mingw32" = "yes" ; then
   EXESUF=".exe"
   # MinGW needs -mthreads for TLS and macro _MT.
   CONFIGURE_CFLAGS="-mthreads $CONFIGURE_CFLAGS"
-  write_c_skeleton;
   prefix="/qemu"
   bindir=""
   qemu_suffix=""
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 02/30] configure: remove dead function
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
  2022-12-09 11:23 ` [PATCH 01/30] configure: remove useless write_c_skeleton Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-09 11:36   ` Peter Maydell
  2022-12-16 14:33   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 03/30] configure: remove useless test Paolo Bonzini
                   ` (28 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/configure b/configure
index e31d4522ea63..543fd5a48bf0 100755
--- a/configure
+++ b/configure
@@ -210,10 +210,6 @@ version_ge () {
     done
 }
 
-glob() {
-    eval test -z '"${1#'"$2"'}"'
-}
-
 if printf %s\\n "$source_path" "$PWD" | grep -q "[[:space:]:]";
 then
   error_exit "main directory cannot contain spaces nor colons"
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 03/30] configure: remove useless test
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
  2022-12-09 11:23 ` [PATCH 01/30] configure: remove useless write_c_skeleton Paolo Bonzini
  2022-12-09 11:23 ` [PATCH 02/30] configure: remove dead function Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-09 11:34   ` Peter Maydell
  2022-12-16 14:35   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 04/30] configure: preserve qemu-ga variables Paolo Bonzini
                   ` (27 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

$cpu is derived from preprocessor defines rather than uname these days,
so do not bother using isainfo on Solaris.  Likewise do not recognize
BeOS's uname -m output.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure | 12 +-----------
 1 file changed, 1 insertion(+), 11 deletions(-)

diff --git a/configure b/configure
index 543fd5a48bf0..db2b45740449 100755
--- a/configure
+++ b/configure
@@ -337,9 +337,6 @@ for opt do
   ;;
   esac
 done
-# OS specific
-# Using uname is really, really broken.  Once we have the right set of checks
-# we can eliminate its usage altogether.
 
 # Preferred compiler:
 #  ${CC} (if set)
@@ -489,13 +486,6 @@ sunos)
   QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
 # needed for TIOCWIN* defines in termios.h
   QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
-  # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
-  # Note that this check is broken for cross-compilation: if you're
-  # cross-compiling to one of these OSes then you'll need to specify
-  # the correct CPU with the --cpu option.
-  if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
-    cpu="x86_64"
-  fi
 ;;
 haiku)
   pie="no"
@@ -559,7 +549,7 @@ case "$cpu" in
   armv*b|armv*l|arm)
     cpu="arm" ;;
 
-  i386|i486|i586|i686|i86pc|BePC)
+  i386|i486|i586|i686)
     cpu="i386"
     CPU_CFLAGS="-m32" ;;
   x32)
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 04/30] configure: preserve qemu-ga variables
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (2 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 03/30] configure: remove useless test Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-12  7:52   ` Marc-André Lureau
  2022-12-16 14:39   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 05/30] configure: remove backwards-compatibility and obsolete options Paolo Bonzini
                   ` (26 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

Ensure that qemu-ga variables set at configure time are kept
later when the script is rerun.  For preserve_env to work,
the variables need to be empty so move the default values
to config-host.mak generation.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure | 23 ++++++-----------------
 1 file changed, 6 insertions(+), 17 deletions(-)

diff --git a/configure b/configure
index db2b45740449..4d14ff9c319c 100755
--- a/configure
+++ b/configure
@@ -2222,20 +2222,6 @@ if test "$have_ubsan" = "yes"; then
   QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
 fi
 
-##########################################
-# Guest agent Windows MSI package
-
-if test "$QEMU_GA_MANUFACTURER" = ""; then
-  QEMU_GA_MANUFACTURER=QEMU
-fi
-if test "$QEMU_GA_DISTRO" = ""; then
-  QEMU_GA_DISTRO=Linux
-fi
-if test "$QEMU_GA_VERSION" = ""; then
-    QEMU_GA_VERSION=$(cat "$source_path"/VERSION)
-fi
-
-
 #######################################
 # cross-compiled firmware targets
 
@@ -2331,9 +2317,9 @@ if test "$debug_tcg" = "yes" ; then
 fi
 if test "$mingw32" = "yes" ; then
   echo "CONFIG_WIN32=y" >> $config_host_mak
-  echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
-  echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
-  echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
+  echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER-QEMU}" >> $config_host_mak
+  echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO-Linux}" >> $config_host_mak
+  echo "QEMU_GA_VERSION=${QEMU_GA_VERSION-$(cat "$source_path"/VERSION)}" >> $config_host_mak
 else
   echo "CONFIG_POSIX=y" >> $config_host_mak
 fi
@@ -2647,6 +2633,9 @@ preserve_env PKG_CONFIG
 preserve_env PKG_CONFIG_LIBDIR
 preserve_env PKG_CONFIG_PATH
 preserve_env PYTHON
+preserve_env QEMU_GA_MANUFACTURER
+preserve_env QEMU_GA_DISTRO
+preserve_env QEMU_GA_VERSION
 preserve_env SDL2_CONFIG
 preserve_env SMBD
 preserve_env STRIP
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 05/30] configure: remove backwards-compatibility and obsolete options
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (3 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 04/30] configure: preserve qemu-ga variables Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-12  7:57   ` Marc-André Lureau
  2022-12-16 14:40   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 06/30] meson: tweak hardening options for Windows Paolo Bonzini
                   ` (25 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure | 20 --------------------
 1 file changed, 20 deletions(-)

diff --git a/configure b/configure
index 4d14ff9c319c..adfff30a6204 100755
--- a/configure
+++ b/configure
@@ -838,17 +838,6 @@ for opt do
   ;;
   --with-coroutine=*) coroutine="$optarg"
   ;;
-  --disable-zlib-test)
-  ;;
-  --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
-      echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
-  ;;
-  --enable-vhdx|--disable-vhdx)
-      echo "$0: $opt is obsolete, VHDX driver is always built" >&2
-  ;;
-  --enable-uuid|--disable-uuid)
-      echo "$0: $opt is obsolete, UUID support is always built" >&2
-  ;;
   --with-git=*) git="$optarg"
   ;;
   --with-git-submodules=*)
@@ -868,19 +857,10 @@ for opt do
   ;;
   --gdb=*) gdb_bin="$optarg"
   ;;
-  # backwards compatibility options
-  --enable-trace-backend=*) meson_option_parse "--enable-trace-backends=$optarg" "$optarg"
-  ;;
-  --disable-blobs) meson_option_parse --disable-install-blobs ""
-  ;;
   --enable-vfio-user-server) vfio_user_server="enabled"
   ;;
   --disable-vfio-user-server) vfio_user_server="disabled"
   ;;
-  --enable-tcmalloc) meson_option_parse --enable-malloc=tcmalloc tcmalloc
-  ;;
-  --enable-jemalloc) meson_option_parse --enable-malloc=jemalloc jemalloc
-  ;;
   # everything else has the same name in configure and meson
   --*) meson_option_parse "$opt" "$optarg"
   ;;
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 06/30] meson: tweak hardening options for Windows
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (4 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 05/30] configure: remove backwards-compatibility and obsolete options Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-12  8:18   ` Marc-André Lureau
  2022-12-16 14:42   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 07/30] meson: support meson 0.64 -Doptimization=plain Paolo Bonzini
                   ` (24 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

-Wl,--dynamicbase has been enabled for DLLs upstream for roughly 2
years (https://sourceware.org/bugzilla/show_bug.cgi?id=19011), and
also by some distros including Debian for 6 years even
(https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=836365), so
just enable it unconditionally.

Also add -Wl,--high-entropy-va.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 meson.build | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/meson.build b/meson.build
index 5c6b5a1c757f..d61c7a82f112 100644
--- a/meson.build
+++ b/meson.build
@@ -193,10 +193,7 @@ qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
 
 if targetos == 'windows'
   qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
-  # Disable ASLR for debug builds to allow debugging with gdb
-  if get_option('optimization') == '0'
-    qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase')
-  endif
+  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
 endif
 
 if get_option('gprof')
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 07/30] meson: support meson 0.64 -Doptimization=plain
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (5 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 06/30] meson: tweak hardening options for Windows Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-12  8:21   ` Marc-André Lureau
  2022-12-16 14:53   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 08/30] meson: require 0.63.0 Paolo Bonzini
                   ` (23 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

In Meson 0.64, the optimization built-in option now accepts the "plain" value,
which will not set any optimization flags.  While QEMU does not check the
contents of the option and therefore does not suffer any ill effect
from the new value, it uses get_option to print the optimization flags
in the summary.  Clean the code up to remove duplication, and check for
-Doptimization=plain at the same time.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 meson.build | 16 +++++++---------
 1 file changed, 7 insertions(+), 9 deletions(-)

diff --git a/meson.build b/meson.build
index d61c7a82f112..dbd0b5563446 100644
--- a/meson.build
+++ b/meson.build
@@ -3752,18 +3752,16 @@ endif
 if targetos == 'darwin'
   summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
 endif
-summary_info += {'CFLAGS':            ' '.join(get_option('c_args')
-                                               + ['-O' + get_option('optimization')]
-                                               + (get_option('debug') ? ['-g'] : []))}
+option_cflags = (get_option('debug') ? ['-g'] : [])
+if get_option('optimization') != 'plain'
+  option_cflags += ['-O' + get_option('optimization')]
+endif
+summary_info += {'CFLAGS':            ' '.join(get_option('c_args') + option_cflags)}
 if link_language == 'cpp'
-  summary_info += {'CXXFLAGS':        ' '.join(get_option('cpp_args')
-                                               + ['-O' + get_option('optimization')]
-                                               + (get_option('debug') ? ['-g'] : []))}
+  summary_info += {'CXXFLAGS':        ' '.join(get_option('cpp_args') + option_cflags)}
 endif
 if targetos == 'darwin'
-  summary_info += {'OBJCFLAGS':       ' '.join(get_option('objc_args')
-                                               + ['-O' + get_option('optimization')]
-                                               + (get_option('debug') ? ['-g'] : []))}
+  summary_info += {'OBJCFLAGS':       ' '.join(get_option('objc_args') + option_cflags)}
 endif
 link_args = get_option(link_language + '_link_args')
 if link_args.length() > 0
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 08/30] meson: require 0.63.0
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (6 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 07/30] meson: support meson 0.64 -Doptimization=plain Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-09 13:25   ` Thomas Huth
  2022-12-09 11:23 ` [PATCH 09/30] meson: use prefer_static option Paolo Bonzini
                   ` (22 subsequent siblings)
  30 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

This allows cleanups cleanups in modinfo collection and supports the
equivalent of QEMU's --static option to configure.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure   | 2 +-
 meson       | 2 +-
 meson.build | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/configure b/configure
index adfff30a6204..411dfe977958 100755
--- a/configure
+++ b/configure
@@ -1043,7 +1043,7 @@ fi
 python="$python -B"
 
 if test -z "$meson"; then
-    if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.61.5; then
+    if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.63.0; then
         meson=meson
     elif test "$git_submodules_action" != 'ignore' ; then
         meson=git
diff --git a/meson b/meson
index 3a9b285a55b9..9c6dab2cfd31 160000
--- a/meson
+++ b/meson
@@ -1 +1 @@
-Subproject commit 3a9b285a55b91b53b2acda987192274352ecb5be
+Subproject commit 9c6dab2cfd310ef2d840a2a7a479ce6b9e563b1d
diff --git a/meson.build b/meson.build
index dbd0b5563446..19b023985325 100644
--- a/meson.build
+++ b/meson.build
@@ -1,4 +1,4 @@
-project('qemu', ['c'], meson_version: '>=0.61.3',
+project('qemu', ['c'], meson_version: '>=0.63.0',
         default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto',
                           'b_staticpic=false', 'stdsplit=false', 'optimization=2', 'b_pie=true'],
         version: files('VERSION'))
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 09/30] meson: use prefer_static option
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (7 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 08/30] meson: require 0.63.0 Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-12  8:29   ` Marc-André Lureau
  2022-12-16 14:58   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 10/30] meson: remove static_kwargs Paolo Bonzini
                   ` (21 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

The option is new in Meson 0.63 and removes the need to pass "static:
true" to all dependency and find_library invocation.  Actually cleaning
up the invocations is left for a separate patch.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure                   |  4 +---
 docs/devel/build-system.rst |  3 +--
 meson.build                 | 11 ++++-------
 qga/meson.build             |  2 +-
 4 files changed, 7 insertions(+), 13 deletions(-)

diff --git a/configure b/configure
index 411dfe977958..6efc2055ce09 100755
--- a/configure
+++ b/configure
@@ -2315,9 +2315,6 @@ fi
 if test "$solaris" = "yes" ; then
   echo "CONFIG_SOLARIS=y" >> $config_host_mak
 fi
-if test "$static" = "yes" ; then
-  echo "CONFIG_STATIC=y" >> $config_host_mak
-fi
 echo "SRC_PATH=$source_path" >> $config_host_mak
 echo "TARGET_DIRS=$target_list" >> $config_host_mak
 if test "$modules" = "yes"; then
@@ -2540,6 +2537,7 @@ if test "$skip_meson" = no; then
   # Built-in options
   test "$bindir" != "bin" && meson_option_add "-Dbindir=$bindir"
   test "$default_feature" = no && meson_option_add -Dauto_features=disabled
+  test "$static" = yes && meson_option_add -Dprefer_static=true
   test "$pie" = no && meson_option_add -Db_pie=false
   test "$werror" = yes && meson_option_add -Dwerror=true
 
diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst
index 189472174340..9db18aff159e 100644
--- a/docs/devel/build-system.rst
+++ b/docs/devel/build-system.rst
@@ -311,8 +311,7 @@ dependency will be used::
   sdl_image = not_found
   if not get_option('sdl_image').auto() or have_system
     sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
-                           method: 'pkg-config',
-                           static: enable_static)
+                           method: 'pkg-config')
   endif
 
 This avoids warnings on static builds of user-mode emulators, for example.
diff --git a/meson.build b/meson.build
index 19b023985325..dced840bfbee 100644
--- a/meson.build
+++ b/meson.build
@@ -18,10 +18,7 @@ sh = find_program('sh')
 cc = meson.get_compiler('c')
 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
 enable_modules = 'CONFIG_MODULES' in config_host
-enable_static = 'CONFIG_STATIC' in config_host
-
-# Allow both shared and static libraries unless --enable-static
-static_kwargs = enable_static ? {'static': true} : {}
+static_kwargs = {}
 
 # Temporary directory used for files created while
 # configure runs. Since it is in the build directory
@@ -183,7 +180,7 @@ qemu_cflags = config_host['QEMU_CFLAGS'].split()
 qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
 qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
 
-if enable_static
+if get_option('prefer_static')
   qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
 endif
 
@@ -830,7 +827,7 @@ if targetos == 'linux' and have_tools and get_option('mpath').allowed()
                                     kwargs: static_kwargs)
   if libmpathpersist.found()
     mpathlibs += libmpathpersist
-    if enable_static
+    if get_option('prefer_static')
       mpathlibs += cc.find_library('devmapper',
                                      required: get_option('mpath'),
                                      kwargs: static_kwargs)
@@ -1214,7 +1211,7 @@ if not gnutls_crypto.found()
     # Debian has removed -lgpg-error from libgcrypt-config
     # as it "spreads unnecessary dependencies" which in
     # turn breaks static builds...
-    if gcrypt.found() and enable_static
+    if gcrypt.found() and get_option('prefer_static')
       gcrypt = declare_dependency(dependencies: [
         gcrypt,
         cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
diff --git a/qga/meson.build b/qga/meson.build
index 3cfb9166e5d8..ec67326b25f3 100644
--- a/qga/meson.build
+++ b/qga/meson.build
@@ -22,7 +22,7 @@ have_qga_vss = get_option('qga_vss') \
     Then run configure with: --extra-cxxflags="-isystem /path/to/vss/inc/win2003"''') \
   .require(midl.found() or widl.found(),
            error_message: 'VSS support requires midl or widl') \
-  .require(not enable_static,
+  .require(not get_option('prefer_static'),
            error_message: 'VSS support requires dynamic linking with GLib') \
   .allowed()
 
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 10/30] meson: remove static_kwargs
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (8 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 09/30] meson: use prefer_static option Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-12  8:32   ` Marc-André Lureau
  2022-12-16 14:59   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 11/30] meson: cleanup dummy-cpus.c rules Paolo Bonzini
                   ` (20 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

After static_kwargs has been changed to an empty dictionary, it has
no functional effect and can be removed.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 meson.build     | 212 +++++++++++++++++++-----------------------------
 tcg/meson.build |   2 +-
 2 files changed, 84 insertions(+), 130 deletions(-)

diff --git a/meson.build b/meson.build
index dced840bfbee..9ccbe0f6e4ee 100644
--- a/meson.build
+++ b/meson.build
@@ -18,7 +18,6 @@ sh = find_program('sh')
 cc = meson.get_compiler('c')
 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
 enable_modules = 'CONFIG_MODULES' in config_host
-static_kwargs = {}
 
 # Temporary directory used for files created while
 # configure runs. Since it is in the build directory
@@ -510,7 +509,7 @@ gdbus_codegen = not_found
 gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
 if not get_option('gio').auto() or have_system
   gio = dependency('gio-2.0', required: get_option('gio'),
-                   method: 'pkg-config', kwargs: static_kwargs)
+                   method: 'pkg-config')
   if gio.found() and not cc.links('''
     #include <gio/gio.h>
     int main(void)
@@ -527,7 +526,7 @@ if not get_option('gio').auto() or have_system
     gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'),
                                  required: get_option('gio'))
     gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
-                          method: 'pkg-config', kwargs: static_kwargs)
+                          method: 'pkg-config')
     gio = declare_dependency(dependencies: [gio, gio_unix],
                              version: gio.version())
   endif
@@ -540,20 +539,19 @@ endif
 lttng = not_found
 if 'ust' in get_option('trace_backends')
   lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
-                     method: 'pkg-config', kwargs: static_kwargs)
+                     method: 'pkg-config')
 endif
 pixman = not_found
 if have_system or have_tools
   pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
-                      method: 'pkg-config', kwargs: static_kwargs)
+                      method: 'pkg-config')
 endif
-zlib = dependency('zlib', required: true, kwargs: static_kwargs)
+zlib = dependency('zlib', required: true)
 
 libaio = not_found
 if not get_option('linux_aio').auto() or have_block
   libaio = cc.find_library('aio', has_headers: ['libaio.h'],
-                           required: get_option('linux_aio'),
-                           kwargs: static_kwargs)
+                           required: get_option('linux_aio'))
 endif
 
 linux_io_uring_test = '''
@@ -566,7 +564,7 @@ linux_io_uring = not_found
 if not get_option('linux_io_uring').auto() or have_block
   linux_io_uring = dependency('liburing', version: '>=0.3',
                               required: get_option('linux_io_uring'),
-                              method: 'pkg-config', kwargs: static_kwargs)
+                              method: 'pkg-config')
   if not cc.links(linux_io_uring_test)
     linux_io_uring = not_found
   endif
@@ -576,7 +574,7 @@ libnfs = not_found
 if not get_option('libnfs').auto() or have_block
   libnfs = dependency('libnfs', version: '>=1.9.3',
                       required: get_option('libnfs'),
-                      method: 'pkg-config', kwargs: static_kwargs)
+                      method: 'pkg-config')
 endif
 
 libattr_test = '''
@@ -596,8 +594,7 @@ if get_option('attr').allowed()
     libattr = declare_dependency()
   else
     libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
-                              required: get_option('attr'),
-                              kwargs: static_kwargs)
+                              required: get_option('attr'))
     if libattr.found() and not \
       cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
       libattr = not_found
@@ -632,7 +629,7 @@ seccomp_has_sysrawrc = false
 if not get_option('seccomp').auto() or have_system or have_tools
   seccomp = dependency('libseccomp', version: '>=2.3.0',
                        required: get_option('seccomp'),
-                       method: 'pkg-config', kwargs: static_kwargs)
+                       method: 'pkg-config')
   if seccomp.found()
     seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
                                                 'SCMP_FLTATR_API_SYSRAWRC',
@@ -643,8 +640,7 @@ endif
 libcap_ng = not_found
 if not get_option('cap_ng').auto() or have_system or have_tools
   libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
-                              required: get_option('cap_ng'),
-                              kwargs: static_kwargs)
+                              required: get_option('cap_ng'))
 endif
 if libcap_ng.found() and not cc.links('''
    #include <cap-ng.h>
@@ -665,13 +661,13 @@ if get_option('xkbcommon').auto() and not have_system and not have_tools
   xkbcommon = not_found
 else
   xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
-                         method: 'pkg-config', kwargs: static_kwargs)
+                         method: 'pkg-config')
 endif
 
 slirp = not_found
 if not get_option('slirp').auto() or have_system
   slirp = dependency('slirp', required: get_option('slirp'),
-                     method: 'pkg-config', kwargs: static_kwargs)
+                     method: 'pkg-config')
   # slirp < 4.7 is incompatible with CFI support in QEMU.  This is because
   # it passes function pointers within libslirp as callbacks for timers.
   # When using a system-wide shared libslirp, the type information for the
@@ -691,8 +687,7 @@ endif
 vde = not_found
 if not get_option('vde').auto() or have_system or have_tools
   vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
-                           required: get_option('vde'),
-                           kwargs: static_kwargs)
+                           required: get_option('vde'))
 endif
 if vde.found() and not cc.links('''
    #include <libvdeplug.h>
@@ -714,35 +709,35 @@ endif
 pulse = not_found
 if not get_option('pa').auto() or (targetos == 'linux' and have_system)
   pulse = dependency('libpulse', required: get_option('pa'),
-                     method: 'pkg-config', kwargs: static_kwargs)
+                     method: 'pkg-config')
 endif
 alsa = not_found
 if not get_option('alsa').auto() or (targetos == 'linux' and have_system)
   alsa = dependency('alsa', required: get_option('alsa'),
-                    method: 'pkg-config', kwargs: static_kwargs)
+                    method: 'pkg-config')
 endif
 jack = not_found
 if not get_option('jack').auto() or have_system
   jack = dependency('jack', required: get_option('jack'),
-                    method: 'pkg-config', kwargs: static_kwargs)
+                    method: 'pkg-config')
 endif
 sndio = not_found
 if not get_option('sndio').auto() or have_system
   sndio = dependency('sndio', required: get_option('sndio'),
-                    method: 'pkg-config', kwargs: static_kwargs)
+                    method: 'pkg-config')
 endif
 
 spice_protocol = not_found
 if not get_option('spice_protocol').auto() or have_system
   spice_protocol = dependency('spice-protocol', version: '>=0.12.3',
                               required: get_option('spice_protocol'),
-                              method: 'pkg-config', kwargs: static_kwargs)
+                              method: 'pkg-config')
 endif
 spice = not_found
 if not get_option('spice').auto() or have_system
   spice = dependency('spice-server', version: '>=0.12.5',
                      required: get_option('spice'),
-                     method: 'pkg-config', kwargs: static_kwargs)
+                     method: 'pkg-config')
 endif
 spice_headers = spice.partial_dependency(compile_args: true, includes: true)
 
@@ -752,13 +747,13 @@ libiscsi = not_found
 if not get_option('libiscsi').auto() or have_block
   libiscsi = dependency('libiscsi', version: '>=1.9.0',
                          required: get_option('libiscsi'),
-                         method: 'pkg-config', kwargs: static_kwargs)
+                         method: 'pkg-config')
 endif
 zstd = not_found
 if not get_option('zstd').auto() or have_block
   zstd = dependency('libzstd', version: '>=1.4.0',
                     required: get_option('zstd'),
-                    method: 'pkg-config', kwargs: static_kwargs)
+                    method: 'pkg-config')
 endif
 virgl = not_found
 
@@ -766,29 +761,25 @@ have_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found()
 if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
   virgl = dependency('virglrenderer',
                      method: 'pkg-config',
-                     required: get_option('virglrenderer'),
-                     kwargs: static_kwargs)
+                     required: get_option('virglrenderer'))
 endif
 blkio = not_found
 if not get_option('blkio').auto() or have_block
   blkio = dependency('blkio',
                      method: 'pkg-config',
-                     required: get_option('blkio'),
-                     kwargs: static_kwargs)
+                     required: get_option('blkio'))
 endif
 curl = not_found
 if not get_option('curl').auto() or have_block
   curl = dependency('libcurl', version: '>=7.29.0',
                     method: 'pkg-config',
-                    required: get_option('curl'),
-                    kwargs: static_kwargs)
+                    required: get_option('curl'))
 endif
 libudev = not_found
 if targetos == 'linux' and (have_system or have_tools)
   libudev = dependency('libudev',
                        method: 'pkg-config',
-                       required: get_option('libudev'),
-                       kwargs: static_kwargs)
+                       required: get_option('libudev'))
 endif
 
 mpathlibs = [libudev]
@@ -823,18 +814,15 @@ if targetos == 'linux' and have_tools and get_option('mpath').allowed()
           return 0;
       }'''
   libmpathpersist = cc.find_library('mpathpersist',
-                                    required: get_option('mpath'),
-                                    kwargs: static_kwargs)
+                                    required: get_option('mpath'))
   if libmpathpersist.found()
     mpathlibs += libmpathpersist
     if get_option('prefer_static')
       mpathlibs += cc.find_library('devmapper',
-                                     required: get_option('mpath'),
-                                     kwargs: static_kwargs)
+                                     required: get_option('mpath'))
     endif
     mpathlibs += cc.find_library('multipath',
-                                 required: get_option('mpath'),
-                                 kwargs: static_kwargs)
+                                 required: get_option('mpath'))
     foreach lib: mpathlibs
       if not lib.found()
         mpathlibs = []
@@ -884,8 +872,7 @@ if have_system and get_option('curses').allowed()
   curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
   curses = dependency(curses_dep_list,
                       required: false,
-                      method: 'pkg-config',
-                      kwargs: static_kwargs)
+                      method: 'pkg-config')
   msg = get_option('curses').enabled() ? 'curses library not found' : ''
   curses_compile_args = ['-DNCURSES_WIDECHAR=1']
   if curses.found()
@@ -907,8 +894,7 @@ if have_system and get_option('curses').allowed()
       curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
       foreach curses_libname : curses_libname_list
         libcurses = cc.find_library(curses_libname,
-                                    required: false,
-                                    kwargs: static_kwargs)
+                                    required: false)
         if libcurses.found()
           if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
             curses = declare_dependency(compile_args: curses_compile_args,
@@ -958,8 +944,7 @@ endif
 brlapi = not_found
 if not get_option('brlapi').auto() or have_system
   brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
-                         required: get_option('brlapi'),
-                         kwargs: static_kwargs)
+                         required: get_option('brlapi'))
   if brlapi.found() and not cc.links('''
      #include <brlapi.h>
      #include <stddef.h>
@@ -975,7 +960,7 @@ endif
 
 sdl = not_found
 if not get_option('sdl').auto() or have_system
-  sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
+  sdl = dependency('sdl2', required: get_option('sdl'))
   sdl_image = not_found
 endif
 if sdl.found()
@@ -983,7 +968,7 @@ if sdl.found()
   sdl = declare_dependency(compile_args: '-Wno-undef',
                            dependencies: sdl)
   sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
-                         method: 'pkg-config', kwargs: static_kwargs)
+                         method: 'pkg-config')
 else
   if get_option('sdl_image').enabled()
     error('sdl-image required, but SDL was @0@'.format(
@@ -994,11 +979,9 @@ endif
 
 rbd = not_found
 if not get_option('rbd').auto() or have_block
-  librados = cc.find_library('rados', required: get_option('rbd'),
-                             kwargs: static_kwargs)
+  librados = cc.find_library('rados', required: get_option('rbd'))
   librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
-                           required: get_option('rbd'),
-                           kwargs: static_kwargs)
+                           required: get_option('rbd'))
   if librados.found() and librbd.found()
     if cc.links('''
       #include <stdio.h>
@@ -1026,7 +1009,7 @@ glusterfs_iocb_has_stat = false
 if not get_option('glusterfs').auto() or have_block
   glusterfs = dependency('glusterfs-api', version: '>=3',
                          required: get_option('glusterfs'),
-                         method: 'pkg-config', kwargs: static_kwargs)
+                         method: 'pkg-config')
   if glusterfs.found()
     glusterfs_ftruncate_has_stat = cc.links('''
       #include <glusterfs/api/glfs.h>
@@ -1061,15 +1044,13 @@ libssh = not_found
 if not get_option('libssh').auto() or have_block
   libssh = dependency('libssh', version: '>=0.8.7',
                     method: 'pkg-config',
-                    required: get_option('libssh'),
-                    kwargs: static_kwargs)
+                    required: get_option('libssh'))
 endif
 
 libbzip2 = not_found
 if not get_option('bzip2').auto() or have_block
   libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
-                             required: get_option('bzip2'),
-                             kwargs: static_kwargs)
+                             required: get_option('bzip2'))
   if libbzip2.found() and not cc.links('''
      #include <bzlib.h>
      int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
@@ -1085,8 +1066,7 @@ endif
 liblzfse = not_found
 if not get_option('lzfse').auto() or have_block
   liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
-                             required: get_option('lzfse'),
-                             kwargs: static_kwargs)
+                             required: get_option('lzfse'))
 endif
 if liblzfse.found() and not cc.links('''
    #include <lzfse.h>
@@ -1104,8 +1084,7 @@ if get_option('oss').allowed() and have_system
   if not cc.has_header('sys/soundcard.h')
     # not found
   elif targetos == 'netbsd'
-    oss = cc.find_library('ossaudio', required: get_option('oss'),
-                          kwargs: static_kwargs)
+    oss = cc.find_library('ossaudio', required: get_option('oss'))
   else
     oss = declare_dependency()
   endif
@@ -1138,7 +1117,7 @@ endif
 opengl = not_found
 if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
   epoxy = dependency('epoxy', method: 'pkg-config',
-                      required: get_option('opengl'), kwargs: static_kwargs)
+                      required: get_option('opengl'))
   if cc.has_header('epoxy/egl.h', dependencies: epoxy)
     opengl = epoxy
   elif get_option('opengl').enabled()
@@ -1147,8 +1126,7 @@ if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
 endif
 gbm = not_found
 if (have_system or have_tools) and (virgl.found() or opengl.found())
-  gbm = dependency('gbm', method: 'pkg-config', required: false,
-                   kwargs: static_kwargs)
+  gbm = dependency('gbm', method: 'pkg-config', required: false)
 endif
 have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
 
@@ -1170,16 +1148,14 @@ if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_syste
   # the platform support requirements
   gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
                              method: 'pkg-config',
-                             required: false,
-                             kwargs: static_kwargs)
+                             required: false)
   if gnutls_crypto.found()
     gnutls = gnutls_crypto
   else
     # Our min version if all we need is TLS
     gnutls = dependency('gnutls', version: '>=3.5.18',
                         method: 'pkg-config',
-                        required: get_option('gnutls'),
-                        kwargs: static_kwargs)
+                        required: get_option('gnutls'))
   endif
 endif
 
@@ -1206,34 +1182,31 @@ if not gnutls_crypto.found()
   if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
     gcrypt = dependency('libgcrypt', version: '>=1.8',
                         method: 'config-tool',
-                        required: get_option('gcrypt'),
-                        kwargs: static_kwargs)
+                        required: get_option('gcrypt'))
     # Debian has removed -lgpg-error from libgcrypt-config
     # as it "spreads unnecessary dependencies" which in
     # turn breaks static builds...
     if gcrypt.found() and get_option('prefer_static')
       gcrypt = declare_dependency(dependencies: [
         gcrypt,
-        cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
+        cc.find_library('gpg-error', required: true)])
     endif
   endif
   if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
     nettle = dependency('nettle', version: '>=3.4',
                         method: 'pkg-config',
-                        required: get_option('nettle'),
-                        kwargs: static_kwargs)
+                        required: get_option('nettle'))
     if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
       xts = 'private'
     endif
   endif
 endif
 
-gmp = dependency('gmp', required: false, method: 'pkg-config', kwargs: static_kwargs)
+gmp = dependency('gmp', required: false, method: 'pkg-config')
 if nettle.found() and gmp.found()
   hogweed = dependency('hogweed', version: '>=3.4',
                        method: 'pkg-config',
-                       required: get_option('nettle'),
-                       kwargs: static_kwargs)
+                       required: get_option('nettle'))
 endif
 
 
@@ -1245,20 +1218,17 @@ have_gtk_clipboard = get_option('gtk_clipboard').enabled()
 if not get_option('gtk').auto() or have_system
   gtk = dependency('gtk+-3.0', version: '>=3.22.0',
                    method: 'pkg-config',
-                   required: get_option('gtk'),
-                   kwargs: static_kwargs)
+                   required: get_option('gtk'))
   if gtk.found()
     gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
                         method: 'pkg-config',
-                        required: false,
-                        kwargs: static_kwargs)
+                        required: false)
     gtk = declare_dependency(dependencies: [gtk, gtkx11])
 
     if not get_option('vte').auto() or have_system
       vte = dependency('vte-2.91',
                        method: 'pkg-config',
-                       required: get_option('vte'),
-                       kwargs: static_kwargs)
+                       required: get_option('vte'))
     endif
   elif have_gtk_clipboard
     error('GTK clipboard requested, but GTK not found')
@@ -1267,13 +1237,12 @@ endif
 
 x11 = not_found
 if gtkx11.found()
-  x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
-                   kwargs: static_kwargs)
+  x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
 endif
 png = not_found
 if get_option('png').allowed() and have_system
    png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
-                    method: 'pkg-config', kwargs: static_kwargs)
+                    method: 'pkg-config')
 endif
 vnc = not_found
 jpeg = not_found
@@ -1281,10 +1250,9 @@ sasl = not_found
 if get_option('vnc').allowed() and have_system
   vnc = declare_dependency() # dummy dependency
   jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
-                    method: 'pkg-config', kwargs: static_kwargs)
+                    method: 'pkg-config')
   sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
-                         required: get_option('vnc_sasl'),
-                         kwargs: static_kwargs)
+                         required: get_option('vnc_sasl'))
   if sasl.found()
     sasl = declare_dependency(dependencies: sasl,
                               compile_args: '-DSTRUCT_IOVEC_DEFINED')
@@ -1294,8 +1262,7 @@ endif
 pam = not_found
 if not get_option('auth_pam').auto() or have_system
   pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
-                        required: get_option('auth_pam'),
-                        kwargs: static_kwargs)
+                        required: get_option('auth_pam'))
 endif
 if pam.found() and not cc.links('''
    #include <stddef.h>
@@ -1319,8 +1286,7 @@ endif
 snappy = not_found
 if not get_option('snappy').auto() or have_system
   snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
-                           required: get_option('snappy'),
-                           kwargs: static_kwargs)
+                           required: get_option('snappy'))
 endif
 if snappy.found() and not linker.links('''
    #include <snappy-c.h>
@@ -1336,8 +1302,7 @@ endif
 lzo = not_found
 if not get_option('lzo').auto() or have_system
   lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
-                        required: get_option('lzo'),
-                        kwargs: static_kwargs)
+                        required: get_option('lzo'))
 endif
 if lzo.found() and not cc.links('''
    #include <lzo/lzo1x.h>
@@ -1353,8 +1318,7 @@ endif
 numa = not_found
 if not get_option('numa').auto() or have_system or have_tools
   numa = cc.find_library('numa', has_headers: ['numa.h'],
-                              required: get_option('numa'),
-                              kwargs: static_kwargs)
+                              required: get_option('numa'))
 endif
 if numa.found() and not cc.links('''
    #include <numa.h>
@@ -1372,10 +1336,8 @@ rdma = not_found
 if not get_option('rdma').auto() or have_system
   libumad = cc.find_library('ibumad', required: get_option('rdma'))
   rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
-                               required: get_option('rdma'),
-                               kwargs: static_kwargs),
-               cc.find_library('ibverbs', required: get_option('rdma'),
-                               kwargs: static_kwargs),
+                               required: get_option('rdma')),
+               cc.find_library('ibverbs', required: get_option('rdma')),
                libumad]
   rdma = declare_dependency(dependencies: rdma_libs)
   foreach lib: rdma_libs
@@ -1388,30 +1350,30 @@ endif
 xen = not_found
 if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
   xencontrol = dependency('xencontrol', required: false,
-                          method: 'pkg-config', kwargs: static_kwargs)
+                          method: 'pkg-config')
   if xencontrol.found()
     xen_pc = declare_dependency(version: xencontrol.version(),
       dependencies: [
         xencontrol,
         # disabler: true makes xen_pc.found() return false if any is not found
         dependency('xenstore', required: false,
-                   method: 'pkg-config', kwargs: static_kwargs,
+                   method: 'pkg-config',
                    disabler: true),
         dependency('xenforeignmemory', required: false,
-                   method: 'pkg-config', kwargs: static_kwargs,
+                   method: 'pkg-config',
                    disabler: true),
         dependency('xengnttab', required: false,
-                   method: 'pkg-config', kwargs: static_kwargs,
+                   method: 'pkg-config',
                    disabler: true),
         dependency('xenevtchn', required: false,
-                   method: 'pkg-config', kwargs: static_kwargs,
+                   method: 'pkg-config',
                    disabler: true),
         dependency('xendevicemodel', required: false,
-                   method: 'pkg-config', kwargs: static_kwargs,
+                   method: 'pkg-config',
                    disabler: true),
         # optional, no "disabler: true"
         dependency('xentoolcore', required: false,
-                   method: 'pkg-config', kwargs: static_kwargs)])
+                   method: 'pkg-config')])
     if xen_pc.found()
       xen = xen_pc
     endif
@@ -1469,60 +1431,53 @@ have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
 cacard = not_found
 if not get_option('smartcard').auto() or have_system
   cacard = dependency('libcacard', required: get_option('smartcard'),
-                      version: '>=2.5.1', method: 'pkg-config',
-                      kwargs: static_kwargs)
+                      version: '>=2.5.1', method: 'pkg-config')
 endif
 u2f = not_found
 if have_system
   u2f = dependency('u2f-emu', required: get_option('u2f'),
-                   method: 'pkg-config',
-                   kwargs: static_kwargs)
+                   method: 'pkg-config')
 endif
 canokey = not_found
 if have_system
   canokey = dependency('canokey-qemu', required: get_option('canokey'),
-                   method: 'pkg-config',
-                   kwargs: static_kwargs)
+                   method: 'pkg-config')
 endif
 usbredir = not_found
 if not get_option('usb_redir').auto() or have_system
   usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
-                        version: '>=0.6', method: 'pkg-config',
-                        kwargs: static_kwargs)
+                        version: '>=0.6', method: 'pkg-config')
 endif
 libusb = not_found
 if not get_option('libusb').auto() or have_system
   libusb = dependency('libusb-1.0', required: get_option('libusb'),
-                      version: '>=1.0.13', method: 'pkg-config',
-                      kwargs: static_kwargs)
+                      version: '>=1.0.13', method: 'pkg-config')
 endif
 
 libpmem = not_found
 if not get_option('libpmem').auto() or have_system
   libpmem = dependency('libpmem', required: get_option('libpmem'),
-                       method: 'pkg-config', kwargs: static_kwargs)
+                       method: 'pkg-config')
 endif
 libdaxctl = not_found
 if not get_option('libdaxctl').auto() or have_system
   libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
-                         version: '>=57', method: 'pkg-config',
-                         kwargs: static_kwargs)
+                         version: '>=57', method: 'pkg-config')
 endif
 tasn1 = not_found
 if gnutls.found()
   tasn1 = dependency('libtasn1',
-                     method: 'pkg-config',
-                     kwargs: static_kwargs)
+                     method: 'pkg-config')
 endif
 keyutils = dependency('libkeyutils', required: false,
-                      method: 'pkg-config', kwargs: static_kwargs)
+                      method: 'pkg-config')
 
 has_gettid = cc.has_function('gettid')
 
 # libselinux
 selinux = dependency('libselinux',
                      required: get_option('selinux'),
-                     method: 'pkg-config', kwargs: static_kwargs)
+                     method: 'pkg-config')
 
 # Malloc tests
 
@@ -1586,8 +1541,7 @@ if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
 endif
 
 fuse = dependency('fuse3', required: get_option('fuse'),
-                  version: '>=3.1', method: 'pkg-config',
-                  kwargs: static_kwargs)
+                  version: '>=3.1', method: 'pkg-config')
 
 fuse_lseek = not_found
 if get_option('fuse_lseek').allowed()
@@ -2677,7 +2631,7 @@ genh += custom_target('config-poison.h',
 capstone = not_found
 if not get_option('capstone').auto() or have_system or have_user
   capstone = dependency('capstone', version: '>=3.0.5',
-                        kwargs: static_kwargs, method: 'pkg-config',
+                        method: 'pkg-config',
                         required: get_option('capstone'))
 
   # Some versions of capstone have broken pkg-config file
@@ -2713,7 +2667,7 @@ if have_system
   fdt_opt = get_option('fdt')
   if fdt_opt in ['enabled', 'auto', 'system']
     have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
-    fdt = cc.find_library('fdt', kwargs: static_kwargs,
+    fdt = cc.find_library('fdt',
                           required: fdt_opt == 'system' or
                                     fdt_opt == 'enabled' and not have_internal)
     if fdt.found() and cc.links('''
diff --git a/tcg/meson.build b/tcg/meson.build
index c4c63b19d4ed..3db551bb3485 100644
--- a/tcg/meson.build
+++ b/tcg/meson.build
@@ -12,7 +12,7 @@ tcg_ss.add(files(
 
 if get_option('tcg_interpreter')
   libffi = dependency('libffi', version: '>=3.0', required: true,
-                      method: 'pkg-config', kwargs: static_kwargs)
+                      method: 'pkg-config')
   specific_ss.add(libffi)
   specific_ss.add(files('tci.c'))
 endif
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 11/30] meson: cleanup dummy-cpus.c rules
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (9 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 10/30] meson: remove static_kwargs Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-12  8:39   ` Marc-André Lureau
  2022-12-16 14:59   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 12/30] modinfo: lookup compile_commands.json by object Paolo Bonzini
                   ` (19 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

Now that qtest is available on all targets including Windows, dummy-cpus.c
is included unconditionally in the build.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 accel/meson.build | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/accel/meson.build b/accel/meson.build
index 259c35c4c882..3a480cc2efef 100644
--- a/accel/meson.build
+++ b/accel/meson.build
@@ -11,10 +11,5 @@ if have_system
   subdir('stubs')
 endif
 
-dummy_ss = ss.source_set()
-dummy_ss.add(files(
-  'dummy-cpus.c',
-))
-
-specific_ss.add_all(when: ['CONFIG_SOFTMMU'], if_true: dummy_ss)
-specific_ss.add_all(when: ['CONFIG_XEN'], if_true: dummy_ss)
+# qtest
+softmmu_ss.add(files('dummy-cpus.c'))
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 12/30] modinfo: lookup compile_commands.json by object
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (10 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 11/30] meson: cleanup dummy-cpus.c rules Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-12  8:47   ` Marc-André Lureau
  2022-12-09 11:23 ` [PATCH 13/30] configure: remove backwards-compatibility code Paolo Bonzini
                   ` (18 subsequent siblings)
  30 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann

With Meson 0.63 having fixed various issues with extract_objects, the
compile_commands.json lookups can be simplified.  If the lookup uses
the object file as key, there is no need to use the command line to
distinguish among all entries for a given source.

Cc: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 meson.build                | 14 ++++----------
 scripts/modinfo-collect.py | 23 +++++++++++------------
 2 files changed, 15 insertions(+), 22 deletions(-)

diff --git a/meson.build b/meson.build
index 9ccbe0f6e4ee..8a9ed5628317 100644
--- a/meson.build
+++ b/meson.build
@@ -3123,16 +3123,11 @@ foreach d, list : modules
         softmmu_mods += sl
       endif
       if module_ss.sources() != []
-        # FIXME: Should use sl.extract_all_objects(recursive: true) as
-        # input. Sources can be used multiple times but objects are
-        # unique when it comes to lookup in compile_commands.json.
-        # Depnds on a mesion version with
-        # https://github.com/mesonbuild/meson/pull/8900
         modinfo_files += custom_target(d + '-' + m + '.modinfo',
                                        output: d + '-' + m + '.modinfo',
-                                       input: module_ss.sources() + genh,
+                                       input: sl.extract_all_objects(recursive: true),
                                        capture: true,
-                                       command: [modinfo_collect, module_ss.sources()])
+                                       command: [modinfo_collect, '@INPUT@'])
       endif
     else
       if d == 'block'
@@ -3165,12 +3160,11 @@ foreach d, list : target_modules
                                 c_args: c_args,
                                 pic: true)
             softmmu_mods += sl
-            # FIXME: Should use sl.extract_all_objects(recursive: true) too.
             modinfo_files += custom_target(module_name + '.modinfo',
                                            output: module_name + '.modinfo',
-                                           input: target_module_ss.sources() + genh,
+                                           input: sl.extract_all_objects(recursive: true),
                                            capture: true,
-                                           command: [modinfo_collect, '--target', target, target_module_ss.sources()])
+                                           command: [modinfo_collect, '--target', target, '@INPUT@'])
           endif
         endif
       endforeach
diff --git a/scripts/modinfo-collect.py b/scripts/modinfo-collect.py
index 4e7584df6676..48bd92bd6180 100755
--- a/scripts/modinfo-collect.py
+++ b/scripts/modinfo-collect.py
@@ -7,15 +7,6 @@
 import shlex
 import subprocess
 
-def find_command(src, target, compile_commands):
-    for command in compile_commands:
-        if command['file'] != src:
-            continue
-        if target != '' and command['command'].find(target) == -1:
-            continue
-        return command['command']
-    return 'false'
-
 def process_command(src, command):
     skip = False
     out = []
@@ -43,14 +34,22 @@ def main(args):
         print("MODINFO_DEBUG target %s" % target)
         arch = target[:-8] # cut '-softmmu'
         print("MODINFO_START arch \"%s\" MODINFO_END" % arch)
+
     with open('compile_commands.json') as f:
-        compile_commands = json.load(f)
-    for src in args:
+        compile_commands_json = json.load(f)
+    compile_commands = { x['output']: x for x in compile_commands_json }
+
+    for obj in args:
+        entry = compile_commands.get(obj, None)
+        if not entry:
+            sys.stderr.print('modinfo: Could not find object file', obj)
+            sys.exit(1)
+        src = entry['file']
         if not src.endswith('.c'):
             print("MODINFO_DEBUG skip %s" % src)
             continue
+        command = entry['command']
         print("MODINFO_DEBUG src %s" % src)
-        command = find_command(src, target, compile_commands)
         cmdline = process_command(src, command)
         print("MODINFO_DEBUG cmd", cmdline)
         result = subprocess.run(cmdline, stdout = subprocess.PIPE,
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 13/30] configure: remove backwards-compatibility code
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (11 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 12/30] modinfo: lookup compile_commands.json by object Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-12  8:55   ` Marc-André Lureau
  2022-12-09 11:23 ` [PATCH 14/30] configure: test all warnings Paolo Bonzini
                   ` (17 subsequent siblings)
  30 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

The cmd_line.txt mangling is only needed when rebuilding from very old
trees and is kept mostly as an example of how to extend it.  However,
Meson 0.63 introduces a deprecation mechanism for meson_options.txt
that can be used instead, so get rid of our home-grown hack.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure | 10 ----------
 1 file changed, 10 deletions(-)

diff --git a/configure b/configure
index 6efc2055ce09..113db838a16f 100755
--- a/configure
+++ b/configure
@@ -2556,16 +2556,6 @@ if test "$skip_meson" = no; then
   if test "$?" -ne 0 ; then
       error_exit "meson setup failed"
   fi
-else
-  if test -f meson-private/cmd_line.txt; then
-    # Adjust old command line options whose type was changed
-    # Avoids having to use "setup --wipe" when Meson is upgraded
-    perl -i -ne '
-      s/^gettext = true$/gettext = auto/;
-      s/^gettext = false$/gettext = disabled/;
-      /^b_staticpic/ && next;
-      print;' meson-private/cmd_line.txt
-  fi
 fi
 
 # Save the configure command line for later reuse.
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 14/30] configure: test all warnings
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (12 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 13/30] configure: remove backwards-compatibility code Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-09 12:45   ` Philippe Mathieu-Daudé
  2022-12-16 15:01   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 15/30] meson: cleanup compiler detection Paolo Bonzini
                   ` (16 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

Some warnings are hardcoded in QEMU_CFLAGS and not tested.  There is
no particular reason to single out these five, as many more -W flags are
present on all the supported compilers.  For homogeneity when moving
the detection to meson, make them use the same warn_flags infrastructure.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/configure b/configure
index 113db838a16f..9c5393a25de7 100755
--- a/configure
+++ b/configure
@@ -378,8 +378,6 @@ sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
 # 2s-complement style results. (Both clang and gcc agree that it
 # provides these semantics.)
 QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv"
-QEMU_CFLAGS="-Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
-QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
 QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
 
 QEMU_LDFLAGS=
@@ -1161,6 +1159,11 @@ fi
 # just silently disable some features, so it's too error prone.
 
 warn_flags=
+add_to warn_flags -Wundef
+add_to warn_flags -Wwrite-strings
+add_to warn_flags -Wmissing-prototypes
+add_to warn_flags -Wstrict-prototypes
+add_to warn_flags -Wredundant-decls
 add_to warn_flags -Wold-style-declaration
 add_to warn_flags -Wold-style-definition
 add_to warn_flags -Wtype-limits
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 15/30] meson: cleanup compiler detection
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (13 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 14/30] configure: test all warnings Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-12  9:04   ` Marc-André Lureau
  2022-12-16 15:03   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 16/30] build: move glib detection and workarounds to meson Paolo Bonzini
                   ` (15 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

Detect all compilers at the beginning of meson.build, and store
the available languages in an array.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 meson.build | 62 ++++++++++++++++++++++++++++++-----------------------
 1 file changed, 35 insertions(+), 27 deletions(-)

diff --git a/meson.build b/meson.build
index 8a9ed5628317..c4fa82ae8ba4 100644
--- a/meson.build
+++ b/meson.build
@@ -15,9 +15,21 @@ ss = import('sourceset')
 fs = import('fs')
 
 sh = find_program('sh')
-cc = meson.get_compiler('c')
 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
 enable_modules = 'CONFIG_MODULES' in config_host
+targetos = host_machine.system()
+
+cc = meson.get_compiler('c')
+all_languages = ['c']
+if add_languages('cpp', required: false, native: false)
+  all_languages += ['cpp']
+  cxx = meson.get_compiler('cpp')
+endif
+if targetos == 'darwin' and \
+   add_languages('objc', required: get_option('cocoa'), native: false)
+  all_languages += ['objc']
+  objc = meson.get_compiler('objc')
+endif
 
 # Temporary directory used for files created while
 # configure runs. Since it is in the build directory
@@ -54,8 +66,6 @@ if cpu in ['riscv32', 'riscv64']
   cpu = 'riscv'
 endif
 
-targetos = host_machine.system()
-
 target_dirs = config_host['TARGET_DIRS'].split()
 have_linux_user = false
 have_bsd_user = false
@@ -161,7 +171,7 @@ if 'dtrace' in get_option('trace_backends')
     # semaphores are linked into the main binary and not the module's shared
     # object.
     add_global_arguments('-DSTAP_SDT_V2',
-                         native: false, language: ['c', 'cpp', 'objc'])
+                         native: false, language: all_languages)
   endif
 endif
 
@@ -203,7 +213,7 @@ endif
 if get_option('fuzzing')
   add_project_link_arguments(['-Wl,-T,',
                               (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
-                             native: false, language: ['c', 'cpp', 'objc'])
+                             native: false, language: all_languages)
 
   # Specify a filter to only instrument code that is directly related to
   # virtual-devices.
@@ -216,7 +226,7 @@ if get_option('fuzzing')
                  args: ['-fsanitize-coverage-allowlist=/dev/null',
                         '-fsanitize-coverage=trace-pc'] )
     add_global_arguments('-fsanitize-coverage-allowlist=instrumentation-filter',
-                         native: false, language: ['c', 'cpp', 'objc'])
+                         native: false, language: all_languages)
   endif
 
   if get_option('fuzzing_engine') == ''
@@ -225,9 +235,9 @@ if get_option('fuzzing')
     # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
     # unable to bind the fuzzer-related callbacks added by instrumentation.
     add_global_arguments('-fsanitize=fuzzer-no-link',
-                         native: false, language: ['c', 'cpp', 'objc'])
+                         native: false, language: all_languages)
     add_global_link_arguments('-fsanitize=fuzzer-no-link',
-                              native: false, language: ['c', 'cpp', 'objc'])
+                              native: false, language: all_languages)
     # For the actual fuzzer binaries, we need to link against the libfuzzer
     # library. They need to be configurable, to support OSS-Fuzz
     fuzz_exe_ldflags = ['-fsanitize=fuzzer']
@@ -238,15 +248,11 @@ if get_option('fuzzing')
   endif
 endif
 
-add_global_arguments(qemu_cflags, native: false, language: ['c'])
-add_global_arguments(qemu_objcflags, native: false, language: ['objc'])
-
 # Check that the C++ compiler exists and works with the C compiler.
 link_language = 'c'
 linker = cc
 qemu_cxxflags = []
-if add_languages('cpp', required: false, native: false)
-  cxx = meson.get_compiler('cpp')
+if 'cpp' in all_languages
   add_global_arguments(['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'],
                        native: false, language: 'cpp')
   foreach k: qemu_cflags
@@ -255,7 +261,6 @@ if add_languages('cpp', required: false, native: false)
       qemu_cxxflags += [k]
     endif
   endforeach
-  add_global_arguments(qemu_cxxflags, native: false, language: 'cpp')
 
   if cxx.links(files('scripts/main.c'), args: qemu_cflags)
     link_language = 'cpp'
@@ -271,22 +276,21 @@ if targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN')
   qemu_ldflags += linker.get_supported_link_arguments('-Wl,--warn-common')
 endif
 
-add_global_link_arguments(qemu_ldflags, native: false, language: ['c', 'cpp', 'objc'])
+add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
 
+add_global_arguments(qemu_cflags, native: false, language: 'c')
+add_global_arguments(qemu_cxxflags, native: false, language: 'cpp')
+add_global_arguments(qemu_objcflags, native: false, language: 'objc')
 if targetos == 'linux'
   add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
                         '-isystem', 'linux-headers',
-                        language: ['c', 'cpp'])
+                        language: all_languages)
 endif
 
 add_project_arguments('-iquote', '.',
                       '-iquote', meson.current_source_dir(),
                       '-iquote', meson.current_source_dir() / 'include',
-                      language: ['c', 'cpp', 'objc'])
-
-if host_machine.system() == 'darwin'
-  add_languages('objc', required: false, native: false)
-endif
+                      language: all_languages)
 
 sparse = find_program('cgcc', required: get_option('sparse'))
 if sparse.found()
@@ -468,7 +472,7 @@ if get_option('tcg').allowed()
     tcg_arch = 'ppc'
   endif
   add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
-                        language: ['c', 'cpp', 'objc'])
+                        language: all_languages)
 
   accelerators += 'CONFIG_TCG'
   config_host += { 'CONFIG_TCG': 'y' }
@@ -494,7 +498,7 @@ endif
 # The path to glib.h is added to all compilation commands.  This was
 # grandfathered in from the QEMU Makefiles.
 add_project_arguments(config_host['GLIB_CFLAGS'].split(),
-                      native: false, language: ['c', 'cpp', 'objc'])
+                      native: false, language: all_languages)
 glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
                           link_args: config_host['GLIB_LIBS'].split(),
                           version: config_host['GLIB_VERSION'],
@@ -1674,8 +1678,8 @@ if get_option('cfi')
       error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
     endif
   endif
-  add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
-  add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
+  add_global_arguments(cfi_flags, native: false, language: all_languages)
+  add_global_link_arguments(cfi_flags, native: false, language: all_languages)
 endif
 
 have_host_block_device = (targetos != 'darwin' or
@@ -3713,8 +3717,12 @@ if link_args.length() > 0
   summary_info += {'LDFLAGS':         ' '.join(link_args)}
 endif
 summary_info += {'QEMU_CFLAGS':       ' '.join(qemu_cflags)}
-summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_cxxflags)}
-summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_objcflags)}
+if 'cpp' in all_languages
+  summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_cxxflags)}
+endif
+if 'objc' in all_languages
+  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_objcflags)}
+endif
 summary_info += {'QEMU_LDFLAGS':      ' '.join(qemu_ldflags)}
 summary_info += {'profiler':          get_option('profiler')}
 summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 16/30] build: move glib detection and workarounds to meson
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (14 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 15/30] meson: cleanup compiler detection Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-09 12:50   ` Philippe Mathieu-Daudé
  2022-12-09 11:23 ` [PATCH 17/30] configure: remove pkg-config functions Paolo Bonzini
                   ` (14 subsequent siblings)
  30 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

QEMU adds the path to glib.h is added to all compilation commands.
This is simpler due to the pervasive use of static_library, and was
grandfathered in from the previous Make-based build system.  Until
Meson 0.63 the only way to do this was to detect glib in configure
and use add_project_arguments, but now it is possible to use
add_project_dependencies instead.

gmodule is detected in a separate variable and added via both
block_ss (for --enable-modules) and plugins/meson.build (for
--enable-plugins).

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 block/meson.build        |  1 +
 configure                | 83 +---------------------------------------
 contrib/plugins/Makefile |  4 +-
 meson.build              | 81 +++++++++++++++++++++++++++++++++------
 plugins/meson.build      |  2 +-
 5 files changed, 74 insertions(+), 97 deletions(-)

diff --git a/block/meson.build b/block/meson.build
index b7c68b83a36f..f2e0e86f3b0a 100644
--- a/block/meson.build
+++ b/block/meson.build
@@ -145,6 +145,7 @@ block_gen_c = custom_target('block-gen.c',
 block_ss.add(block_gen_c)
 
 block_ss.add(files('stream.c'))
+block_ss.add(gmodule)
 
 softmmu_ss.add(files('qapi-sysemu.c'))
 
diff --git a/configure b/configure
index 9c5393a25de7..fb28dd3963bd 100755
--- a/configure
+++ b/configure
@@ -1426,84 +1426,6 @@ if ! has "$pkg_config_exe"; then
   error_exit "pkg-config binary '$pkg_config_exe' not found"
 fi
 
-##########################################
-# glib support probe
-
-# When bumping glib_req_ver, please check also whether we should increase
-# the _WIN32_WINNT setting in osdep.h according to the value from glib
-glib_req_ver=2.56
-glib_modules=gthread-2.0
-if test "$modules" = yes; then
-    glib_modules="$glib_modules gmodule-export-2.0"
-elif test "$plugins" = "yes"; then
-    glib_modules="$glib_modules gmodule-no-export-2.0"
-fi
-
-for i in $glib_modules; do
-    if $pkg_config --atleast-version=$glib_req_ver $i; then
-        glib_cflags=$($pkg_config --cflags $i)
-        glib_libs=$($pkg_config --libs $i)
-    else
-        error_exit "glib-$glib_req_ver $i is required to compile QEMU"
-    fi
-done
-
-glib_bindir="$($pkg_config --variable=bindir glib-2.0)"
-if test -z "$glib_bindir" ; then
-	glib_bindir="$($pkg_config --variable=prefix glib-2.0)"/bin
-fi
-
-# This workaround is required due to a bug in pkg-config file for glib as it
-# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
-
-if test "$static" = yes && test "$mingw32" = yes; then
-    glib_cflags="-DGLIB_STATIC_COMPILATION $glib_cflags"
-fi
-
-# Sanity check that the current size_t matches the
-# size that glib thinks it should be. This catches
-# problems on multi-arch where people try to build
-# 32-bit QEMU while pointing at 64-bit glib headers
-cat > $TMPC <<EOF
-#include <glib.h>
-#include <unistd.h>
-
-#define QEMU_BUILD_BUG_ON(x) \
-  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
-
-int main(void) {
-   QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
-   return 0;
-}
-EOF
-
-if ! compile_prog "$glib_cflags" "$glib_libs" ; then
-    error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\
-               "You probably need to set PKG_CONFIG_LIBDIR"\
-	       "to point to the right pkg-config files for your"\
-	       "build target"
-fi
-
-# Silence clang warnings triggered by glib < 2.57.2
-cat > $TMPC << EOF
-#include <glib.h>
-typedef struct Foo {
-    int i;
-} Foo;
-static void foo_free(Foo *f)
-{
-    g_free(f);
-}
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free)
-int main(void) { return 0; }
-EOF
-if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then
-    if cc_has_warning_flag "-Wno-unused-function"; then
-        glib_cflags="$glib_cflags -Wno-unused-function"
-        CONFIGURE_CFLAGS="$CONFIGURE_CFLAGS -Wno-unused-function"
-    fi
-fi
-
 ##########################################
 # fdt probe
 
@@ -2361,13 +2283,10 @@ echo "PYTHON=$python" >> $config_host_mak
 echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
 echo "MESON=$meson" >> $config_host_mak
 echo "NINJA=$ninja" >> $config_host_mak
+echo "PKG_CONFIG=${pkg_config_exe}" >> $config_host_mak
 echo "CC=$cc" >> $config_host_mak
 echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
 echo "QEMU_OBJCFLAGS=$QEMU_OBJCFLAGS" >> $config_host_mak
-echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
-echo "GLIB_LIBS=$glib_libs" >> $config_host_mak
-echo "GLIB_BINDIR=$glib_bindir" >> $config_host_mak
-echo "GLIB_VERSION=$(pkg-config --modversion glib-2.0)" >> $config_host_mak
 echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
 echo "EXESUF=$EXESUF" >> $config_host_mak
 
diff --git a/contrib/plugins/Makefile b/contrib/plugins/Makefile
index 23e0396687e8..8a316cd76f2f 100644
--- a/contrib/plugins/Makefile
+++ b/contrib/plugins/Makefile
@@ -3,7 +3,7 @@
 # This Makefile example is fairly independent from the main makefile
 # so users can take and adapt it for their build. We only really
 # include config-host.mak so we don't have to repeat probing for
-# cflags that the main configure has already done for us.
+# programs that the main configure has already done for us.
 #
 
 BUILD_DIR := $(CURDIR)/../..
@@ -26,7 +26,7 @@ SONAMES := $(addsuffix .so,$(addprefix lib,$(NAMES)))
 
 # The main QEMU uses Glib extensively so it's perfectly fine to use it
 # in plugins (which many example do).
-CFLAGS = $(GLIB_CFLAGS)
+CFLAGS := $(shell $(PKG_CONFIG) --cflags glib-2.0)
 CFLAGS += -fPIC -Wall $(filter -W%, $(QEMU_CFLAGS))
 CFLAGS += $(if $(findstring no-psabi,$(QEMU_CFLAGS)),-Wpsabi)
 CFLAGS += $(if $(CONFIG_DEBUG_TCG), -ggdb -O0)
diff --git a/meson.build b/meson.build
index c4fa82ae8ba4..f63ab7f83bed 100644
--- a/meson.build
+++ b/meson.build
@@ -495,19 +495,77 @@ endif
 # Dependencies #
 ################
 
-# The path to glib.h is added to all compilation commands.  This was
-# grandfathered in from the QEMU Makefiles.
-add_project_arguments(config_host['GLIB_CFLAGS'].split(),
-                      native: false, language: all_languages)
-glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
-                          link_args: config_host['GLIB_LIBS'].split(),
-                          version: config_host['GLIB_VERSION'],
+# When bumping glib minimum version, please check also whether to increase
+# the _WIN32_WINNT setting in osdep.h according to the value from glib
+glib_req_ver = '>=2.56.0'
+glib = dependency('glib-2.0', version: glib_req_ver, required: true,
+                  method: 'pkg-config')
+glib_cflags = []
+if config_host.has_key('CONFIG_MODULES')
+  gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
+                       method: 'pkg-config')
+elif config_host.has_key('CONFIG_PLUGIN')
+  gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
+                       method: 'pkg-config')
+else
+  gmodule = not_found
+endif
+
+# This workaround is required due to a bug in pkg-config file for glib as it
+# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
+if targetos == 'windows' and get_option('prefer_static')
+  glib_cflags += ['-DGLIB_STATIC_COMPILATION']
+endif
+
+# Sanity check that the current size_t matches the
+# size that glib thinks it should be. This catches
+# problems on multi-arch where people try to build
+# 32-bit QEMU while pointing at 64-bit glib headers
+
+if not cc.compiles('''
+  #include <glib.h>
+  #include <unistd.h>
+
+  #define QEMU_BUILD_BUG_ON(x) \
+  typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
+
+  int main(void) {
+     QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
+     return 0;
+  }''', dependencies: glib, args: glib_cflags)
+  error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
+        You probably need to set PKG_CONFIG_LIBDIR" to point
+        to the right pkg-config files for your build target.''')
+endif
+
+# Silence clang warnings triggered by glib < 2.57.2
+if not cc.compiles('''
+  #include <glib.h>
+  typedef struct Foo {
+    int i;
+  } Foo;
+  static void foo_free(Foo *f)
+  {
+    g_free(f);
+  }
+  G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free)
+  int main(void) { return 0; }''', dependencies: glib, args: ['-Werror'])
+  glib_cflags += cc.get_supported_arguments('-Wno-unused-function')
+endif
+glib = declare_dependency(dependencies: glib,
+                          compile_args: glib_cflags,
+                          version: glib.version(),
                           variables: {
-                            'bindir': config_host['GLIB_BINDIR'],
+                            'bindir': glib.get_variable('bindir')
                           })
-# override glib dep with the configure results (for subprojects)
+
+# override glib dep to include the above refinements
 meson.override_dependency('glib-2.0', glib)
 
+# The path to glib.h is added to all compilation commands.
+add_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
+                         native: false, language: all_languages)
+
 gio = not_found
 gdbus_codegen = not_found
 gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
@@ -923,7 +981,7 @@ if have_system and get_option('curses').allowed()
         int main(void) {
           iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
           return conv != (iconv_t) -1;
-        }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
+        }''', args: link_args, dependencies: glib)
         iconv = declare_dependency(link_args: link_args, dependencies: glib)
         break
       endif
@@ -2977,7 +3035,6 @@ subdir('ui')
 subdir('hw')
 subdir('gdbstub')
 
-
 if enable_modules
   libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
   modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
@@ -3590,7 +3647,7 @@ if host_machine.system() == 'windows'
     '@OUTPUT@',
     get_option('prefix'),
     meson.current_source_dir(),
-    config_host['GLIB_BINDIR'],
+    glib.get_variable('bindir'),
     host_machine.cpu(),
     '--',
     '-DDISPLAYVERSION=' + meson.project_version(),
diff --git a/plugins/meson.build b/plugins/meson.build
index 752377c66d32..04cb7d252aab 100644
--- a/plugins/meson.build
+++ b/plugins/meson.build
@@ -17,4 +17,4 @@ specific_ss.add(when: 'CONFIG_PLUGIN', if_true: [files(
   'loader.c',
   'core.c',
   'api.c',
-), declare_dependency(link_args: plugin_ldflags)])
+), gmodule, declare_dependency(link_args: plugin_ldflags)])
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 17/30] configure: remove pkg-config functions
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (15 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 16/30] build: move glib detection and workarounds to meson Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-12  9:05   ` Marc-André Lureau
  2022-12-16 15:07   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 18/30] configure, meson: move --enable-modules to Meson Paolo Bonzini
                   ` (13 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

All uses of pkg-config have been moved to Meson.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure                   | 19 +++----------------
 docs/devel/build-system.rst |  4 ----
 2 files changed, 3 insertions(+), 20 deletions(-)

diff --git a/configure b/configure
index fb28dd3963bd..9c336203d8d9 100755
--- a/configure
+++ b/configure
@@ -365,11 +365,7 @@ smbd="$SMBD"
 strip="${STRIP-${cross_prefix}strip}"
 widl="${WIDL-${cross_prefix}widl}"
 windres="${WINDRES-${cross_prefix}windres}"
-pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
-query_pkg_config() {
-    "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
-}
-pkg_config=query_pkg_config
+pkg_config="${PKG_CONFIG-${cross_prefix}pkg-config}"
 sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
 
 # default flags for all hosts
@@ -745,9 +741,7 @@ for opt do
   ;;
   --without-default-features) # processed above
   ;;
-  --static)
-    static="yes"
-    QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
+  --static) static="yes"
   ;;
   --bindir=*) bindir="$optarg"
   ;;
@@ -1419,13 +1413,6 @@ EOF
   fi
 fi
 
-##########################################
-# pkg-config probe
-
-if ! has "$pkg_config_exe"; then
-  error_exit "pkg-config binary '$pkg_config_exe' not found"
-fi
-
 ##########################################
 # fdt probe
 
@@ -2423,7 +2410,7 @@ if test "$skip_meson" = no; then
   test -n "$objcc" && echo "objc = [$(meson_quote $objcc $CPU_CFLAGS)]" >> $cross
   echo "ar = [$(meson_quote $ar)]" >> $cross
   echo "nm = [$(meson_quote $nm)]" >> $cross
-  echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
+  echo "pkgconfig = [$(meson_quote $pkg_config)]" >> $cross
   echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
   if has $sdl2_config; then
     echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst
index 9db18aff159e..66cfe7b8bdc8 100644
--- a/docs/devel/build-system.rst
+++ b/docs/devel/build-system.rst
@@ -103,10 +103,6 @@ developers in checking for system features:
    Print $MESSAGE to stderr, followed by $MORE... and then exit from the
    configure script with non-zero status
 
-``query_pkg_config $ARGS...``
-   Run pkg-config passing it $ARGS. If QEMU is doing a static build,
-   then --static will be automatically added to $ARGS
-
 
 Stage 2: Meson
 ==============
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 18/30] configure, meson: move --enable-modules to Meson
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (16 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 17/30] configure: remove pkg-config functions Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-12  9:07   ` Marc-André Lureau
  2022-12-16 15:09   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 19/30] configure, meson: move --enable-debug-info " Paolo Bonzini
                   ` (12 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure                     | 21 +--------------------
 meson.build                   |  7 ++++++-
 meson_options.txt             |  2 ++
 scripts/meson-buildoptions.sh |  3 +++
 4 files changed, 12 insertions(+), 21 deletions(-)

diff --git a/configure b/configure
index 9c336203d8d9..26d10aeffd82 100755
--- a/configure
+++ b/configure
@@ -273,7 +273,6 @@ sanitizers="no"
 tsan="no"
 fortify_source="yes"
 EXESUF=""
-modules="no"
 prefix="/usr/local"
 qemu_suffix="qemu"
 softmmu="yes"
@@ -705,12 +704,6 @@ for opt do
   ;;
   --disable-debug-info) meson_option_add -Ddebug=false
   ;;
-  --enable-modules)
-      modules="yes"
-  ;;
-  --disable-modules)
-      modules="no"
-  ;;
   --cpu=*)
   ;;
   --target-list=*) target_list="$optarg"
@@ -1001,7 +994,6 @@ cat << EOF
   linux-user      all linux usermode emulation targets
   bsd-user        all BSD usermode emulation targets
   pie             Position Independent Executables
-  modules         modules support (non-Windows)
   debug-tcg       TCG debugging (default is disabled)
   debug-info      debugging information
   safe-stack      SafeStack Stack Smash Protection. Depends on
@@ -1260,16 +1252,8 @@ else
   QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
 fi
 
-# Our module code doesn't support Windows
-if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
-  error_exit "Modules are not available for Windows"
-fi
-
-# Static linking is not possible with plugins, modules or PIE
+# Resolve default for --enable-plugins
 if test "$static" = "yes" ; then
-  if test "$modules" = "yes" ; then
-    error_exit "static and modules are mutually incompatible"
-  fi
   if test "$plugins" = "yes"; then
     error_exit "static and plugins are mutually incompatible"
   else
@@ -2229,9 +2213,6 @@ if test "$solaris" = "yes" ; then
 fi
 echo "SRC_PATH=$source_path" >> $config_host_mak
 echo "TARGET_DIRS=$target_list" >> $config_host_mak
-if test "$modules" = "yes"; then
-  echo "CONFIG_MODULES=y" >> $config_host_mak
-fi
 
 # XXX: suppress that
 if [ "$bsd" = "yes" ] ; then
diff --git a/meson.build b/meson.build
index f63ab7f83bed..99c1bde4d154 100644
--- a/meson.build
+++ b/meson.build
@@ -16,7 +16,6 @@ fs = import('fs')
 
 sh = find_program('sh')
 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
-enable_modules = 'CONFIG_MODULES' in config_host
 targetos = host_machine.system()
 
 cc = meson.get_compiler('c')
@@ -84,6 +83,12 @@ have_ga = get_option('guest_agent') \
   .require(targetos in ['sunos', 'linux', 'windows', 'freebsd'],
            error_message: 'unsupported OS for QEMU guest agent') \
   .allowed()
+enable_modules = get_option('modules') \
+  .require(targetos != 'windows',
+           error_message: 'Modules are not available for Windows') \
+  .require(not get_option('prefer_static'),
+           error_message: 'Modules are incompatible with static linking') \
+  .allowed()
 have_block = have_system or have_tools
 
 python = import('python').find_installation()
diff --git a/meson_options.txt b/meson_options.txt
index 4b749ca54900..e492aaa73fbc 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -44,6 +44,8 @@ option('fuzzing', type : 'boolean', value: false,
        description: 'build fuzzing targets')
 option('gettext', type : 'feature', value : 'auto',
        description: 'Localization of the GTK+ user interface')
+option('modules', type : 'feature', value : 'disabled',
+       description: 'modules support (non Windows)')
 option('module_upgrades', type : 'boolean', value : false,
        description: 'try to load modules from alternate paths for upgrades')
 option('install_blobs', type : 'boolean', value : true,
diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
index aa6e30ea911e..f91797741eef 100644
--- a/scripts/meson-buildoptions.sh
+++ b/scripts/meson-buildoptions.sh
@@ -119,6 +119,7 @@ meson_options_help() {
   printf "%s\n" '  lzo             lzo compression support'
   printf "%s\n" '  malloc-trim     enable libc malloc_trim() for memory optimization'
   printf "%s\n" '  membarrier      membarrier system call (for Linux 4.14+ or Windows'
+  printf "%s\n" '  modules         modules support (non Windows)'
   printf "%s\n" '  mpath           Multipath persistent reservation passthrough'
   printf "%s\n" '  multiprocess    Out of process device emulation support'
   printf "%s\n" '  netmap          netmap network backend support'
@@ -338,6 +339,8 @@ _meson_option_parse() {
     --disable-membarrier) printf "%s" -Dmembarrier=disabled ;;
     --enable-module-upgrades) printf "%s" -Dmodule_upgrades=true ;;
     --disable-module-upgrades) printf "%s" -Dmodule_upgrades=false ;;
+    --enable-modules) printf "%s" -Dmodules=enabled ;;
+    --disable-modules) printf "%s" -Dmodules=disabled ;;
     --enable-mpath) printf "%s" -Dmpath=enabled ;;
     --disable-mpath) printf "%s" -Dmpath=disabled ;;
     --enable-multiprocess) printf "%s" -Dmultiprocess=enabled ;;
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 19/30] configure, meson: move --enable-debug-info to Meson
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (17 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 18/30] configure, meson: move --enable-modules to Meson Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-09 12:55   ` Philippe Mathieu-Daudé
  2022-12-16 15:09   ` Daniel P. Berrangé
  2022-12-09 11:23 ` [PATCH 20/30] meson: prepare move of QEMU_CFLAGS to meson Paolo Bonzini
                   ` (11 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

Older versions of Meson had an unclear description of the -Ddebug option,
but this is fixed in 0.63.0 that is required now.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure                     | 5 -----
 scripts/meson-buildoptions.py | 2 ++
 scripts/meson-buildoptions.sh | 3 +++
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/configure b/configure
index 26d10aeffd82..b0df6c3cf754 100755
--- a/configure
+++ b/configure
@@ -700,10 +700,6 @@ for opt do
   ;;
   --cross-prefix-*)
   ;;
-  --enable-debug-info) meson_option_add -Ddebug=true
-  ;;
-  --disable-debug-info) meson_option_add -Ddebug=false
-  ;;
   --cpu=*)
   ;;
   --target-list=*) target_list="$optarg"
@@ -995,7 +991,6 @@ cat << EOF
   bsd-user        all BSD usermode emulation targets
   pie             Position Independent Executables
   debug-tcg       TCG debugging (default is disabled)
-  debug-info      debugging information
   safe-stack      SafeStack Stack Smash Protection. Depends on
                   clang/llvm >= 3.7 and requires coroutine backend ucontext.
 
diff --git a/scripts/meson-buildoptions.py b/scripts/meson-buildoptions.py
index 3e2b4785388f..8e4e5c4e8bd6 100755
--- a/scripts/meson-buildoptions.py
+++ b/scripts/meson-buildoptions.py
@@ -35,6 +35,7 @@
 OPTION_NAMES = {
     "b_coverage": "gcov",
     "b_lto": "lto",
+    "debug": "debug-info",
     "malloc": "enable-malloc",
     "pkgversion": "with-pkgversion",
     "qemu_firmwarepath": "firmwarepath",
@@ -45,6 +46,7 @@
 BUILTIN_OPTIONS = {
     "b_coverage",
     "b_lto",
+    "debug",
     "datadir",
     "includedir",
     "libdir",
diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
index f91797741eef..cb277347bb18 100644
--- a/scripts/meson-buildoptions.sh
+++ b/scripts/meson-buildoptions.sh
@@ -10,6 +10,7 @@ meson_options_help() {
   printf "%s\n" '                           affects only QEMU, not tools like qemu-img)'
   printf "%s\n" '  --datadir=VALUE          Data file directory [share]'
   printf "%s\n" '  --disable-coroutine-pool coroutine freelist (better performance)'
+  printf "%s\n" '  --disable-debug-info     Enable debug symbols and other information'
   printf "%s\n" '  --disable-install-blobs  install provided firmware blobs'
   printf "%s\n" '  --docdir=VALUE           Base directory for documentation installation'
   printf "%s\n" '                           (can be empty) [share/doc]'
@@ -242,6 +243,8 @@ _meson_option_parse() {
     --datadir=*) quote_sh "-Ddatadir=$2" ;;
     --enable-dbus-display) printf "%s" -Ddbus_display=enabled ;;
     --disable-dbus-display) printf "%s" -Ddbus_display=disabled ;;
+    --enable-debug-info) printf "%s" -Ddebug=true ;;
+    --disable-debug-info) printf "%s" -Ddebug=false ;;
     --enable-debug-mutex) printf "%s" -Ddebug_mutex=true ;;
     --disable-debug-mutex) printf "%s" -Ddebug_mutex=false ;;
     --enable-debug-stack-usage) printf "%s" -Ddebug_stack_usage=true ;;
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 20/30] meson: prepare move of QEMU_CFLAGS to meson
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (18 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 19/30] configure, meson: move --enable-debug-info " Paolo Bonzini
@ 2022-12-09 11:23 ` Paolo Bonzini
  2022-12-12 12:02   ` Marc-André Lureau
  2022-12-16 15:11   ` Daniel P. Berrangé
  2022-12-09 11:24 ` [PATCH 21/30] build: move sanitizer tests " Paolo Bonzini
                   ` (10 subsequent siblings)
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:23 UTC (permalink / raw)
  To: qemu-devel

Clean up the handling of compiler flags in meson.build, splitting
the general flags that should be included in subprojects as well,
from warning flags that only apply to QEMU itself.  The two were
mixed in both configure tests and meson tests.

This split makes it easier to move the compiler tests piecewise
from configure to Meson.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 meson.build | 53 +++++++++++++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 24 deletions(-)

diff --git a/meson.build b/meson.build
index 99c1bde4d154..dac343d14797 100644
--- a/meson.build
+++ b/meson.build
@@ -190,10 +190,23 @@ endif
 # Compiler flags #
 ##################
 
-qemu_cflags = config_host['QEMU_CFLAGS'].split()
+qemu_common_flags = []
+qemu_cflags = []
+foreach arg : config_host['QEMU_CFLAGS'].split()
+  if arg.startswith('-W')
+    qemu_cflags += arg
+  else
+    qemu_common_flags += arg
+  endif
+endforeach
 qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
 qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
 
+if get_option('gprof')
+  qemu_common_flags += ['-p']
+  qemu_ldflags += ['-p']
+endif
+
 if get_option('prefer_static')
   qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
 endif
@@ -207,10 +220,9 @@ if targetos == 'windows'
   qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
 endif
 
-if get_option('gprof')
-  qemu_cflags += ['-p']
-  qemu_objcflags += ['-p']
-  qemu_ldflags += ['-p']
+# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
+if targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN')
+  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--warn-common')
 endif
 
 # Specify linker-script with add_project_link_arguments so that it is not placed
@@ -230,8 +242,7 @@ if get_option('fuzzing')
                   name: '-fsanitize-coverage-allowlist=/dev/null',
                  args: ['-fsanitize-coverage-allowlist=/dev/null',
                         '-fsanitize-coverage=trace-pc'] )
-    add_global_arguments('-fsanitize-coverage-allowlist=instrumentation-filter',
-                         native: false, language: all_languages)
+    qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter']
   endif
 
   if get_option('fuzzing_engine') == ''
@@ -239,10 +250,8 @@ if get_option('fuzzing')
     # compiled code.  To build non-fuzzer binaries with --enable-fuzzing, link
     # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
     # unable to bind the fuzzer-related callbacks added by instrumentation.
-    add_global_arguments('-fsanitize=fuzzer-no-link',
-                         native: false, language: all_languages)
-    add_global_link_arguments('-fsanitize=fuzzer-no-link',
-                              native: false, language: all_languages)
+    qemu_common_flags += ['-fsanitize=fuzzer-no-link']
+    qemu_ldflags += ['-fsanitize=fuzzer-no-link']
     # For the actual fuzzer binaries, we need to link against the libfuzzer
     # library. They need to be configurable, to support OSS-Fuzz
     fuzz_exe_ldflags = ['-fsanitize=fuzzer']
@@ -253,6 +262,9 @@ if get_option('fuzzing')
   endif
 endif
 
+add_global_arguments(qemu_common_flags, native: false, language: all_languages)
+add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
+
 # Check that the C++ compiler exists and works with the C compiler.
 link_language = 'c'
 linker = cc
@@ -276,16 +288,9 @@ if 'cpp' in all_languages
   endif
 endif
 
-# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
-if targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN')
-  qemu_ldflags += linker.get_supported_link_arguments('-Wl,--warn-common')
-endif
-
-add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
-
-add_global_arguments(qemu_cflags, native: false, language: 'c')
-add_global_arguments(qemu_cxxflags, native: false, language: 'cpp')
-add_global_arguments(qemu_objcflags, native: false, language: 'objc')
+add_project_arguments(qemu_cflags, native: false, language: 'c')
+add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
+add_project_arguments(qemu_objcflags, native: false, language: 'objc')
 if targetos == 'linux'
   add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
                         '-isystem', 'linux-headers',
@@ -3778,12 +3783,12 @@ link_args = get_option(link_language + '_link_args')
 if link_args.length() > 0
   summary_info += {'LDFLAGS':         ' '.join(link_args)}
 endif
-summary_info += {'QEMU_CFLAGS':       ' '.join(qemu_cflags)}
+summary_info += {'QEMU_CFLAGS':       ' '.join(qemu_common_flags + qemu_cflags)}
 if 'cpp' in all_languages
-  summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_cxxflags)}
+  summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_common_flags + qemu_cxxflags)}
 endif
 if 'objc' in all_languages
-  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_objcflags)}
+  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_common_flags + qemu_objcflags)}
 endif
 summary_info += {'QEMU_LDFLAGS':      ' '.join(qemu_ldflags)}
 summary_info += {'profiler':          get_option('profiler')}
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 21/30] build: move sanitizer tests to meson
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (19 preceding siblings ...)
  2022-12-09 11:23 ` [PATCH 20/30] meson: prepare move of QEMU_CFLAGS to meson Paolo Bonzini
@ 2022-12-09 11:24 ` Paolo Bonzini
  2022-12-12 12:16   ` Marc-André Lureau
  2022-12-09 11:24 ` [PATCH 22/30] build: move SafeStack " Paolo Bonzini
                   ` (9 subsequent siblings)
  30 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:24 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure                      | 151 ---------------------------------
 docs/devel/build-system.rst    |   4 -
 meson.build                    |  63 +++++++++++++-
 meson_options.txt              |   4 +
 scripts/meson-buildoptions.sh  |   6 ++
 tests/qemu-iotests/meson.build |   2 +-
 tests/unit/meson.build         |   2 +-
 7 files changed, 73 insertions(+), 159 deletions(-)

diff --git a/configure b/configure
index b0df6c3cf754..babcf5d28a85 100755
--- a/configure
+++ b/configure
@@ -269,9 +269,6 @@ EXTRA_OBJCFLAGS=""
 EXTRA_LDFLAGS=""
 
 debug_tcg="no"
-sanitizers="no"
-tsan="no"
-fortify_source="yes"
 EXESUF=""
 prefix="/usr/local"
 qemu_suffix="qemu"
@@ -392,14 +389,6 @@ EOF
   compile_object
 }
 
-check_include() {
-cat > $TMPC <<EOF
-#include <$1>
-int main(void) { return 0; }
-EOF
-  compile_object
-}
-
 write_c_skeleton() {
     cat > $TMPC <<EOF
 int main(void) { return 0; }
@@ -755,15 +744,6 @@ for opt do
       debug_tcg="yes"
       meson_option_parse --enable-debug-mutex ""
       meson_option_add -Doptimization=0
-      fortify_source="no"
-  ;;
-  --enable-sanitizers) sanitizers="yes"
-  ;;
-  --disable-sanitizers) sanitizers="no"
-  ;;
-  --enable-tsan) tsan="yes"
-  ;;
-  --disable-tsan) tsan="no"
   ;;
   --disable-tcg) tcg="disabled"
                  plugins="no"
@@ -971,8 +951,6 @@ Advanced options (experts only):
                            desired devices in configs/devices/)
   --with-devices-ARCH=NAME override default configs/devices
   --enable-debug           enable common debug build options
-  --enable-sanitizers      enable default sanitizers
-  --enable-tsan            enable thread sanitizer
   --disable-werror         disable compilation abort on warning
   --disable-stack-protector disable compiler-provided stack protection
   --cpu=CPU                Build for host CPU [$cpu]
@@ -1547,91 +1525,6 @@ if ! compile_object "-Werror"; then
     ccache_cpp2=yes
 fi
 
-#################################################
-# clang does not support glibc + FORTIFY_SOURCE.
-
-if test "$fortify_source" != "no"; then
-  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
-    fortify_source="no";
-  elif test -n "$cxx" && has $cxx &&
-       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
-    fortify_source="no";
-  else
-    fortify_source="yes"
-  fi
-fi
-
-##########################################
-# checks for sanitizers
-
-have_asan=no
-have_ubsan=no
-have_asan_iface_h=no
-have_asan_iface_fiber=no
-
-if test "$sanitizers" = "yes" ; then
-  write_c_skeleton
-  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
-      have_asan=yes
-  fi
-
-  # we could use a simple skeleton for flags checks, but this also
-  # detect the static linking issue of ubsan, see also:
-  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
-  cat > $TMPC << EOF
-#include <stdlib.h>
-int main(void) {
-    void *tmp = malloc(10);
-    if (tmp != NULL) {
-        return *(int *)(tmp + 2);
-    }
-    return 1;
-}
-EOF
-  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
-      have_ubsan=yes
-  fi
-
-  if check_include "sanitizer/asan_interface.h" ; then
-      have_asan_iface_h=yes
-  fi
-
-  cat > $TMPC << EOF
-#include <sanitizer/asan_interface.h>
-int main(void) {
-  __sanitizer_start_switch_fiber(0, 0, 0);
-  return 0;
-}
-EOF
-  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
-      have_asan_iface_fiber=yes
-  fi
-fi
-
-# Thread sanitizer is, for now, much noisier than the other sanitizers;
-# keep it separate until that is not the case.
-if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
-  error_exit "TSAN is not supported with other sanitiziers."
-fi
-have_tsan=no
-have_tsan_iface_fiber=no
-if test "$tsan" = "yes" ; then
-  write_c_skeleton
-  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
-      have_tsan=yes
-  fi
-  cat > $TMPC << EOF
-#include <sanitizer/tsan_interface.h>
-int main(void) {
-  __tsan_create_fiber(0);
-  return 0;
-}
-EOF
-  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
-      have_tsan_iface_fiber=yes
-  fi
-fi
-
 ##########################################
 # functions to probe cross compilers
 
@@ -2057,42 +1950,6 @@ case "$vfio_user_server" in
     ;;
 esac
 
-##########################################
-# End of CC checks
-# After here, no more $cc or $ld runs
-
-write_c_skeleton
-
-if test "$fortify_source" = "yes" ; then
-  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
-fi
-
-if test "$have_asan" = "yes"; then
-  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
-  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
-  if test "$have_asan_iface_h" = "no" ; then
-      echo "ASAN build enabled, but ASAN header missing." \
-           "Without code annotation, the report may be inferior."
-  elif test "$have_asan_iface_fiber" = "no" ; then
-      echo "ASAN build enabled, but ASAN header is too old." \
-           "Without code annotation, the report may be inferior."
-  fi
-fi
-if test "$have_tsan" = "yes" ; then
-  if test "$have_tsan_iface_fiber" = "yes" ; then
-    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
-    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
-  else
-    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
-  fi
-elif test "$tsan" = "yes" ; then
-  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
-fi
-if test "$have_ubsan" = "yes"; then
-  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
-  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
-fi
-
 #######################################
 # cross-compiled firmware targets
 
@@ -2216,14 +2073,6 @@ fi
 
 echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
 
-if test "$have_asan_iface_fiber" = "yes" ; then
-    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
-fi
-
-if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
-    echo "CONFIG_TSAN=y" >> $config_host_mak
-fi
-
 if test "$plugins" = "yes" ; then
     echo "CONFIG_PLUGIN=y" >> $config_host_mak
 fi
diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst
index 66cfe7b8bdc8..4a733fc0a747 100644
--- a/docs/devel/build-system.rst
+++ b/docs/devel/build-system.rst
@@ -91,10 +91,6 @@ developers in checking for system features:
 ``check_define $NAME``
    Determine if the macro $NAME is defined by the system C compiler
 
-``check_include $NAME``
-   Determine if the include $NAME file is available to the system C
-   compiler.  The replacement in Meson is ``cc.has_header()``.
-
 ``write_c_skeleton``
    Write a minimal C program main() function to the temporary file
    indicated by $TMPC
diff --git a/meson.build b/meson.build
index dac343d14797..41a45fa495b2 100644
--- a/meson.build
+++ b/meson.build
@@ -211,6 +211,42 @@ if get_option('prefer_static')
   qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
 endif
 
+if get_option('sanitizers')
+  if cc.has_argument('-fsanitize=address')
+    qemu_cflags = ['-fsanitize=address'] + qemu_cflags
+    qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
+  endif
+
+  # Detect static linking issue with ubsan - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
+  if cc.links('''
+    #include <stdlib.h>
+    int main(void) {
+      void *tmp = malloc(10);
+      if (tmp != NULL) {
+        return *(int *)(tmp + 2);
+      }
+      return 1;
+  }''', args: [qemu_ldflags, '-fsanitize=undefined'])
+    qemu_cflags = ['-fsanitize=undefined'] + qemu_cflags
+    qemu_ldflags = ['-fsanitize=undefined'] + qemu_ldflags
+  endif
+endif
+
+# Thread sanitizer is, for now, much noisier than the other sanitizers;
+# keep it separate until that is not the case.
+if get_option('tsan')
+  if get_option('sanitizers')
+    error('TSAN is not supported with other sanitizers')
+  endif
+  if not cc.has_function('__tsan_create_fiber',
+                         args: '-fsanitize=thread',
+                         prefix: '#include <sanitizer/tsan_interface.h>')
+    error('Cannot enable TSAN due to missing fiber annotation interface')
+  endif
+  qemu_cflags = ['-fsanitize=thread'] + qemu_cflags
+  qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
+endif
+
 # Detect support for PT_GNU_RELRO + DT_BIND_NOW.
 # The combination is known as "full relro", because .got.plt is read-only too.
 qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
@@ -221,7 +257,7 @@ if targetos == 'windows'
 endif
 
 # Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
-if targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN')
+if targetos != 'sunos' and not get_option('tsan')
   qemu_ldflags += cc.get_supported_link_arguments('-Wl,--warn-common')
 endif
 
@@ -288,6 +324,16 @@ if 'cpp' in all_languages
   endif
 endif
 
+# clang does not support glibc + FORTIFY_SOURCE (is it still true?)
+if get_option('optimization') != '0' and targetos == 'linux'
+  if cc.get_id() == 'gcc'
+    qemu_cflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2']
+  endif
+  if 'cpp' in all_languages and cxx.get_id() == 'gcc'
+    qemu_cxxflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2']
+  endif
+endif
+
 add_project_arguments(qemu_cflags, native: false, language: 'c')
 add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
 add_project_arguments(qemu_objcflags, native: false, language: 'objc')
@@ -1890,6 +1936,7 @@ if seccomp.found()
 endif
 config_host_data.set('CONFIG_SNAPPY', snappy.found())
 config_host_data.set('CONFIG_TPM', have_tpm)
+config_host_data.set('CONFIG_TSAN', get_option('tsan'))
 config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
 config_host_data.set('CONFIG_VDE', vde.found())
 config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
@@ -2018,6 +2065,18 @@ if rdma.found()
                                        prefix: '#include <infiniband/verbs.h>'))
 endif
 
+have_asan_fiber = false
+if get_option('sanitizers') and \
+   not cc.has_function('__sanitizer_start_switch_fiber',
+                         args: '-fsanitize=address',
+                         prefix: '#include <sanitizer/asan_interface.h>')
+  warning('Missing ASAN due to missing fiber annotation interface')
+  warning('Without code annotation, the report may be inferior.')
+else
+  have_asan_fiber = true
+endif
+config_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
+
 # has_header_symbol
 config_host_data.set('CONFIG_BYTESWAP_H',
                      cc.has_header_symbol('byteswap.h', 'bswap_32'))
@@ -3804,7 +3863,7 @@ summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
 summary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
 summary_info += {'gprof enabled':     get_option('gprof')}
 summary_info += {'gcov':              get_option('b_coverage')}
-summary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
+summary_info += {'thread sanitizer':  get_option('tsan')}
 summary_info += {'CFI support':       get_option('cfi')}
 if get_option('cfi')
   summary_info += {'CFI debug support': get_option('cfi_debug')}
diff --git a/meson_options.txt b/meson_options.txt
index e492aaa73fbc..feeefa2ccbc1 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -84,6 +84,10 @@ option('tcg', type: 'feature', value: 'enabled',
        description: 'TCG support')
 option('tcg_interpreter', type: 'boolean', value: false,
        description: 'TCG with bytecode interpreter (slow)')
+option('sanitizers', type: 'boolean', value: false,
+       description: 'enable default sanitizers')
+option('tsan', type: 'boolean', value: false,
+       description: 'enable thread sanitizer')
 option('cfi', type: 'boolean', value: false,
        description: 'Control-Flow Integrity (CFI)')
 option('cfi_debug', type: 'boolean', value: false,
diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
index cb277347bb18..bafc40ddfbf4 100644
--- a/scripts/meson-buildoptions.sh
+++ b/scripts/meson-buildoptions.sh
@@ -36,11 +36,13 @@ meson_options_help() {
   printf "%s\n" '  --enable-qom-cast-debug  cast debugging support'
   printf "%s\n" '  --enable-rng-none        dummy RNG, avoid using /dev/(u)random and'
   printf "%s\n" '                           getrandom()'
+  printf "%s\n" '  --enable-sanitizers      enable default sanitizers'
   printf "%s\n" '  --enable-strip           Strip targets on install'
   printf "%s\n" '  --enable-tcg-interpreter TCG with bytecode interpreter (slow)'
   printf "%s\n" '  --enable-trace-backends=CHOICES'
   printf "%s\n" '                           Set available tracing backends [log] (choices:'
   printf "%s\n" '                           dtrace/ftrace/log/nop/simple/syslog/ust)'
+  printf "%s\n" '  --enable-tsan            enable thread sanitizer'
   printf "%s\n" '  --firmwarepath=VALUES    search PATH for firmware files [share/qemu-firmware]'
   printf "%s\n" '  --iasl=VALUE             Path to ACPI disassembler'
   printf "%s\n" '  --includedir=VALUE       Header file directory [include]'
@@ -388,6 +390,8 @@ _meson_option_parse() {
     --disable-replication) printf "%s" -Dreplication=disabled ;;
     --enable-rng-none) printf "%s" -Drng_none=true ;;
     --disable-rng-none) printf "%s" -Drng_none=false ;;
+    --enable-sanitizers) printf "%s" -Dsanitizers=true ;;
+    --disable-sanitizers) printf "%s" -Dsanitizers=false ;;
     --enable-sdl) printf "%s" -Dsdl=enabled ;;
     --disable-sdl) printf "%s" -Dsdl=disabled ;;
     --enable-sdl-image) printf "%s" -Dsdl_image=enabled ;;
@@ -427,6 +431,8 @@ _meson_option_parse() {
     --disable-tpm) printf "%s" -Dtpm=disabled ;;
     --enable-trace-backends=*) quote_sh "-Dtrace_backends=$2" ;;
     --with-trace-file=*) quote_sh "-Dtrace_file=$2" ;;
+    --enable-tsan) printf "%s" -Dtsan=true ;;
+    --disable-tsan) printf "%s" -Dtsan=false ;;
     --enable-u2f) printf "%s" -Du2f=enabled ;;
     --disable-u2f) printf "%s" -Du2f=disabled ;;
     --enable-usb-redir) printf "%s" -Dusb_redir=enabled ;;
diff --git a/tests/qemu-iotests/meson.build b/tests/qemu-iotests/meson.build
index 323a4acb6a3f..583468c5b9b3 100644
--- a/tests/qemu-iotests/meson.build
+++ b/tests/qemu-iotests/meson.build
@@ -2,7 +2,7 @@ if not have_tools or targetos == 'windows' or get_option('gprof')
   subdir_done()
 endif
 
-foreach cflag: config_host['QEMU_CFLAGS'].split()
+foreach cflag: qemu_ldflags
   if cflag.startswith('-fsanitize') and \
      not cflag.contains('safe-stack') and not cflag.contains('cfi-icall')
     message('Sanitizers are enabled ==> Disabled the qemu-iotests.')
diff --git a/tests/unit/meson.build b/tests/unit/meson.build
index b497a4137830..46d88b49cbcf 100644
--- a/tests/unit/meson.build
+++ b/tests/unit/meson.build
@@ -143,7 +143,7 @@ if have_system
   # Some tests: test-char, test-qdev-global-props, and test-qga,
   # are not runnable under TSan due to a known issue.
   # https://github.com/google/sanitizers/issues/1116
-  if 'CONFIG_TSAN' not in config_host
+  if not get_option('tsan')
     if 'CONFIG_POSIX' in config_host
         tests += {
           'test-char': ['socket-helpers.c', qom, io, chardev]
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 22/30] build: move SafeStack tests to meson
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (20 preceding siblings ...)
  2022-12-09 11:24 ` [PATCH 21/30] build: move sanitizer tests " Paolo Bonzini
@ 2022-12-09 11:24 ` Paolo Bonzini
  2022-12-09 12:57   ` Philippe Mathieu-Daudé
  2022-12-09 11:24 ` [PATCH 23/30] build: move coroutine backend selection " Paolo Bonzini
                   ` (8 subsequent siblings)
  30 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:24 UTC (permalink / raw)
  To: qemu-devel

This disables the old behavior of detecting SafeStack from environment
CFLAGS.  SafeStack is now enabled purely based on the configure arguments.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure                     | 73 -----------------------------------
 meson.build                   | 26 +++++++++++++
 meson_options.txt             |  2 +
 scripts/meson-buildoptions.sh |  4 ++
 4 files changed, 32 insertions(+), 73 deletions(-)

diff --git a/configure b/configure
index babcf5d28a85..fea9cbf3abd0 100755
--- a/configure
+++ b/configure
@@ -222,7 +222,6 @@ cross_compile="no"
 cross_prefix=""
 host_cc="cc"
 stack_protector=""
-safe_stack=""
 use_containers="yes"
 gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
 
@@ -779,10 +778,6 @@ for opt do
   ;;
   --disable-stack-protector) stack_protector="no"
   ;;
-  --enable-safe-stack) safe_stack="yes"
-  ;;
-  --disable-safe-stack) safe_stack="no"
-  ;;
   --enable-cfi)
       cfi="true";
       meson_option_add -Db_lto=true
@@ -969,8 +964,6 @@ cat << EOF
   bsd-user        all BSD usermode emulation targets
   pie             Position Independent Executables
   debug-tcg       TCG debugging (default is disabled)
-  safe-stack      SafeStack Stack Smash Protection. Depends on
-                  clang/llvm >= 3.7 and requires coroutine backend ucontext.
 
 NOTE: The object files are built at the place where configure is launched
 EOF
@@ -1435,68 +1428,6 @@ else
   esac
 fi
 
-##################################################
-# SafeStack
-
-
-if test "$safe_stack" = "yes"; then
-cat > $TMPC << EOF
-int main(void)
-{
-#if ! __has_feature(safe_stack)
-#error SafeStack Disabled
-#endif
-    return 0;
-}
-EOF
-  flag="-fsanitize=safe-stack"
-  # Check that safe-stack is supported and enabled.
-  if compile_prog "-Werror $flag" "$flag"; then
-    # Flag needed both at compilation and at linking
-    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
-    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
-  else
-    error_exit "SafeStack not supported by your compiler"
-  fi
-  if test "$coroutine" != "ucontext"; then
-    error_exit "SafeStack is only supported by the coroutine backend ucontext"
-  fi
-else
-cat > $TMPC << EOF
-int main(void)
-{
-#if defined(__has_feature)
-#if __has_feature(safe_stack)
-#error SafeStack Enabled
-#endif
-#endif
-    return 0;
-}
-EOF
-if test "$safe_stack" = "no"; then
-  # Make sure that safe-stack is disabled
-  if ! compile_prog "-Werror" ""; then
-    # SafeStack was already enabled, try to explicitly remove the feature
-    flag="-fno-sanitize=safe-stack"
-    if ! compile_prog "-Werror $flag" "$flag"; then
-      error_exit "Configure cannot disable SafeStack"
-    fi
-    QEMU_CFLAGS="$QEMU_CFLAGS $flag"
-    QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
-  fi
-else # "$safe_stack" = ""
-  # Set safe_stack to yes or no based on pre-existing flags
-  if compile_prog "-Werror" ""; then
-    safe_stack="no"
-  else
-    safe_stack="yes"
-    if test "$coroutine" != "ucontext"; then
-      error_exit "SafeStack is only supported by the coroutine backend ucontext"
-    fi
-  fi
-fi
-fi
-
 ########################################
 # check if ccache is interfering with
 # semantic analysis of macros
@@ -2153,10 +2084,6 @@ if test "$ccache_cpp2" = "yes"; then
   echo "export CCACHE_CPP2=y" >> $config_host_mak
 fi
 
-if test "$safe_stack" = "yes"; then
-  echo "CONFIG_SAFESTACK=y" >> $config_host_mak
-fi
-
 # tests/tcg configuration
 (config_host_mak=tests/tcg/config-host.mak
 mkdir -p tests/tcg
diff --git a/meson.build b/meson.build
index 41a45fa495b2..7ee9f081d0a1 100644
--- a/meson.build
+++ b/meson.build
@@ -211,6 +211,31 @@ if get_option('prefer_static')
   qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
 endif
 
+# Compiles if SafeStack *not* enabled
+safe_stack_probe = '''
+  int main(void)
+  {
+  #if defined(__has_feature)
+  #if __has_feature(safe_stack)
+  #error SafeStack Enabled
+  #endif
+  #endif
+      return 0;
+  }'''
+if get_option('safe_stack') != not cc.compiles(safe_stack_probe)
+  safe_stack_arg = get_option('safe_stack') ? '-fsanitize=safe-stack' : '-fno-sanitize=safe-stack'
+  if get_option('safe_stack') != not cc.compiles(safe_stack_probe, args: safe_stack_arg)
+    error(get_option('safe_stack') \
+          ? 'SafeStack not supported by your compiler' \
+          : 'Cannot disable SafeStack')
+  endif
+  qemu_cflags += safe_stack_arg
+  qemu_ldflags += safe_stack_arg
+endif
+if get_option('safe_stack') and config_host['CONFIG_COROUTINE_BACKEND'] != 'ucontext'
+  error('SafeStack is only supported with the ucontext coroutine backend')
+endif
+
 if get_option('sanitizers')
   if cc.has_argument('-fsanitize=address')
     qemu_cflags = ['-fsanitize=address'] + qemu_cflags
@@ -1928,6 +1953,7 @@ config_host_data.set('CONFIG_OPENGL', opengl.found())
 config_host_data.set('CONFIG_PROFILER', get_option('profiler'))
 config_host_data.set('CONFIG_RBD', rbd.found())
 config_host_data.set('CONFIG_RDMA', rdma.found())
+config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
 config_host_data.set('CONFIG_SDL', sdl.found())
 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
 config_host_data.set('CONFIG_SECCOMP', seccomp.found())
diff --git a/meson_options.txt b/meson_options.txt
index feeefa2ccbc1..d39d2a060ae7 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -84,6 +84,8 @@ option('tcg', type: 'feature', value: 'enabled',
        description: 'TCG support')
 option('tcg_interpreter', type: 'boolean', value: false,
        description: 'TCG with bytecode interpreter (slow)')
+option('safe_stack', type: 'boolean', value: false,
+       description: 'SafeStack Stack Smash Protection (clang/llvm >= 3.7)')
 option('sanitizers', type: 'boolean', value: false,
        description: 'enable default sanitizers')
 option('tsan', type: 'boolean', value: false,
diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
index bafc40ddfbf4..237220d9b308 100644
--- a/scripts/meson-buildoptions.sh
+++ b/scripts/meson-buildoptions.sh
@@ -36,6 +36,8 @@ meson_options_help() {
   printf "%s\n" '  --enable-qom-cast-debug  cast debugging support'
   printf "%s\n" '  --enable-rng-none        dummy RNG, avoid using /dev/(u)random and'
   printf "%s\n" '                           getrandom()'
+  printf "%s\n" '  --enable-safe-stack      SafeStack Stack Smash Protection (clang/llvm >='
+  printf "%s\n" '                           3.7)'
   printf "%s\n" '  --enable-sanitizers      enable default sanitizers'
   printf "%s\n" '  --enable-strip           Strip targets on install'
   printf "%s\n" '  --enable-tcg-interpreter TCG with bytecode interpreter (slow)'
@@ -390,6 +392,8 @@ _meson_option_parse() {
     --disable-replication) printf "%s" -Dreplication=disabled ;;
     --enable-rng-none) printf "%s" -Drng_none=true ;;
     --disable-rng-none) printf "%s" -Drng_none=false ;;
+    --enable-safe-stack) printf "%s" -Dsafe_stack=true ;;
+    --disable-safe-stack) printf "%s" -Dsafe_stack=false ;;
     --enable-sanitizers) printf "%s" -Dsanitizers=true ;;
     --disable-sanitizers) printf "%s" -Dsanitizers=false ;;
     --enable-sdl) printf "%s" -Dsdl=enabled ;;
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 23/30] build: move coroutine backend selection to meson
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (21 preceding siblings ...)
  2022-12-09 11:24 ` [PATCH 22/30] build: move SafeStack " Paolo Bonzini
@ 2022-12-09 11:24 ` Paolo Bonzini
  2022-12-12 12:18   ` Marc-André Lureau
  2022-12-09 11:24 ` [PATCH 24/30] build: move stack protector flag " Paolo Bonzini
                   ` (7 subsequent siblings)
  30 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:24 UTC (permalink / raw)
  To: qemu-devel

To simplify the code, rename coroutine-win32.c to match the option
passed to configure.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure                                     | 62 -------------------
 meson.build                                   | 32 +++++++++-
 meson_options.txt                             |  3 +
 scripts/meson-buildoptions.py                 |  1 +
 scripts/meson-buildoptions.sh                 |  3 +
 ...{coroutine-win32.c => coroutine-windows.c} |  0
 util/meson.build                              |  2 +-
 7 files changed, 38 insertions(+), 65 deletions(-)
 rename util/{coroutine-win32.c => coroutine-windows.c} (100%)

diff --git a/configure b/configure
index fea9cbf3abd0..1f7c5bbba4b9 100755
--- a/configure
+++ b/configure
@@ -275,7 +275,6 @@ softmmu="yes"
 linux_user=""
 bsd_user=""
 pie=""
-coroutine=""
 plugins="$default_feature"
 meson=""
 ninja=""
@@ -792,8 +791,6 @@ for opt do
   ;;
   --enable-fdt=*) fdt="$optarg"
   ;;
-  --with-coroutine=*) coroutine="$optarg"
-  ;;
   --with-git=*) git="$optarg"
   ;;
   --with-git-submodules=*)
@@ -949,8 +946,6 @@ Advanced options (experts only):
   --disable-werror         disable compilation abort on warning
   --disable-stack-protector disable compiler-provided stack protection
   --cpu=CPU                Build for host CPU [$cpu]
-  --with-coroutine=BACKEND coroutine backend. Supported options:
-                           ucontext, sigaltstack, windows
   --enable-plugins
                            enable plugins via shared library loading
   --disable-containers     don't use containers for cross-building
@@ -1373,61 +1368,6 @@ case "$fdt" in
     ;;
 esac
 
-##########################################
-# check and set a backend for coroutine
-
-# We prefer ucontext, but it's not always possible. The fallback
-# is sigcontext. On Windows the only valid backend is the Windows
-# specific one.
-
-ucontext_works=no
-if test "$darwin" != "yes"; then
-  cat > $TMPC << EOF
-#include <ucontext.h>
-#ifdef __stub_makecontext
-#error Ignoring glibc stub makecontext which will always fail
-#endif
-int main(void) { makecontext(0, 0, 0); return 0; }
-EOF
-  if compile_prog "" "" ; then
-    ucontext_works=yes
-  fi
-fi
-
-if test "$coroutine" = ""; then
-  if test "$mingw32" = "yes"; then
-    coroutine=win32
-  elif test "$ucontext_works" = "yes"; then
-    coroutine=ucontext
-  else
-    coroutine=sigaltstack
-  fi
-else
-  case $coroutine in
-  windows)
-    if test "$mingw32" != "yes"; then
-      error_exit "'windows' coroutine backend only valid for Windows"
-    fi
-    # Unfortunately the user visible backend name doesn't match the
-    # coroutine-*.c filename for this case, so we have to adjust it here.
-    coroutine=win32
-    ;;
-  ucontext)
-    if test "$ucontext_works" != "yes"; then
-      error_exit "'ucontext' backend requested but makecontext not available"
-    fi
-    ;;
-  sigaltstack)
-    if test "$mingw32" = "yes"; then
-      error_exit "only the 'windows' coroutine backend is valid for Windows"
-    fi
-    ;;
-  *)
-    error_exit "unknown coroutine backend $coroutine"
-    ;;
-  esac
-fi
-
 ########################################
 # check if ccache is interfering with
 # semantic analysis of macros
@@ -2002,8 +1942,6 @@ if [ "$bsd" = "yes" ] ; then
   echo "CONFIG_BSD=y" >> $config_host_mak
 fi
 
-echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
-
 if test "$plugins" = "yes" ; then
     echo "CONFIG_PLUGIN=y" >> $config_host_mak
 fi
diff --git a/meson.build b/meson.build
index 7ee9f081d0a1..b9df49667a19 100644
--- a/meson.build
+++ b/meson.build
@@ -211,6 +211,34 @@ if get_option('prefer_static')
   qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
 endif
 
+coroutine_backend = get_option('coroutine_backend')
+ucontext_probe = '''
+  #include <ucontext.h>
+  #ifdef __stub_makecontext
+  #error Ignoring glibc stub makecontext which will always fail
+  #endif
+  int main(void) { makecontext(0, 0, 0); return 0; }'''
+
+# On Windows the only valid backend is the Windows specific one.
+# For POSIX prefer ucontext, but it's not always possible. The fallback
+# is sigcontext.
+supported_backends = []
+if targetos == 'windows'
+  supported_backends += ['windows']
+else
+  if targetos != 'darwin' and cc.links(ucontext_probe)
+    supported_backends += ['ucontext']
+  endif
+  supported_backends += ['sigaltstack']
+endif
+
+if coroutine_backend == 'auto'
+  coroutine_backend = supported_backends[0]
+elif coroutine_backend not in supported_backends
+  error('"@0@" backend requested but not available.  Available backends: @1@' \
+        .format(coroutine_backend, ', '.join(supported_backends)))
+endif
+
 # Compiles if SafeStack *not* enabled
 safe_stack_probe = '''
   int main(void)
@@ -232,7 +260,7 @@ if get_option('safe_stack') != not cc.compiles(safe_stack_probe)
   qemu_cflags += safe_stack_arg
   qemu_ldflags += safe_stack_arg
 endif
-if get_option('safe_stack') and config_host['CONFIG_COROUTINE_BACKEND'] != 'ucontext'
+if get_option('safe_stack') and coroutine_backend != 'ucontext'
   error('SafeStack is only supported with the ucontext coroutine backend')
 endif
 
@@ -3949,7 +3977,7 @@ summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
 
 # Block layer
 summary_info = {}
-summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
+summary_info += {'coroutine backend': coroutine_backend}
 summary_info += {'coroutine pool':    have_coroutine_pool}
 if have_block
   summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
diff --git a/meson_options.txt b/meson_options.txt
index d39d2a060ae7..126f89517e9a 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -33,6 +33,9 @@ option('fuzzing_engine', type : 'string', value : '',
        description: 'fuzzing engine library for OSS-Fuzz')
 option('trace_file', type: 'string', value: 'trace',
        description: 'Trace file prefix for simple backend')
+option('coroutine_backend', type: 'combo',
+       choices: ['ucontext', 'sigaltstack', 'windows', 'auto'],
+       value: 'auto', description: 'coroutine backend to use')
 
 # Everything else can be set via --enable/--disable-* option
 # on the configure script command line.  After adding an option
diff --git a/scripts/meson-buildoptions.py b/scripts/meson-buildoptions.py
index 8e4e5c4e8bd6..66a79cf37ea8 100755
--- a/scripts/meson-buildoptions.py
+++ b/scripts/meson-buildoptions.py
@@ -35,6 +35,7 @@
 OPTION_NAMES = {
     "b_coverage": "gcov",
     "b_lto": "lto",
+    "coroutine_backend": "with-coroutine",
     "debug": "debug-info",
     "malloc": "enable-malloc",
     "pkgversion": "with-pkgversion",
diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
index 237220d9b308..29695ac88eea 100644
--- a/scripts/meson-buildoptions.sh
+++ b/scripts/meson-buildoptions.sh
@@ -59,6 +59,8 @@ meson_options_help() {
   printf "%s\n" '  --sysconfdir=VALUE       Sysconf data directory [etc]'
   printf "%s\n" '  --tls-priority=VALUE     Default TLS protocol/cipher priority string'
   printf "%s\n" '                           [NORMAL]'
+  printf "%s\n" '  --with-coroutine=CHOICE  coroutine backend to use (choices:'
+  printf "%s\n" '                           auto/sigaltstack/ucontext/windows)'
   printf "%s\n" '  --with-pkgversion=VALUE  use specified string as sub-version of the'
   printf "%s\n" '                           package'
   printf "%s\n" '  --with-trace-file=VALUE  Trace file prefix for simple backend [trace]'
@@ -236,6 +238,7 @@ _meson_option_parse() {
     --disable-cocoa) printf "%s" -Dcocoa=disabled ;;
     --enable-coreaudio) printf "%s" -Dcoreaudio=enabled ;;
     --disable-coreaudio) printf "%s" -Dcoreaudio=disabled ;;
+    --with-coroutine=*) quote_sh "-Dcoroutine_backend=$2" ;;
     --enable-coroutine-pool) printf "%s" -Dcoroutine_pool=true ;;
     --disable-coroutine-pool) printf "%s" -Dcoroutine_pool=false ;;
     --enable-crypto-afalg) printf "%s" -Dcrypto_afalg=enabled ;;
diff --git a/util/coroutine-win32.c b/util/coroutine-windows.c
similarity index 100%
rename from util/coroutine-win32.c
rename to util/coroutine-windows.c
diff --git a/util/meson.build b/util/meson.build
index 25b9b61f9817..b2a0aea21beb 100644
--- a/util/meson.build
+++ b/util/meson.build
@@ -74,7 +74,7 @@ if have_block or have_ga
   util_ss.add(files('lockcnt.c'))
   util_ss.add(files('main-loop.c'))
   util_ss.add(files('qemu-coroutine.c', 'qemu-coroutine-lock.c', 'qemu-coroutine-io.c'))
-  util_ss.add(files('coroutine-@0@.c'.format(config_host['CONFIG_COROUTINE_BACKEND'])))
+  util_ss.add(files(f'coroutine-@coroutine_backend@.c'))
   util_ss.add(files('thread-pool.c', 'qemu-timer.c'))
   util_ss.add(files('qemu-sockets.c'))
 endif
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 24/30] build: move stack protector flag selection to meson
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (22 preceding siblings ...)
  2022-12-09 11:24 ` [PATCH 23/30] build: move coroutine backend selection " Paolo Bonzini
@ 2022-12-09 11:24 ` Paolo Bonzini
  2022-12-12 12:22   ` Marc-André Lureau
  2022-12-09 11:24 ` [PATCH 25/30] build: move warning " Paolo Bonzini
                   ` (6 subsequent siblings)
  30 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:24 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure                     | 44 ++---------------------------------
 meson.build                   | 28 +++++++++++++++++++++-
 meson_options.txt             |  2 ++
 scripts/meson-buildoptions.sh |  3 +++
 4 files changed, 34 insertions(+), 43 deletions(-)

diff --git a/configure b/configure
index 1f7c5bbba4b9..5d31294f316f 100755
--- a/configure
+++ b/configure
@@ -175,7 +175,7 @@ compile_prog() {
   local_cflags="$1"
   local_ldflags="$2"
   do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
-      $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
+      $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $local_ldflags
 }
 
 # symbolically link $1 to $2.  Portable version of "ln -sf".
@@ -221,7 +221,6 @@ static="no"
 cross_compile="no"
 cross_prefix=""
 host_cc="cc"
-stack_protector=""
 use_containers="yes"
 gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
 
@@ -370,8 +369,6 @@ sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
 QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv"
 QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
 
-QEMU_LDFLAGS=
-
 # Flags that are needed during configure but later taken care of by Meson
 CONFIGURE_CFLAGS="-std=gnu11 -Wall"
 CONFIGURE_LDFLAGS=
@@ -773,10 +770,6 @@ for opt do
   ;;
   --disable-werror) werror="no"
   ;;
-  --enable-stack-protector) stack_protector="yes"
-  ;;
-  --disable-stack-protector) stack_protector="no"
-  ;;
   --enable-cfi)
       cfi="true";
       meson_option_add -Db_lto=true
@@ -944,7 +937,6 @@ Advanced options (experts only):
   --with-devices-ARCH=NAME override default configs/devices
   --enable-debug           enable common debug build options
   --disable-werror         disable compilation abort on warning
-  --disable-stack-protector disable compiler-provided stack protection
   --cpu=CPU                Build for host CPU [$cpu]
   --enable-plugins
                            enable plugins via shared library loading
@@ -1157,7 +1149,7 @@ EOF
     optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
     do_objc -Werror $optflag \
       $OBJCFLAGS $EXTRA_OBJCFLAGS $CONFIGURE_OBJCFLAGS $QEMU_OBJCFLAGS \
-      -o $TMPE $TMPM $QEMU_LDFLAGS
+      -o $TMPE $TMPM
 }
 
 for flag in $gcc_flags; do
@@ -1169,37 +1161,6 @@ for flag in $gcc_flags; do
     fi
 done
 
-if test "$stack_protector" != "no"; then
-  cat > $TMPC << EOF
-int main(int argc, char *argv[])
-{
-    char arr[64], *p = arr, *c = argv[argc - 1];
-    while (*c) {
-        *p++ = *c++;
-    }
-    return 0;
-}
-EOF
-  gcc_flags="-fstack-protector-strong -fstack-protector-all"
-  sp_on=0
-  for flag in $gcc_flags; do
-    # We need to check both a compile and a link, since some compiler
-    # setups fail only on a .c->.o compile and some only at link time
-    if compile_object "-Werror $flag" &&
-       compile_prog "-Werror $flag" ""; then
-      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
-      QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
-      sp_on=1
-      break
-    fi
-  done
-  if test "$stack_protector" = yes; then
-    if test $sp_on = 0; then
-      error_exit "Stack protector not supported"
-    fi
-  fi
-fi
-
 # Disable -Wmissing-braces on older compilers that warn even for
 # the "universal" C zero initializer {0}.
 cat > $TMPC << EOF
@@ -1968,7 +1929,6 @@ echo "PKG_CONFIG=${pkg_config_exe}" >> $config_host_mak
 echo "CC=$cc" >> $config_host_mak
 echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
 echo "QEMU_OBJCFLAGS=$QEMU_OBJCFLAGS" >> $config_host_mak
-echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
 echo "EXESUF=$EXESUF" >> $config_host_mak
 
 # use included Linux headers
diff --git a/meson.build b/meson.build
index b9df49667a19..c5a8dce9e1d6 100644
--- a/meson.build
+++ b/meson.build
@@ -200,7 +200,7 @@ foreach arg : config_host['QEMU_CFLAGS'].split()
   endif
 endforeach
 qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
-qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
+qemu_ldflags = []
 
 if get_option('gprof')
   qemu_common_flags += ['-p']
@@ -211,6 +211,32 @@ if get_option('prefer_static')
   qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
 endif
 
+if not get_option('stack_protector').disabled()
+  stack_protector_probe = '''
+    int main(int argc, char *argv[])
+    {
+      char arr[64], *p = arr, *c = argv[argc - 1];
+      while (*c) {
+          *p++ = *c++;
+      }
+      return 0;
+    }'''
+  have_stack_protector = false
+  foreach arg : ['-fstack-protector-strong', '-fstack-protector-all']
+    # We need to check both a compile and a link, since some compiler
+    # setups fail only on a .c->.o compile and some only at link time
+    if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \
+       cc.links(stack_protector_probe, args: ['-Werror', arg])
+      have_stack_protector = true
+      qemu_cflags += arg
+      qemu_ldflags += arg
+      break
+    endif
+  endforeach
+  get_option('stack_protector') \
+    .require(have_stack_protector, error_message: 'Stack protector not supported')
+endif
+
 coroutine_backend = get_option('coroutine_backend')
 ucontext_probe = '''
   #include <ucontext.h>
diff --git a/meson_options.txt b/meson_options.txt
index 126f89517e9a..98456b7cf2ea 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -93,6 +93,8 @@ option('sanitizers', type: 'boolean', value: false,
        description: 'enable default sanitizers')
 option('tsan', type: 'boolean', value: false,
        description: 'enable thread sanitizer')
+option('stack_protector', type: 'feature', value: 'auto',
+       description: 'compiler-provided stack protection')
 option('cfi', type: 'boolean', value: false,
        description: 'Control-Flow Integrity (CFI)')
 option('cfi_debug', type: 'boolean', value: false,
diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
index 29695ac88eea..a87b3702e955 100644
--- a/scripts/meson-buildoptions.sh
+++ b/scripts/meson-buildoptions.sh
@@ -157,6 +157,7 @@ meson_options_help() {
   printf "%s\n" '  sparse          sparse checker'
   printf "%s\n" '  spice           Spice server support'
   printf "%s\n" '  spice-protocol  Spice protocol support'
+  printf "%s\n" '  stack-protector compiler-provided stack protection'
   printf "%s\n" '  tcg             TCG support'
   printf "%s\n" '  tools           build support utilities that come with QEMU'
   printf "%s\n" '  tpm             TPM support'
@@ -424,6 +425,8 @@ _meson_option_parse() {
     --disable-spice) printf "%s" -Dspice=disabled ;;
     --enable-spice-protocol) printf "%s" -Dspice_protocol=enabled ;;
     --disable-spice-protocol) printf "%s" -Dspice_protocol=disabled ;;
+    --enable-stack-protector) printf "%s" -Dstack_protector=enabled ;;
+    --disable-stack-protector) printf "%s" -Dstack_protector=disabled ;;
     --enable-strip) printf "%s" -Dstrip=true ;;
     --disable-strip) printf "%s" -Dstrip=false ;;
     --sysconfdir=*) quote_sh "-Dsysconfdir=$2" ;;
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 25/30] build: move warning flag selection to meson
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (23 preceding siblings ...)
  2022-12-09 11:24 ` [PATCH 24/30] build: move stack protector flag " Paolo Bonzini
@ 2022-12-09 11:24 ` Paolo Bonzini
  2022-12-12 12:58   ` Marc-André Lureau
  2022-12-09 11:24 ` [PATCH 26/30] build: move remaining compiler flag tests " Paolo Bonzini
                   ` (5 subsequent siblings)
  30 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:24 UTC (permalink / raw)
  To: qemu-devel

Meson already knows to test with the positive form of the flag, which
simplifies the test.  Warnings are now tested explicitly for the C++
compiler, instead of hardcoding those that are only available for
the C language.

At this point all compiler flags in QEMU_CFLAGS are global and only
depend on the OS.  No feature tests are performed in configure.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure                | 94 ----------------------------------------
 contrib/plugins/Makefile |  3 +-
 meson.build              | 72 ++++++++++++++++++++----------
 3 files changed, 51 insertions(+), 118 deletions(-)

diff --git a/configure b/configure
index 5d31294f316f..6df61f4337e4 100755
--- a/configure
+++ b/configure
@@ -75,7 +75,6 @@ fi
 TMPB="qemu-conf"
 TMPC="${TMPDIR1}/${TMPB}.c"
 TMPO="${TMPDIR1}/${TMPB}.o"
-TMPM="${TMPDIR1}/${TMPB}.m"
 TMPE="${TMPDIR1}/${TMPB}.exe"
 
 rm -f config.log
@@ -157,15 +156,6 @@ do_cc() {
     do_compiler_werror "$cc" $CPU_CFLAGS "$@"
 }
 
-do_objc() {
-    do_compiler_werror "$objcc" $CPU_CFLAGS "$@"
-}
-
-# Append $2 to the variable named $1, with space separation
-add_to() {
-    eval $1=\${$1:+\"\$$1 \"}\$2
-}
-
 compile_object() {
   local_cflags="$1"
   do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
@@ -1091,89 +1081,6 @@ if ! compile_prog "" "" ; then
     error_exit "You need at least GCC v7.4 or Clang v6.0 (or XCode Clang v10.0)"
 fi
 
-# Accumulate -Wfoo and -Wno-bar separately.
-# We will list all of the enable flags first, and the disable flags second.
-# Note that we do not add -Werror, because that would enable it for all
-# configure tests. If a configure test failed due to -Werror this would
-# just silently disable some features, so it's too error prone.
-
-warn_flags=
-add_to warn_flags -Wundef
-add_to warn_flags -Wwrite-strings
-add_to warn_flags -Wmissing-prototypes
-add_to warn_flags -Wstrict-prototypes
-add_to warn_flags -Wredundant-decls
-add_to warn_flags -Wold-style-declaration
-add_to warn_flags -Wold-style-definition
-add_to warn_flags -Wtype-limits
-add_to warn_flags -Wformat-security
-add_to warn_flags -Wformat-y2k
-add_to warn_flags -Winit-self
-add_to warn_flags -Wignored-qualifiers
-add_to warn_flags -Wempty-body
-add_to warn_flags -Wnested-externs
-add_to warn_flags -Wendif-labels
-add_to warn_flags -Wexpansion-to-defined
-add_to warn_flags -Wimplicit-fallthrough=2
-
-nowarn_flags=
-add_to nowarn_flags -Wno-initializer-overrides
-add_to nowarn_flags -Wno-missing-include-dirs
-add_to nowarn_flags -Wno-shift-negative-value
-add_to nowarn_flags -Wno-string-plus-int
-add_to nowarn_flags -Wno-typedef-redefinition
-add_to nowarn_flags -Wno-tautological-type-limit-compare
-add_to nowarn_flags -Wno-psabi
-add_to nowarn_flags -Wno-gnu-variable-sized-type-not-at-end
-
-gcc_flags="$warn_flags $nowarn_flags"
-
-cc_has_warning_flag() {
-    write_c_skeleton;
-
-    # Use the positive sense of the flag when testing for -Wno-wombat
-    # support (gcc will happily accept the -Wno- form of unknown
-    # warning options).
-    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
-    compile_prog "-Werror $optflag" ""
-}
-
-objcc_has_warning_flag() {
-    cat > $TMPM <<EOF
-int main(void) { return 0; }
-EOF
-
-    # Use the positive sense of the flag when testing for -Wno-wombat
-    # support (gcc will happily accept the -Wno- form of unknown
-    # warning options).
-    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
-    do_objc -Werror $optflag \
-      $OBJCFLAGS $EXTRA_OBJCFLAGS $CONFIGURE_OBJCFLAGS $QEMU_OBJCFLAGS \
-      -o $TMPE $TMPM
-}
-
-for flag in $gcc_flags; do
-    if cc_has_warning_flag $flag ; then
-        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
-    fi
-    if objcc_has_warning_flag $flag ; then
-        QEMU_OBJCFLAGS="$QEMU_OBJCFLAGS $flag"
-    fi
-done
-
-# Disable -Wmissing-braces on older compilers that warn even for
-# the "universal" C zero initializer {0}.
-cat > $TMPC << EOF
-struct {
-  int a[2];
-} x = {0};
-EOF
-if compile_object "-Werror" "" ; then
-  :
-else
-  QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
-fi
-
 # Resolve default for --enable-plugins
 if test "$static" = "yes" ; then
   if test "$plugins" = "yes"; then
@@ -1928,7 +1835,6 @@ echo "NINJA=$ninja" >> $config_host_mak
 echo "PKG_CONFIG=${pkg_config_exe}" >> $config_host_mak
 echo "CC=$cc" >> $config_host_mak
 echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
-echo "QEMU_OBJCFLAGS=$QEMU_OBJCFLAGS" >> $config_host_mak
 echo "EXESUF=$EXESUF" >> $config_host_mak
 
 # use included Linux headers
diff --git a/contrib/plugins/Makefile b/contrib/plugins/Makefile
index 8a316cd76f2f..b2b9db9f51af 100644
--- a/contrib/plugins/Makefile
+++ b/contrib/plugins/Makefile
@@ -27,8 +27,7 @@ SONAMES := $(addsuffix .so,$(addprefix lib,$(NAMES)))
 # The main QEMU uses Glib extensively so it's perfectly fine to use it
 # in plugins (which many example do).
 CFLAGS := $(shell $(PKG_CONFIG) --cflags glib-2.0)
-CFLAGS += -fPIC -Wall $(filter -W%, $(QEMU_CFLAGS))
-CFLAGS += $(if $(findstring no-psabi,$(QEMU_CFLAGS)),-Wpsabi)
+CFLAGS += -fPIC -Wall
 CFLAGS += $(if $(CONFIG_DEBUG_TCG), -ggdb -O0)
 CFLAGS += -I$(SRC_PATH)/include/qemu
 
diff --git a/meson.build b/meson.build
index c5a8dce9e1d6..4ec8104b73a3 100644
--- a/meson.build
+++ b/meson.build
@@ -190,16 +190,8 @@ endif
 # Compiler flags #
 ##################
 
-qemu_common_flags = []
+qemu_common_flags = config_host['QEMU_CFLAGS'].split()
 qemu_cflags = []
-foreach arg : config_host['QEMU_CFLAGS'].split()
-  if arg.startswith('-W')
-    qemu_cflags += arg
-  else
-    qemu_common_flags += arg
-  endif
-endforeach
-qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
 qemu_ldflags = []
 
 if get_option('gprof')
@@ -380,20 +372,49 @@ endif
 add_global_arguments(qemu_common_flags, native: false, language: all_languages)
 add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
 
+# Collect warnings that we want to enable
+
+warn_flags = [
+  '-Wundef',
+  '-Wwrite-strings',
+  '-Wmissing-prototypes',
+  '-Wstrict-prototypes',
+  '-Wredundant-decls',
+  '-Wold-style-declaration',
+  '-Wold-style-definition',
+  '-Wtype-limits',
+  '-Wformat-security',
+  '-Wformat-y2k',
+  '-Winit-self',
+  '-Wignored-qualifiers',
+  '-Wempty-body',
+  '-Wnested-externs',
+  '-Wendif-labels',
+  '-Wexpansion-to-defined',
+  '-Wimplicit-fallthrough=2',
+  '-Wno-initializer-overrides',
+  '-Wno-missing-include-dirs',
+  '-Wno-shift-negative-value',
+  '-Wno-string-plus-int',
+  '-Wno-typedef-redefinition',
+  '-Wno-tautological-type-limit-compare',
+  '-Wno-psabi',
+  '-Wno-gnu-variable-sized-type-not-at-end',
+]
+
+if not cc.compiles('''
+  struct {
+    int a[2];
+  } x = {0};''', args: ['-Werror'])
+  warn_flags += ['-Wno-missing-braces']
+endif
+
 # Check that the C++ compiler exists and works with the C compiler.
 link_language = 'c'
 linker = cc
 qemu_cxxflags = []
 if 'cpp' in all_languages
-  add_global_arguments(['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'],
-                       native: false, language: 'cpp')
-  foreach k: qemu_cflags
-    if k not in ['-Wstrict-prototypes', '-Wmissing-prototypes', '-Wnested-externs',
-                 '-Wold-style-declaration', '-Wold-style-definition', '-Wredundant-decls']
-      qemu_cxxflags += [k]
-    endif
-  endforeach
-
+  qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags
   if cxx.links(files('scripts/main.c'), args: qemu_cflags)
     link_language = 'cpp'
     linker = cxx
@@ -413,9 +434,16 @@ if get_option('optimization') != '0' and targetos == 'linux'
   endif
 endif
 
-add_project_arguments(qemu_cflags, native: false, language: 'c')
-add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
-add_project_arguments(qemu_objcflags, native: false, language: 'objc')
+add_project_arguments(qemu_cflags, native: false, language: 'objc')
+add_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c')
+if 'cpp' in all_languages
+  add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
+  add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp')
+endif
+if 'objc' in all_languages
+  # Note sanitizer flags are not applied to Objective-C sources!
+  add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc')
+endif
 if targetos == 'linux'
   add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
                         '-isystem', 'linux-headers',
@@ -3927,7 +3955,7 @@ if 'cpp' in all_languages
   summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_common_flags + qemu_cxxflags)}
 endif
 if 'objc' in all_languages
-  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_common_flags + qemu_objcflags)}
+  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_common_flags)}
 endif
 summary_info += {'QEMU_LDFLAGS':      ' '.join(qemu_ldflags)}
 summary_info += {'profiler':          get_option('profiler')}
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 26/30] build: move remaining compiler flag tests to meson
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (24 preceding siblings ...)
  2022-12-09 11:24 ` [PATCH 25/30] build: move warning " Paolo Bonzini
@ 2022-12-09 11:24 ` Paolo Bonzini
  2022-12-12 13:54   ` Marc-André Lureau
  2022-12-09 11:24 ` [PATCH 27/30] build: move compiler version check " Paolo Bonzini
                   ` (4 subsequent siblings)
  30 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:24 UTC (permalink / raw)
  To: qemu-devel

Remove the only remaining uses of QEMU_CFLAGS.  Now that no
feature tests are done in configure, it is possible to remove
CONFIGURE_CFLAGS and CONFIGURE_LDFLAGS as well.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure   | 79 ++++++++---------------------------------------------
 meson.build | 49 ++++++++++++++++++++++++++++++++-
 2 files changed, 59 insertions(+), 69 deletions(-)

diff --git a/configure b/configure
index 6df61f4337e4..d5491fc3b986 100755
--- a/configure
+++ b/configure
@@ -158,14 +158,14 @@ do_cc() {
 
 compile_object() {
   local_cflags="$1"
-  do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
+  do_cc $CFLAGS $EXTRA_CFLAGS $local_cflags -c -o $TMPO $TMPC
 }
 
 compile_prog() {
   local_cflags="$1"
   local_ldflags="$2"
-  do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
-      $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $local_ldflags
+  do_cc $CFLAGS $EXTRA_CFLAGS $local_cflags -o $TMPE $TMPC \
+      $LDFLAGS $EXTRA_LDFLAGS $local_ldflags
 }
 
 # symbolically link $1 to $2.  Portable version of "ln -sf".
@@ -351,19 +351,6 @@ windres="${WINDRES-${cross_prefix}windres}"
 pkg_config="${PKG_CONFIG-${cross_prefix}pkg-config}"
 sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
 
-# default flags for all hosts
-# We use -fwrapv to tell the compiler that we require a C dialect where
-# left shift of signed integers is well defined and has the expected
-# 2s-complement style results. (Both clang and gcc agree that it
-# provides these semantics.)
-QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv"
-QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
-
-# Flags that are needed during configure but later taken care of by Meson
-CONFIGURE_CFLAGS="-std=gnu11 -Wall"
-CONFIGURE_LDFLAGS=
-
-
 check_define() {
 cat > $TMPC <<EOF
 #if !defined($1)
@@ -442,21 +429,13 @@ openbsd)
 darwin)
   bsd="yes"
   darwin="yes"
-  # Disable attempts to use ObjectiveC features in os/object.h since they
-  # won't work when we're compiling with gcc as a C compiler.
-  QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
 ;;
 sunos)
   solaris="yes"
   make="${MAKE-gmake}"
-# needed for CMSG_ macros in sys/socket.h
-  QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
-# needed for TIOCWIN* defines in termios.h
-  QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
 ;;
 haiku)
   pie="no"
-  QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -D_BSD_SOURCE -fPIC $QEMU_CFLAGS"
 ;;
 linux)
   linux="yes"
@@ -589,8 +568,6 @@ fi
 
 if test "$mingw32" = "yes" ; then
   EXESUF=".exe"
-  # MinGW needs -mthreads for TLS and macro _MT.
-  CONFIGURE_CFLAGS="-mthreads $CONFIGURE_CFLAGS"
   prefix="/qemu"
   bindir=""
   qemu_suffix=""
@@ -1102,59 +1079,26 @@ static THREAD int tls_var;
 int main(void) { return tls_var; }
 EOF
 
-# Meson currently only handles pie as a boolean for now so if we have
-# explicitly disabled PIE we need to extend our cflags because it wont.
 if test "$static" = "yes"; then
   if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then
-    CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
     pie="yes"
   elif test "$pie" = "yes"; then
     error_exit "-static-pie not available due to missing toolchain support"
   else
     pie="no"
-    QEMU_CFLAGS="-fno-pie -no-pie $QEMU_CFLAGS"
   fi
-elif test "$pie" = "no"; then
-  if compile_prog "-Werror -fno-pie" "-no-pie"; then
-    CONFIGURE_CFLAGS="-fno-pie $CONFIGURE_CFLAGS"
-    CONFIGURE_LDFLAGS="-no-pie $CONFIGURE_LDFLAGS"
-    QEMU_CFLAGS="-fno-pie -no-pie $QEMU_CFLAGS"
+elif test "$pie" != "no"; then
+  if compile_prog "-Werror -fPIE -DPIE" "-pie"; then
+    pie="yes"
+  elif test "$pie" = "yes"; then
+    error_exit "PIE not available due to missing toolchain support"
+  else
+    echo "Disabling PIE due to missing toolchain support"
+    pie="no"
   fi
-elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
-  CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
-  CONFIGURE_LDFLAGS="-pie $CONFIGURE_LDFLAGS"
-  pie="yes"
-elif test "$pie" = "yes"; then
-  error_exit "PIE not available due to missing toolchain support"
-else
-  echo "Disabling PIE due to missing toolchain support"
-  pie="no"
 fi
 
 ##########################################
-# __sync_fetch_and_and requires at least -march=i486. Many toolchains
-# use i686 as default anyway, but for those that don't, an explicit
-# specification is necessary
-
-if test "$cpu" = "i386"; then
-  cat > $TMPC << EOF
-static int sfaa(int *ptr)
-{
-  return __sync_fetch_and_and(ptr, 0);
-}
-
-int main(void)
-{
-  int val = 42;
-  val = __sync_val_compare_and_swap(&val, 0, 1);
-  sfaa(&val);
-  return val;
-}
-EOF
-  if ! compile_prog "" "" ; then
-    QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
-  fi
-fi
 
 if test -z "${target_list+xxx}" ; then
     default_targets=yes
@@ -1834,7 +1778,6 @@ echo "MESON=$meson" >> $config_host_mak
 echo "NINJA=$ninja" >> $config_host_mak
 echo "PKG_CONFIG=${pkg_config_exe}" >> $config_host_mak
 echo "CC=$cc" >> $config_host_mak
-echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
 echo "EXESUF=$EXESUF" >> $config_host_mak
 
 # use included Linux headers
diff --git a/meson.build b/meson.build
index 4ec8104b73a3..01c6ac0045bc 100644
--- a/meson.build
+++ b/meson.build
@@ -190,10 +190,50 @@ endif
 # Compiler flags #
 ##################
 
-qemu_common_flags = config_host['QEMU_CFLAGS'].split()
+# default flags for all hosts
+# We use -fwrapv to tell the compiler that we require a C dialect where
+# left shift of signed integers is well defined and has the expected
+# 2s-complement style results. (Both clang and gcc agree that it
+# provides these semantics.)
+
+qemu_common_flags = [
+  '-D_GNU_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE',
+  '-fno-strict-aliasing', '-fno-common', '-fwrapv' ]
 qemu_cflags = []
 qemu_ldflags = []
 
+if targetos == 'darwin'
+  # Disable attempts to use ObjectiveC features in os/object.h since they
+  # won't work when we're compiling with gcc as a C compiler.
+  qemu_common_flags += '-DOS_OBJECT_USE_OBJC=0'
+elif targetos == 'solaris'
+  # needed for CMSG_ macros in sys/socket.h
+  qemu_common_flags += '-D_XOPEN_SOURCE=600'
+  # needed for TIOCWIN* defines in termios.h
+  qemu_common_flags += '-D__EXTENSIONS__'
+elif targetos == 'haiku'
+  qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC']
+endif
+
+# __sync_fetch_and_and requires at least -march=i486. Many toolchains
+# use i686 as default anyway, but for those that don't, an explicit
+# specification is necessary
+if host_arch == 'i386' and not cc.links('''
+  static int sfaa(int *ptr)
+  {
+    return __sync_fetch_and_and(ptr, 0);
+  }
+
+  int main(void)
+  {
+    int val = 42;
+    val = __sync_val_compare_and_swap(&val, 0, 1);
+    sfaa(&val);
+    return val;
+  }''')
+  qemu_common_flags = ['-march=i486'] + qemu_common_flags
+endif
+
 if get_option('gprof')
   qemu_common_flags += ['-p']
   qemu_ldflags += ['-p']
@@ -203,6 +243,13 @@ if get_option('prefer_static')
   qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
 endif
 
+# Meson currently only handles pie as a boolean for now, so if the user
+# has explicitly disabled PIE we need to extend our cflags.
+if not get_option('b_pie')
+  qemu_cflags += cc.get_supported_arguments('-fno-pie')
+  qemu_ldflags += cc.get_supported_link_arguments('-no-pie')
+endif
+
 if not get_option('stack_protector').disabled()
   stack_protector_probe = '''
     int main(int argc, char *argv[])
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 27/30] build: move compiler version check to meson
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (25 preceding siblings ...)
  2022-12-09 11:24 ` [PATCH 26/30] build: move remaining compiler flag tests " Paolo Bonzini
@ 2022-12-09 11:24 ` Paolo Bonzini
  2022-12-09 11:52   ` Peter Maydell
  2022-12-09 11:24 ` [PATCH 28/30] docs: update build system docs Paolo Bonzini
                   ` (3 subsequent siblings)
  30 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:24 UTC (permalink / raw)
  To: qemu-devel

Instead of checking with preprocessor defines, use the Meson compiler object.
Because of the mess Apple does with its versioning scheme, check for an
option that was added in clang 6.0 instead of looking at the version number.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure   | 25 -------------------------
 meson.build | 11 +++++++++++
 2 files changed, 11 insertions(+), 25 deletions(-)

diff --git a/configure b/configure
index d5491fc3b986..a7c95535fd01 100755
--- a/configure
+++ b/configure
@@ -1033,31 +1033,6 @@ if test "$targetos" = "bogus"; then
     error_exit "Unrecognized host OS (uname -s reports '$(uname -s)')"
 fi
 
-# Check whether the compiler matches our minimum requirements:
-cat > $TMPC << EOF
-#if defined(__clang_major__) && defined(__clang_minor__)
-# ifdef __apple_build_version__
-#  if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
-#   error You need at least XCode Clang v10.0 to compile QEMU
-#  endif
-# else
-#  if __clang_major__ < 6 || (__clang_major__ == 6 && __clang_minor__ < 0)
-#   error You need at least Clang v6.0 to compile QEMU
-#  endif
-# endif
-#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
-# if __GNUC__ < 7 || (__GNUC__ == 7 && __GNUC_MINOR__ < 4)
-#  error You need at least GCC v7.4.0 to compile QEMU
-# endif
-#else
-# error You either need GCC or Clang to compiler QEMU
-#endif
-int main (void) { return 0; }
-EOF
-if ! compile_prog "" "" ; then
-    error_exit "You need at least GCC v7.4 or Clang v6.0 (or XCode Clang v10.0)"
-fi
-
 # Resolve default for --enable-plugins
 if test "$static" = "yes" ; then
   if test "$plugins" = "yes"; then
diff --git a/meson.build b/meson.build
index 01c6ac0045bc..3316ff005cfc 100644
--- a/meson.build
+++ b/meson.build
@@ -190,6 +190,17 @@ endif
 # Compiler flags #
 ##################
 
+foreach lang : all_languages
+  compiler = meson.get_compiler(lang)
+  if compiler.get_id() == 'gcc' and compiler.version().version_compare('>=7.4')
+    # ok
+  elif compiler.get_id() == 'clang' and compiler.has_argument('-Wpragma-pack')
+    # ok
+  else
+    error('You either need GCC v7.4 or Clang v6.0 (or XCode Clang v10.0) to compile QEMU')
+  endif
+endforeach
+
 # default flags for all hosts
 # We use -fwrapv to tell the compiler that we require a C dialect where
 # left shift of signed integers is well defined and has the expected
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 28/30] docs: update build system docs
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (26 preceding siblings ...)
  2022-12-09 11:24 ` [PATCH 27/30] build: move compiler version check " Paolo Bonzini
@ 2022-12-09 11:24 ` Paolo Bonzini
  2022-12-12 14:00   ` Marc-André Lureau
  2022-12-09 11:24 ` [PATCH 29/30] configure: do not rerun the tests with -Werror Paolo Bonzini
                   ` (2 subsequent siblings)
  30 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:24 UTC (permalink / raw)
  To: qemu-devel

Now that configure is only doing compiler and host setup, adjust the
relevant documentation.  It is also possible to build emulators with
ninja directly if one is so inclined.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 docs/devel/build-system.rst | 275 +++++++++++++++++++++---------------
 1 file changed, 164 insertions(+), 111 deletions(-)

diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst
index 4a733fc0a747..a25070fcaac8 100644
--- a/docs/devel/build-system.rst
+++ b/docs/devel/build-system.rst
@@ -4,30 +4,14 @@ The QEMU build system architecture
 
 This document aims to help developers understand the architecture of the
 QEMU build system. As with projects using GNU autotools, the QEMU build
-system has two stages, first the developer runs the "configure" script
+system has two stages; first the developer runs the "configure" script
 to determine the local build environment characteristics, then they run
-"make" to build the project. There is about where the similarities with
+"make" to build the project.  This is about where the similarities with
 GNU autotools end, so try to forget what you know about them.
 
+The two general ways to perform a build are as follows:
 
-Stage 1: configure
-==================
-
-The QEMU configure script is written directly in shell, and should be
-compatible with any POSIX shell, hence it uses #!/bin/sh. An important
-implication of this is that it is important to avoid using bash-isms on
-development platforms where bash is the primary host.
-
-In contrast to autoconf scripts, QEMU's configure is expected to be
-silent while it is checking for features. It will only display output
-when an error occurs, or to show the final feature enablement summary
-on completion.
-
-Because QEMU uses the Meson build system under the hood, only VPATH
-builds are supported.  There are two general ways to invoke configure &
-perform a build:
-
- - VPATH, build artifacts outside of QEMU source tree entirely::
+ - build artifacts outside of QEMU source tree entirely::
 
      cd ../
      mkdir build
@@ -35,80 +19,114 @@ perform a build:
      ../qemu/configure
      make
 
- - VPATH, build artifacts in a subdir of QEMU source tree::
+ - build artifacts in a subdir of QEMU source tree::
 
      mkdir build
      cd build
      ../configure
      make
 
-The configure script automatically recognizes
-command line options for which a same-named Meson option exists;
-dashes in the command line are replaced with underscores.
+Most of the actual build process uses Meson under the hood, therefore
+build artifacts cannot be placed in the source tree itself.
 
-Many checks on the compilation environment are still found in configure
-rather than ``meson.build``, but new checks should be added directly to
-``meson.build``.
 
-Patches are also welcome to move existing checks from the configure
-phase to ``meson.build``.  When doing so, ensure that ``meson.build`` does
-not use anymore the keys that you have removed from ``config-host.mak``.
-Typically these will be replaced in ``meson.build`` by boolean variables,
-``get_option('optname')`` invocations, or ``dep.found()`` expressions.
-In general, the remaining checks have little or no interdependencies,
-so they can be moved one by one.
+Stage 1: configure
+==================
 
-Helper functions
-----------------
+The configure script has four tasks:
 
-The configure script provides a variety of helper functions to assist
-developers in checking for system features:
+ - detect the host architecture
 
-``do_cc $ARGS...``
-   Attempt to run the system C compiler passing it $ARGS...
+ - list the targets for which to build emulators; the list of
+   targets also affects which firmware binaries and tests to build
 
-``do_cxx $ARGS...``
-   Attempt to run the system C++ compiler passing it $ARGS...
+ - find the compilers (native and cross) used to build executables,
+   firmware and tests.  The results are written as either Makefile
+   fragments (``config-host.mak``) or a Meson machine file
+   (``config-meson.cross``)
 
-``compile_object $CFLAGS``
-   Attempt to compile a test program with the system C compiler using
-   $CFLAGS. The test program must have been previously written to a file
-   called $TMPC.  The replacement in Meson is the compiler object ``cc``,
-   which has methods such as ``cc.compiles()``,
-   ``cc.check_header()``, ``cc.has_function()``.
+ - invoke Meson to perform the actual configuration step for the
+   emulator build
 
-``compile_prog $CFLAGS $LDFLAGS``
-   Attempt to compile a test program with the system C compiler using
-   $CFLAGS and link it with the system linker using $LDFLAGS. The test
-   program must have been previously written to a file called $TMPC.
-   The replacement in Meson is ``cc.find_library()`` and ``cc.links()``.
+The configure script automatically recognizes command line options for
+which a same-named Meson option exists; dashes in the command line are
+replaced with underscores.
+
+Almost all QEMU developers that need to modify the build system will
+only be concerned with Meson, and therefore can skip the rest of this
+section.
+
+
+Modifying ``configure``
+-----------------------
+
+``configure`` is a shell script; it uses ``#!/bin/sh`` and therefore
+should be compatible with any POSIX shell. It is important to avoid
+using bash-isms to avoid breaking development platforms where bash is
+the primary host.
+
+The configure script provides a variety of functions to help writing
+portable shell code and providing consistent behavior across architectures
+and operating systems:
+
+``error_exit $MESSAGE $MORE...``
+   Print $MESSAGE to stderr, followed by $MORE... and then exit from the
+   configure script with non-zero status.
 
 ``has $COMMAND``
    Determine if $COMMAND exists in the current environment, either as a
    shell builtin, or executable binary, returning 0 on success.  The
    replacement in Meson is ``find_program()``.
 
+``probe_target_compiler $TARGET``
+  Detect a cross compiler and cross tools for the QEMU target $TARGET (e.g.,
+  ``$CPU-softmmu``, ``$CPU-linux-user``, ``$CPU-bsd-user``).  If a working
+  compiler is present, return success and set variables ``$target_cc``,
+  ``$target_ar``, etc. to non-empty values.
+
+``write_target_makefile``
+  Write a Makefile fragment to stdout, exposing the result of the most
+  ``probe_target_compiler`` call as the usual Make variables (``CC``,
+  ``AR``, ``LD``, etc.).
+
+
+Configure does not generally perform tests for compiler options beyond
+basic checks to detect the host platform and ensure the compiler is
+functioning.  These are performed using a few more helper functions:
+
+``compile_object $CFLAGS``
+   Attempt to compile a test program with the system C compiler using
+   $CFLAGS. The test program must have been previously written to a file
+   called $TMPC.
+
+``compile_prog $CFLAGS $LDFLAGS``
+   Attempt to compile a test program with the system C compiler using
+   $CFLAGS and link it with the system linker using $LDFLAGS. The test
+   program must have been previously written to a file called $TMPC.
+
 ``check_define $NAME``
-   Determine if the macro $NAME is defined by the system C compiler
+   Determine if the macro $NAME is defined by the system C compiler.
+
+``do_compiler $CC $ARGS...``
+   Attempt to run the C compiler $CC, passing it $ARGS...  This function
+   does not use flags passed via options such as ``--extra-cflags``, and
+   therefore can be used to check for cross compilers.  However, most
+   such checks are done at ``make`` time instead (see for example the
+   ``cc-option`` macro in ``pc-bios/option-rom/Makefile``).
 
 ``write_c_skeleton``
    Write a minimal C program main() function to the temporary file
-   indicated by $TMPC
-
-``error_exit $MESSAGE $MORE...``
-   Print $MESSAGE to stderr, followed by $MORE... and then exit from the
-   configure script with non-zero status
+   indicated by $TMPC.
 
 
 Stage 2: Meson
 ==============
 
-The Meson build system is currently used to describe the build
-process for:
+The Meson build system describes the build and install process for:
 
 1) executables, which include:
 
-   - Tools - ``qemu-img``, ``qemu-nbd``, ``qga`` (guest agent), etc
+   - Tools - ``qemu-img``, ``qemu-nbd``, ``qemu-ga`` (guest agent), etc
 
    - System emulators - ``qemu-system-$ARCH``
 
@@ -118,7 +136,8 @@ process for:
 
 2) documentation
 
-3) ROMs, which can be either installed as binary blobs or compiled
+3) ROMs, whether provided as binary blobs in the QEMU distributions
+   or cross compiled under the direction of the configure script
 
 4) other data files, such as icons or desktop files
 
@@ -273,8 +292,7 @@ system/userspace emulation target
 Adding checks
 -------------
 
-New checks should be added to Meson.  Compiler checks can be as simple as
-the following::
+Compiler checks can be as simple as the following::
 
   config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
 
@@ -351,22 +369,30 @@ script, which may point to something other than the first python3
 binary on the path.
 
 
-Stage 3: makefiles
-==================
+Stage 3: Make
+=============
 
-The use of GNU make is required with the QEMU build system.
+The next step in building QEMU is to invoke make.  GNU Make is required
+to build QEMU, and may be installed as ``gmake`` on some hosts.
 
-The output of Meson is a build.ninja file, which is used with the Ninja
-build system.  QEMU uses a different approach, where Makefile rules are
-synthesized from the build.ninja file.  The main Makefile includes these
-rules and wraps them so that e.g. submodules are built before QEMU.
-The resulting build system is largely non-recursive in nature, in
-contrast to common practices seen with automake.
+The output of Meson is a ``build.ninja`` file, which is used with the
+Ninja build tool.  However, QEMU's build comprises other components than
+just the emulators (namely firmware and the tests in ``tests/tcg``) which
+need different cross compilers.  The QEMU Makefile wraps both Ninja and
+the smaller build systems for firmware and tests; it also takes care of
+running ``configure`` again when the script changes.  Apart from invoking
+these sub-Makefiles, the resulting build is largely non-recursive.
 
-Tests are also ran by the Makefile with the traditional ``make check``
-phony target, while benchmarks are run with ``make bench``.  Meson test
-suites such as ``unit`` can be ran with ``make check-unit`` too.  It is also
-possible to run tests defined in meson.build with ``meson test``.
+Tests, whether defined in ``meson.build`` or not, are also ran by the
+Makefile with the traditional ``make check`` phony target, while benchmarks
+are run with ``make bench``.  Meson test suites such as ``unit`` can be ran
+with ``make check-unit``, and ``make check-tcg`` builds and runs "non-Meson"
+tests for all targets.
+
+If desired, it is also possible to use ``ninja`` and ``meson test``,
+respectively to build emulators and run tests defined in meson.build.
+The main difference is that ``make`` needs the ``-jN`` flag in order to
+enable parallel builds or tests.
 
 Useful make targets
 -------------------
@@ -378,6 +404,7 @@ Useful make targets
   Print the value of the variable VAR. Useful for debugging the build
   system.
 
+
 Important files for the build system
 ====================================
 
@@ -391,8 +418,7 @@ number of dynamically created files listed later.
 ``Makefile``
   The main entry point used when invoking make to build all the components
   of QEMU. The default 'all' target will naturally result in the build of
-  every component. Makefile takes care of recursively building submodules
-  directly via a non-recursive set of rules.
+  every component.
 
 ``*/meson.build``
   The meson.build file in the root directory is the main entry point for the
@@ -401,59 +427,86 @@ number of dynamically created files listed later.
   other meson.build files spread throughout the QEMU source tree.
 
 ``tests/Makefile.include``
-  Rules for external test harnesses. These include the TCG tests,
-  ``qemu-iotests`` and the Avocado-based integration tests.
+  Rules for external test harnesses. These include the TCG tests
+  and the Avocado-based integration tests.
 
 ``tests/docker/Makefile.include``
-  Rules for Docker tests. Like tests/Makefile, this file is included
-  directly by the top level Makefile, anything defined in this file will
-  influence the entire build system.
+  Rules for Docker tests. Like ``tests/Makefile.include``, this file is
+  included directly by the top level Makefile, anything defined in this
+  file will influence the entire build system.
 
 ``tests/vm/Makefile.include``
-  Rules for VM-based tests. Like tests/Makefile, this file is included
-  directly by the top level Makefile, anything defined in this file will
-  influence the entire build system.
+  Rules for VM-based tests. Like ``tests/Makefile.include``, this file is
+  included directly by the top level Makefile, anything defined in this
+  file will influence the entire build system.
 
 Dynamically created files
 -------------------------
 
-The following files are generated dynamically by configure in order to
-control the behaviour of the statically defined makefiles. This avoids
-the need for QEMU makefiles to go through any pre-processing as seen
-with autotools, where Makefile.am generates Makefile.in which generates
-Makefile.
+The following files are generated at run-time in order to control the
+behaviour of the Makefiles. This avoids the need for QEMU makefiles to
+go through any pre-processing as seen with autotools, where configure
+generates ``Makefile`` from ``Makefile.in`.
 
 Built by configure:
 
 ``config-host.mak``
   When configure has determined the characteristics of the build host it
-  will write a long list of variables to config-host.mak file. This
-  provides the various install directories, compiler / linker flags and a
+  will write them to this file for use in ``Makefile`` and to a smaller
+  extent ``meson.build``. These include the paths to various tools and a
   variety of ``CONFIG_*`` variables related to optionally enabled features.
-  This is imported by the top level Makefile and meson.build in order to
-  tailor the build output.
 
-  config-host.mak is also used as a dependency checking mechanism. If make
+  ``config-host.mak`` is also used as a dependency checking mechanism. If make
   sees that the modification timestamp on configure is newer than that on
-  config-host.mak, then configure will be re-run.
+  ``config-host.mak``, then configure will be re-run.
 
-  The variables defined here are those which are applicable to all QEMU
-  build outputs. Variables which are potentially different for each
-  emulator target are defined by the next file...
+  The variables defined here apply to all QEMU
+  build outputs.
+
+``config-meson.cross``
+
+  A Meson "cross file" (or native file) used to communicate the paths to
+  the toolchain and other configuration options.
+
+``config.status``
+
+  A small shell script that will invoke configure again with the same
+  environment variables that were set during the first run.  It's used to
+  rerun configure after changes to the source code, but it can also be
+  inspected manually to check the contents of the environment.
+
+``Makefile.prereqs``
+
+  A set of Makefile dependencies that order the build and execution of
+  firmware and tests after the container images and emulators that they
+  need.
+
+``pc-bios/*/config.mak``, ``tests/tcg/config-host.mak``, ``tests/tcg/*/config-target.mak``
+
+  Configuration variables used to build the firmware and TCG tests,
+  including paths to cross compilation toolchains.
 
 
 Built by Meson:
 
-``${TARGET-NAME}-config-devices.mak``
-  TARGET-NAME is again the name of a system or userspace emulator. The
-  config-devices.mak file is automatically generated by make using the
-  scripts/make_device_config.sh program, feeding it the
-  default-configs/$TARGET-NAME file as input.
+``config-host.h``
+  Used by C code to determine the properties of the build environment
+  and the set of enabled features for the entire build.
 
-``config-host.h``, ``$TARGET_NAME-config-target.h``, ``$TARGET_NAME-config-devices.h``
-  These files are used by source code to determine what features are
-  enabled.  They are generated from the contents of the corresponding
-  ``*.mak`` files using Meson's ``configure_file()`` function.
+``${TARGET-NAME}-config-devices.mak``
+  TARGET-NAME is the name of a system emulator. The file is
+  generated by Meson using files under ``configs/devices`` as input.
+
+``${TARGET-NAME}-config-target.mak``
+  TARGET-NAME is the name of a system or usermode emulator. The file is
+  generated by Meson using files under ``configs/targets`` as input.
+
+``$TARGET_NAME-config-target.h``, ``$TARGET_NAME-config-devices.h``
+  Used by C code to determine the properties and enabled
+  features for each target.  enabled.  They are generated from
+  the contents of the corresponding ``*.mak`` files using Meson's
+  ``configure_file()`` function; each target can include them using
+  the ``CONFIG_TARGET`` and ``CONFIG_DEVICES`` macro respectively.
 
 ``build.ninja``
   The build rules.
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 29/30] configure: do not rerun the tests with -Werror
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (27 preceding siblings ...)
  2022-12-09 11:24 ` [PATCH 28/30] docs: update build system docs Paolo Bonzini
@ 2022-12-09 11:24 ` Paolo Bonzini
  2022-12-12 14:00   ` Marc-André Lureau
  2022-12-09 11:24 ` [PATCH 30/30] meson: always log qemu-iotests verbosely Paolo Bonzini
  2022-12-16 15:35 ` [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Daniel P. Berrangé
  30 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:24 UTC (permalink / raw)
  To: qemu-devel

Tests run in configure are pretty trivial at this point, so
do not bother with the extra complication of running tests
both with and without -Werror.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure | 35 +----------------------------------
 1 file changed, 1 insertion(+), 34 deletions(-)

diff --git a/configure b/configure
index a7c95535fd01..745745ded35b 100755
--- a/configure
+++ b/configure
@@ -119,41 +119,8 @@ lines: ${BASH_LINENO[*]}"
   $compiler "$@" >> config.log 2>&1 || return $?
 }
 
-do_compiler_werror() {
-    # Run the compiler, capturing its output to the log. First argument
-    # is compiler binary to execute.
-    compiler="$1"
-    shift
-    if test -n "$BASH_VERSION"; then eval '
-        echo >>config.log "
-funcs: ${FUNCNAME[*]}
-lines: ${BASH_LINENO[*]}"
-    '; fi
-    echo $compiler "$@" >> config.log
-    $compiler "$@" >> config.log 2>&1 || return $?
-    # Test passed. If this is an --enable-werror build, rerun
-    # the test with -Werror and bail out if it fails. This
-    # makes warning-generating-errors in configure test code
-    # obvious to developers.
-    if test "$werror" != "yes"; then
-        return 0
-    fi
-    # Don't bother rerunning the compile if we were already using -Werror
-    case "$*" in
-        *-Werror*)
-           return 0
-        ;;
-    esac
-    echo $compiler -Werror "$@" >> config.log
-    $compiler -Werror "$@" >> config.log 2>&1 && return $?
-    error_exit "configure test passed without -Werror but failed with -Werror." \
-        "This is probably a bug in the configure script. The failing command" \
-        "will be at the bottom of config.log." \
-        "You can run configure with --disable-werror to bypass this check."
-}
-
 do_cc() {
-    do_compiler_werror "$cc" $CPU_CFLAGS "$@"
+    do_compiler "$cc" $CPU_CFLAGS "$@"
 }
 
 compile_object() {
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* [PATCH 30/30] meson: always log qemu-iotests verbosely
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (28 preceding siblings ...)
  2022-12-09 11:24 ` [PATCH 29/30] configure: do not rerun the tests with -Werror Paolo Bonzini
@ 2022-12-09 11:24 ` Paolo Bonzini
  2022-12-12 14:02   ` Marc-André Lureau
  2022-12-12 16:55   ` Peter Maydell
  2022-12-16 15:35 ` [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Daniel P. Berrangé
  30 siblings, 2 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 11:24 UTC (permalink / raw)
  To: qemu-devel

---
 tests/qemu-iotests/meson.build | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tests/qemu-iotests/meson.build b/tests/qemu-iotests/meson.build
index 583468c5b9b3..3d8637c8f2b6 100644
--- a/tests/qemu-iotests/meson.build
+++ b/tests/qemu-iotests/meson.build
@@ -43,5 +43,6 @@ foreach format, speed: qemu_iotests_formats
        protocol: 'tap',
        suite: suites,
        timeout: 0,
+       verbose: true,
        is_parallel: false)
 endforeach
-- 
2.38.1



^ permalink raw reply related	[flat|nested] 92+ messages in thread

* Re: [PATCH 03/30] configure: remove useless test
  2022-12-09 11:23 ` [PATCH 03/30] configure: remove useless test Paolo Bonzini
@ 2022-12-09 11:34   ` Peter Maydell
  2022-12-09 16:35     ` Paolo Bonzini
  2022-12-16 14:35   ` Daniel P. Berrangé
  1 sibling, 1 reply; 92+ messages in thread
From: Peter Maydell @ 2022-12-09 11:34 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, 9 Dec 2022 at 11:25, Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> $cpu is derived from preprocessor defines rather than uname these days,
> so do not bother using isainfo on Solaris.  Likewise do not recognize
> BeOS's uname -m output.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure | 12 +-----------
>  1 file changed, 1 insertion(+), 11 deletions(-)
>
> diff --git a/configure b/configure
> index 543fd5a48bf0..db2b45740449 100755
> --- a/configure
> +++ b/configure
> @@ -337,9 +337,6 @@ for opt do
>    ;;
>    esac
>  done
> -# OS specific
> -# Using uname is really, really broken.  Once we have the right set of checks
> -# we can eliminate its usage altogether.

I note that the fallback if we match no #defines is still "use uname".
We can only get rid of that if we're willing to say "must be a
known host architecture, even if using TCI", though. Or we could
force the 1 person using that setup to specify --cpu manually, perhaps.

>  # Preferred compiler:
>  #  ${CC} (if set)
> @@ -489,13 +486,6 @@ sunos)
>    QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
>  # needed for TIOCWIN* defines in termios.h
>    QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
> -  # $(uname -m) returns i86pc even on an x86_64 box, so default based on isainfo
> -  # Note that this check is broken for cross-compilation: if you're
> -  # cross-compiling to one of these OSes then you'll need to specify
> -  # the correct CPU with the --cpu option.
> -  if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
> -    cpu="x86_64"
> -  fi

I found a random stackoverflow answer that says the Solaris
compiler does define the __x86_64__ macro that we check for, so
this should be OK.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 02/30] configure: remove dead function
  2022-12-09 11:23 ` [PATCH 02/30] configure: remove dead function Paolo Bonzini
@ 2022-12-09 11:36   ` Peter Maydell
  2022-12-16 14:33   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Peter Maydell @ 2022-12-09 11:36 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, 9 Dec 2022 at 11:25, Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure | 4 ----
>  1 file changed, 4 deletions(-)
>
> diff --git a/configure b/configure
> index e31d4522ea63..543fd5a48bf0 100755
> --- a/configure
> +++ b/configure
> @@ -210,10 +210,6 @@ version_ge () {
>      done
>  }
>
> -glob() {
> -    eval test -z '"${1#'"$2"'}"'
> -}
> -
>  if printf %s\\n "$source_path" "$PWD" | grep -q "[[:space:]:]";
>  then
>    error_exit "main directory cannot contain spaces nor colons"
> --
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 01/30] configure: remove useless write_c_skeleton
  2022-12-09 11:23 ` [PATCH 01/30] configure: remove useless write_c_skeleton Paolo Bonzini
@ 2022-12-09 11:38   ` Peter Maydell
  2022-12-16 14:33   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Peter Maydell @ 2022-12-09 11:38 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, 9 Dec 2022 at 11:26, Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> This is not needed ever since QEMU stopped detecting -liberty; this
> happened with the Meson switch but it is quite likely that the
> library was not really necessary years before.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure | 1 -
>  1 file changed, 1 deletion(-)
>
> diff --git a/configure b/configure
> index 26c7bc515468..e31d4522ea63 100755
> --- a/configure
> +++ b/configure
> @@ -638,7 +638,6 @@ if test "$mingw32" = "yes" ; then
>    EXESUF=".exe"
>    # MinGW needs -mthreads for TLS and macro _MT.
>    CONFIGURE_CFLAGS="-mthreads $CONFIGURE_CFLAGS"
> -  write_c_skeleton;
>    prefix="/qemu"
>    bindir=""
>    qemu_suffix=""
> --
> 2.38.1

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 27/30] build: move compiler version check to meson
  2022-12-09 11:24 ` [PATCH 27/30] build: move compiler version check " Paolo Bonzini
@ 2022-12-09 11:52   ` Peter Maydell
  2022-12-09 14:09     ` Paolo Bonzini
  0 siblings, 1 reply; 92+ messages in thread
From: Peter Maydell @ 2022-12-09 11:52 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, 9 Dec 2022 at 11:40, Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Instead of checking with preprocessor defines, use the Meson compiler object.
> Because of the mess Apple does with its versioning scheme, check for an
> option that was added in clang 6.0 instead of looking at the version number.

> -# Check whether the compiler matches our minimum requirements:
> -cat > $TMPC << EOF
> -#if defined(__clang_major__) && defined(__clang_minor__)
> -# ifdef __apple_build_version__
> -#  if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
> -#   error You need at least XCode Clang v10.0 to compile QEMU
> -#  endif
> -# else
> -#  if __clang_major__ < 6 || (__clang_major__ == 6 && __clang_minor__ < 0)
> -#   error You need at least Clang v6.0 to compile QEMU
> -#  endif
> -# endif
> -#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
> -# if __GNUC__ < 7 || (__GNUC__ == 7 && __GNUC_MINOR__ < 4)
> -#  error You need at least GCC v7.4.0 to compile QEMU
> -# endif
> -#else
> -# error You either need GCC or Clang to compiler QEMU
> -#endif
> -int main (void) { return 0; }
> -EOF
> -if ! compile_prog "" "" ; then
> -    error_exit "You need at least GCC v7.4 or Clang v6.0 (or XCode Clang v10.0)"
> -fi
>
> +foreach lang : all_languages
> +  compiler = meson.get_compiler(lang)
> +  if compiler.get_id() == 'gcc' and compiler.version().version_compare('>=7.4')
> +    # ok
> +  elif compiler.get_id() == 'clang' and compiler.has_argument('-Wpragma-pack')
> +    # ok
> +  else
> +    error('You either need GCC v7.4 or Clang v6.0 (or XCode Clang v10.0) to compile QEMU')
> +  endif
> +endforeach

The new code makes it much harder to move our compiler version
requirements forward in future, because there's no longer a simple
"check for normal clang X or apple clang Y" test where we can
bump up X and Y based on what's provided in the various host
platforms we have to support. Doesn't meson provide a way to do
the version check on the version number the way we were doing
previously?

thanks
-- PMM


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 14/30] configure: test all warnings
  2022-12-09 11:23 ` [PATCH 14/30] configure: test all warnings Paolo Bonzini
@ 2022-12-09 12:45   ` Philippe Mathieu-Daudé
  2022-12-16 15:01   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-12-09 12:45 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel

On 9/12/22 12:23, Paolo Bonzini wrote:
> Some warnings are hardcoded in QEMU_CFLAGS and not tested.  There is
> no particular reason to single out these five, as many more -W flags are
> present on all the supported compilers.  For homogeneity when moving
> the detection to meson, make them use the same warn_flags infrastructure.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>   configure | 7 +++++--
>   1 file changed, 5 insertions(+), 2 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 16/30] build: move glib detection and workarounds to meson
  2022-12-09 11:23 ` [PATCH 16/30] build: move glib detection and workarounds to meson Paolo Bonzini
@ 2022-12-09 12:50   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 92+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-12-09 12:50 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel

On 9/12/22 12:23, Paolo Bonzini wrote:
> QEMU adds the path to glib.h is added to all compilation commands.

add/add/ not clear...

Otherwise:
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>


> This is simpler due to the pervasive use of static_library, and was
> grandfathered in from the previous Make-based build system.  Until
> Meson 0.63 the only way to do this was to detect glib in configure
> and use add_project_arguments, but now it is possible to use
> add_project_dependencies instead.
> 
> gmodule is detected in a separate variable and added via both
> block_ss (for --enable-modules) and plugins/meson.build (for
> --enable-plugins).
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>   block/meson.build        |  1 +
>   configure                | 83 +---------------------------------------
>   contrib/plugins/Makefile |  4 +-
>   meson.build              | 81 +++++++++++++++++++++++++++++++++------
>   plugins/meson.build      |  2 +-
>   5 files changed, 74 insertions(+), 97 deletions(-)



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 19/30] configure, meson: move --enable-debug-info to Meson
  2022-12-09 11:23 ` [PATCH 19/30] configure, meson: move --enable-debug-info " Paolo Bonzini
@ 2022-12-09 12:55   ` Philippe Mathieu-Daudé
  2022-12-09 13:54     ` Paolo Bonzini
  2022-12-16 15:09   ` Daniel P. Berrangé
  1 sibling, 1 reply; 92+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-12-09 12:55 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel

On 9/12/22 12:23, Paolo Bonzini wrote:
> Older versions of Meson had an unclear description of the -Ddebug option,
> but this is fixed in 0.63.0 that is required now.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>   configure                     | 5 -----
>   scripts/meson-buildoptions.py | 2 ++
>   scripts/meson-buildoptions.sh | 3 +++
>   3 files changed, 5 insertions(+), 5 deletions(-)


> diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
> index f91797741eef..cb277347bb18 100644
> --- a/scripts/meson-buildoptions.sh
> +++ b/scripts/meson-buildoptions.sh

# This file is generated by meson-buildoptions.py, do not edit!

> @@ -10,6 +10,7 @@ meson_options_help() {
>     printf "%s\n" '                           affects only QEMU, not tools like qemu-img)'
>     printf "%s\n" '  --datadir=VALUE          Data file directory [share]'
>     printf "%s\n" '  --disable-coroutine-pool coroutine freelist (better performance)'
> +  printf "%s\n" '  --disable-debug-info     Enable debug symbols and other information'

We should get '--enable-debug-info' here, ...

>     printf "%s\n" '  --disable-install-blobs  install provided firmware blobs'

... and here. Do we have a bug in meson-buildoptions.py?

>     printf "%s\n" '  --docdir=VALUE           Base directory for documentation installation'
>     printf "%s\n" '                           (can be empty) [share/doc]'


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 22/30] build: move SafeStack tests to meson
  2022-12-09 11:24 ` [PATCH 22/30] build: move SafeStack " Paolo Bonzini
@ 2022-12-09 12:57   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 92+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-12-09 12:57 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel

On 9/12/22 12:24, Paolo Bonzini wrote:
> This disables the old behavior of detecting SafeStack from environment
> CFLAGS.  SafeStack is now enabled purely based on the configure arguments.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>   configure                     | 73 -----------------------------------
>   meson.build                   | 26 +++++++++++++
>   meson_options.txt             |  2 +
>   scripts/meson-buildoptions.sh |  4 ++
>   4 files changed, 32 insertions(+), 73 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 08/30] meson: require 0.63.0
  2022-12-09 11:23 ` [PATCH 08/30] meson: require 0.63.0 Paolo Bonzini
@ 2022-12-09 13:25   ` Thomas Huth
  0 siblings, 0 replies; 92+ messages in thread
From: Thomas Huth @ 2022-12-09 13:25 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel

On 09/12/2022 12.23, Paolo Bonzini wrote:
> This allows cleanups cleanups in modinfo collection and supports the

Scratch one "cleanups" ?

> equivalent of QEMU's --static option to configure.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>   configure   | 2 +-
>   meson       | 2 +-
>   meson.build | 2 +-
>   3 files changed, 3 insertions(+), 3 deletions(-)

Reviewed-by: Thomas Huth <thuth@redhat.com>



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 19/30] configure, meson: move --enable-debug-info to Meson
  2022-12-09 12:55   ` Philippe Mathieu-Daudé
@ 2022-12-09 13:54     ` Paolo Bonzini
  2022-12-09 14:21       ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 13:54 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel

On 12/9/22 13:55, Philippe Mathieu-Daudé wrote:
>>
>> +  printf "%s\n" '  --disable-debug-info     Enable debug symbols and 
>> other information'
> 
> We should get '--enable-debug-info' here, ...
> 
>>     printf "%s\n" '  --disable-install-blobs  install provided 
>> firmware blobs'
> 
> ... and here. Do we have a bug in meson-buildoptions.py?

No, for boolean options it only includes the non-default setting.  This 
behavior was copied from the prior handcrafted help output:

   --with-devices-ARCH=NAME override default configs/devices
   --enable-debug           enable common debug build options
   --enable-sanitizers      enable default sanitizers
   --enable-tsan            enable thread sanitizer
   --disable-strip          disable stripping binaries
   --disable-werror         disable compilation abort on warning
   --disable-stack-protector disable compiler-provided stack protection
   --audio-drv-list=LIST    set audio drivers list

etc.

Paolo



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 27/30] build: move compiler version check to meson
  2022-12-09 11:52   ` Peter Maydell
@ 2022-12-09 14:09     ` Paolo Bonzini
  2022-12-09 14:19       ` Peter Maydell
  0 siblings, 1 reply; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 14:09 UTC (permalink / raw)
  To: Peter Maydell; +Cc: qemu-devel

On 12/9/22 12:52, Peter Maydell wrote:
> The new code makes it much harder to move our compiler version
> requirements forward in future, because there's no longer a simple
> "check for normal clang X or apple clang Y" test where we can
> bump up X and Y based on what's provided in the various host
> platforms we have to support. Doesn't meson provide a way to do
> the version check on the version number the way we were doing
> previously?

Yes, I could just do the check with #error just like before.

For GCC I used the nicer "compiler.version().version_compare('>=x.y')" 
check.  For clang we have to deal with both upstream and Apple version 
numbers; it's also possible to check for __apple_build_version__ to 
distinguish between the two and then do version_compare(), but at that 
point it's easier to just use cc.compiles() and #error.

While it's possible to learn the upstream version corresponding to Apple 
compilers with "c++ --verbose", it is not really machine-friendly so 
Meson does not attempt to parse it and neither did QEMU's configure script.

So I went for the trick of using -Wpragma-pack, which was extracted from 
https://github.com/simd-everywhere/simde/blob/master/simde/simde-detect-clang.h. 
  The advantage is that you only have one check, the disadvantage is of 
course that it obscures what's going on.  I can add a clearer comment 
around the check, or switch to #error and add a pointer to 
https://trac.macports.org/wiki/XcodeVersionInfo where the mapping can be 
found, or really anything else that is your preference.

Paolo



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 27/30] build: move compiler version check to meson
  2022-12-09 14:09     ` Paolo Bonzini
@ 2022-12-09 14:19       ` Peter Maydell
  2022-12-09 16:21         ` Paolo Bonzini
  0 siblings, 1 reply; 92+ messages in thread
From: Peter Maydell @ 2022-12-09 14:19 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, 9 Dec 2022 at 14:09, Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> On 12/9/22 12:52, Peter Maydell wrote:
> > The new code makes it much harder to move our compiler version
> > requirements forward in future, because there's no longer a simple
> > "check for normal clang X or apple clang Y" test where we can
> > bump up X and Y based on what's provided in the various host
> > platforms we have to support. Doesn't meson provide a way to do
> > the version check on the version number the way we were doing
> > previously?
>
> Yes, I could just do the check with #error just like before.
>
> For GCC I used the nicer "compiler.version().version_compare('>=x.y')"
> check.  For clang we have to deal with both upstream and Apple version
> numbers; it's also possible to check for __apple_build_version__ to
> distinguish between the two and then do version_compare(), but at that
> point it's easier to just use cc.compiles() and #error.
>
> While it's possible to learn the upstream version corresponding to Apple
> compilers with "c++ --verbose", it is not really machine-friendly so
> Meson does not attempt to parse it and neither did QEMU's configure script.
>
> So I went for the trick of using -Wpragma-pack, which was extracted from
> https://github.com/simd-everywhere/simde/blob/master/simde/simde-detect-clang.h.
>   The advantage is that you only have one check, the disadvantage is of
> course that it obscures what's going on.  I can add a clearer comment
> around the check, or switch to #error and add a pointer to
> https://trac.macports.org/wiki/XcodeVersionInfo where the mapping can be
> found, or really anything else that is your preference.

I think really I just don't want a check that is "we happen to
know that this particular option switch is supported only
from these versions onward", because as soon as we say
"OK, we can move forward to a clang 7 baseline" we either
need to search around for an equivalent clever trick, or
else we need to get rid of all this code anyway and have
the version number check. So I don't mind how we do this
as long as there's a straightforward bit of code that
currently has "6 "and "10" in it and where we can change it to
"7" and "11 "in future and it does what we intend.

thanks
-- PMM


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 19/30] configure, meson: move --enable-debug-info to Meson
  2022-12-09 13:54     ` Paolo Bonzini
@ 2022-12-09 14:21       ` Philippe Mathieu-Daudé
  2022-12-09 16:21         ` Paolo Bonzini
  0 siblings, 1 reply; 92+ messages in thread
From: Philippe Mathieu-Daudé @ 2022-12-09 14:21 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel

On 9/12/22 14:54, Paolo Bonzini wrote:
> On 12/9/22 13:55, Philippe Mathieu-Daudé wrote:
>>>
>>> +  printf "%s\n" '  --disable-debug-info     Enable debug symbols and 
>>> other information'
>>
>> We should get '--enable-debug-info' here, ...
>>
>>>     printf "%s\n" '  --disable-install-blobs  install provided 
>>> firmware blobs'
>>
>> ... and here. Do we have a bug in meson-buildoptions.py?
> 
> No, for boolean options it only includes the non-default setting.  This 
> behavior was copied from the prior handcrafted help output:
> 
>    --with-devices-ARCH=NAME override default configs/devices
>    --enable-debug           enable common debug build options
>    --enable-sanitizers      enable default sanitizers
>    --enable-tsan            enable thread sanitizer
>    --disable-strip          disable stripping binaries
>    --disable-werror         disable compilation abort on warning
>    --disable-stack-protector disable compiler-provided stack protection

These are correct... For debug-info I'd expect that (change on top of
your patch):

-  printf "%s\n" '  --disable-debug-info     Enable debug symbols and 
other information'
+  printf "%s\n" '  --disable-debug-info     Disable debug symbols and 
other information'




^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 27/30] build: move compiler version check to meson
  2022-12-09 14:19       ` Peter Maydell
@ 2022-12-09 16:21         ` Paolo Bonzini
  0 siblings, 0 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 16:21 UTC (permalink / raw)
  To: Peter Maydell; +Cc: qemu-devel

On 12/9/22 15:19, Peter Maydell wrote:
> I think really I just don't want a check that is "we happen to
> know that this particular option switch is supported only
> from these versions onward", because as soon as we say
> "OK, we can move forward to a clang 7 baseline" we either
> need to search around for an equivalent clever trick, or
> else we need to get rid of all this code anyway and have
> the version number check. So I don't mind how we do this
> as long as there's a straightforward bit of code that
> currently has "6 "and "10" in it and where we can change it to
> "7" and "11 "in future and it does what we intend.

No problem, I will keep the version number logic.

Paolo



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 19/30] configure, meson: move --enable-debug-info to Meson
  2022-12-09 14:21       ` Philippe Mathieu-Daudé
@ 2022-12-09 16:21         ` Paolo Bonzini
  0 siblings, 0 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 16:21 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel

On 12/9/22 15:21, Philippe Mathieu-Daudé wrote:
> On 9/12/22 14:54, Paolo Bonzini wrote:
>> On 12/9/22 13:55, Philippe Mathieu-Daudé wrote:
>>>>
>>>> +  printf "%s\n" '  --disable-debug-info     Enable debug symbols 
>>>> and other information'
>>>
>>> We should get '--enable-debug-info' here, ...
>>>
>>>>     printf "%s\n" '  --disable-install-blobs  install provided 
>>>> firmware blobs'
>>>
>>> ... and here. Do we have a bug in meson-buildoptions.py?
>>
>> No, for boolean options it only includes the non-default setting.  
>> This behavior was copied from the prior handcrafted help output:
>>
>>    --with-devices-ARCH=NAME override default configs/devices
>>    --enable-debug           enable common debug build options
>>    --enable-sanitizers      enable default sanitizers
>>    --enable-tsan            enable thread sanitizer
>>    --disable-strip          disable stripping binaries
>>    --disable-werror         disable compilation abort on warning
>>    --disable-stack-protector disable compiler-provided stack protection
> 
> These are correct... For debug-info I'd expect that (change on top of
> your patch):
> 
> -  printf "%s\n" '  --disable-debug-info     Enable debug symbols and 
> other information'
> +  printf "%s\n" '  --disable-debug-info     Disable debug symbols and 
> other information'

Ahh, I see now.  Yeah, it is inconsistent, I'll just drop this patch.

Paolo



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 03/30] configure: remove useless test
  2022-12-09 11:34   ` Peter Maydell
@ 2022-12-09 16:35     ` Paolo Bonzini
  0 siblings, 0 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-09 16:35 UTC (permalink / raw)
  To: Peter Maydell; +Cc: qemu-devel

On 12/9/22 12:34, Peter Maydell wrote:
>> -# Using uname is really, really broken.  Once we have the right set of checks
>> -# we can eliminate its usage altogether.
> I note that the fallback if we match no #defines is still "use uname".
> We can only get rid of that if we're willing to say "must be a
> known host architecture, even if using TCI", though. Or we could
> force the 1 person using that setup to specify --cpu manually, perhaps.

Ok I'll change a bit the comments, and add a warning in configure as 
well if the #define checks fail to detect the CPU architecture.

Paolo



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 04/30] configure: preserve qemu-ga variables
  2022-12-09 11:23 ` [PATCH 04/30] configure: preserve qemu-ga variables Paolo Bonzini
@ 2022-12-12  7:52   ` Marc-André Lureau
  2022-12-16 14:39   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12  7:52 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 9, 2022 at 3:28 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Ensure that qemu-ga variables set at configure time are kept
> later when the script is rerun.  For preserve_env to work,
> the variables need to be empty so move the default values
> to config-host.mak generation.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  configure | 23 ++++++-----------------
>  1 file changed, 6 insertions(+), 17 deletions(-)
>
> diff --git a/configure b/configure
> index db2b45740449..4d14ff9c319c 100755
> --- a/configure
> +++ b/configure
> @@ -2222,20 +2222,6 @@ if test "$have_ubsan" = "yes"; then
>    QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
>  fi
>
> -##########################################
> -# Guest agent Windows MSI package
> -
> -if test "$QEMU_GA_MANUFACTURER" = ""; then
> -  QEMU_GA_MANUFACTURER=QEMU
> -fi
> -if test "$QEMU_GA_DISTRO" = ""; then
> -  QEMU_GA_DISTRO=Linux
> -fi
> -if test "$QEMU_GA_VERSION" = ""; then
> -    QEMU_GA_VERSION=$(cat "$source_path"/VERSION)
> -fi
> -
> -
>  #######################################
>  # cross-compiled firmware targets
>
> @@ -2331,9 +2317,9 @@ if test "$debug_tcg" = "yes" ; then
>  fi
>  if test "$mingw32" = "yes" ; then
>    echo "CONFIG_WIN32=y" >> $config_host_mak
> -  echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
> -  echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
> -  echo "QEMU_GA_VERSION=${QEMU_GA_VERSION}" >> $config_host_mak
> +  echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER-QEMU}" >> $config_host_mak
> +  echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO-Linux}" >> $config_host_mak
> +  echo "QEMU_GA_VERSION=${QEMU_GA_VERSION-$(cat "$source_path"/VERSION)}" >> $config_host_mak
>  else
>    echo "CONFIG_POSIX=y" >> $config_host_mak
>  fi
> @@ -2647,6 +2633,9 @@ preserve_env PKG_CONFIG
>  preserve_env PKG_CONFIG_LIBDIR
>  preserve_env PKG_CONFIG_PATH
>  preserve_env PYTHON
> +preserve_env QEMU_GA_MANUFACTURER
> +preserve_env QEMU_GA_DISTRO
> +preserve_env QEMU_GA_VERSION
>  preserve_env SDL2_CONFIG
>  preserve_env SMBD
>  preserve_env STRIP
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 05/30] configure: remove backwards-compatibility and obsolete options
  2022-12-09 11:23 ` [PATCH 05/30] configure: remove backwards-compatibility and obsolete options Paolo Bonzini
@ 2022-12-12  7:57   ` Marc-André Lureau
  2022-12-16 14:40   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12  7:57 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 9, 2022 at 3:43 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


> ---
>  configure | 20 --------------------
>  1 file changed, 20 deletions(-)
>
> diff --git a/configure b/configure
> index 4d14ff9c319c..adfff30a6204 100755
> --- a/configure
> +++ b/configure
> @@ -838,17 +838,6 @@ for opt do
>    ;;
>    --with-coroutine=*) coroutine="$optarg"
>    ;;
> -  --disable-zlib-test)
> -  ;;
> -  --disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
> -      echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
> -  ;;
> -  --enable-vhdx|--disable-vhdx)
> -      echo "$0: $opt is obsolete, VHDX driver is always built" >&2
> -  ;;
> -  --enable-uuid|--disable-uuid)
> -      echo "$0: $opt is obsolete, UUID support is always built" >&2
> -  ;;
>    --with-git=*) git="$optarg"
>    ;;
>    --with-git-submodules=*)
> @@ -868,19 +857,10 @@ for opt do
>    ;;
>    --gdb=*) gdb_bin="$optarg"
>    ;;
> -  # backwards compatibility options
> -  --enable-trace-backend=*) meson_option_parse "--enable-trace-backends=$optarg" "$optarg"
> -  ;;
> -  --disable-blobs) meson_option_parse --disable-install-blobs ""
> -  ;;
>    --enable-vfio-user-server) vfio_user_server="enabled"
>    ;;
>    --disable-vfio-user-server) vfio_user_server="disabled"
>    ;;
> -  --enable-tcmalloc) meson_option_parse --enable-malloc=tcmalloc tcmalloc
> -  ;;
> -  --enable-jemalloc) meson_option_parse --enable-malloc=jemalloc jemalloc
> -  ;;
>    # everything else has the same name in configure and meson
>    --*) meson_option_parse "$opt" "$optarg"
>    ;;
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 06/30] meson: tweak hardening options for Windows
  2022-12-09 11:23 ` [PATCH 06/30] meson: tweak hardening options for Windows Paolo Bonzini
@ 2022-12-12  8:18   ` Marc-André Lureau
  2022-12-12  8:52     ` Paolo Bonzini
  2022-12-16 14:42   ` Daniel P. Berrangé
  1 sibling, 1 reply; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12  8:18 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel, Mark Cave-Ayland

Hi

On Fri, Dec 9, 2022 at 3:36 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> -Wl,--dynamicbase has been enabled for DLLs upstream for roughly 2
> years (https://sourceware.org/bugzilla/show_bug.cgi?id=19011), and
> also by some distros including Debian for 6 years even
> (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=836365), so
> just enable it unconditionally.
>
> Also add -Wl,--high-entropy-va.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  meson.build | 5 +----
>  1 file changed, 1 insertion(+), 4 deletions(-)
>
> diff --git a/meson.build b/meson.build
> index 5c6b5a1c757f..d61c7a82f112 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -193,10 +193,7 @@ qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
>
>  if targetos == 'windows'
>    qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
> -  # Disable ASLR for debug builds to allow debugging with gdb
> -  if get_option('optimization') == '0'
> -    qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase')
> -  endif
> +  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')

What about the comment for disabling ASLR on debug builds?

I wonder if we really have to add those flags ourself. Imho, we can
leave them to the compiler default or distrib.. I bet most of the deps
don't use those flags explicitly either.

-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 07/30] meson: support meson 0.64 -Doptimization=plain
  2022-12-09 11:23 ` [PATCH 07/30] meson: support meson 0.64 -Doptimization=plain Paolo Bonzini
@ 2022-12-12  8:21   ` Marc-André Lureau
  2022-12-16 14:53   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12  8:21 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

Hi

On Fri, Dec 9, 2022 at 3:31 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> In Meson 0.64, the optimization built-in option now accepts the "plain" value,
> which will not set any optimization flags.  While QEMU does not check the
> contents of the option and therefore does not suffer any ill effect
> from the new value, it uses get_option to print the optimization flags
> in the summary.  Clean the code up to remove duplication, and check for
> -Doptimization=plain at the same time.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  meson.build | 16 +++++++---------
>  1 file changed, 7 insertions(+), 9 deletions(-)
>
> diff --git a/meson.build b/meson.build
> index d61c7a82f112..dbd0b5563446 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -3752,18 +3752,16 @@ endif
>  if targetos == 'darwin'
>    summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
>  endif
> -summary_info += {'CFLAGS':            ' '.join(get_option('c_args')
> -                                               + ['-O' + get_option('optimization')]
> -                                               + (get_option('debug') ? ['-g'] : []))}
> +option_cflags = (get_option('debug') ? ['-g'] : [])
> +if get_option('optimization') != 'plain'
> +  option_cflags += ['-O' + get_option('optimization')]
> +endif
> +summary_info += {'CFLAGS':            ' '.join(get_option('c_args') + option_cflags)}
>  if link_language == 'cpp'
> -  summary_info += {'CXXFLAGS':        ' '.join(get_option('cpp_args')
> -                                               + ['-O' + get_option('optimization')]
> -                                               + (get_option('debug') ? ['-g'] : []))}
> +  summary_info += {'CXXFLAGS':        ' '.join(get_option('cpp_args') + option_cflags)}
>  endif
>  if targetos == 'darwin'
> -  summary_info += {'OBJCFLAGS':       ' '.join(get_option('objc_args')
> -                                               + ['-O' + get_option('optimization')]
> -                                               + (get_option('debug') ? ['-g'] : []))}
> +  summary_info += {'OBJCFLAGS':       ' '.join(get_option('objc_args') + option_cflags)}
>  endif
>  link_args = get_option(link_language + '_link_args')
>  if link_args.length() > 0
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 09/30] meson: use prefer_static option
  2022-12-09 11:23 ` [PATCH 09/30] meson: use prefer_static option Paolo Bonzini
@ 2022-12-12  8:29   ` Marc-André Lureau
  2022-12-16 14:58   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12  8:29 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 9, 2022 at 3:42 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> The option is new in Meson 0.63 and removes the need to pass "static:
> true" to all dependency and find_library invocation.  Actually cleaning
> up the invocations is left for a separate patch.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


> ---
>  configure                   |  4 +---
>  docs/devel/build-system.rst |  3 +--
>  meson.build                 | 11 ++++-------
>  qga/meson.build             |  2 +-
>  4 files changed, 7 insertions(+), 13 deletions(-)
>
> diff --git a/configure b/configure
> index 411dfe977958..6efc2055ce09 100755
> --- a/configure
> +++ b/configure
> @@ -2315,9 +2315,6 @@ fi
>  if test "$solaris" = "yes" ; then
>    echo "CONFIG_SOLARIS=y" >> $config_host_mak
>  fi
> -if test "$static" = "yes" ; then
> -  echo "CONFIG_STATIC=y" >> $config_host_mak
> -fi
>  echo "SRC_PATH=$source_path" >> $config_host_mak
>  echo "TARGET_DIRS=$target_list" >> $config_host_mak
>  if test "$modules" = "yes"; then
> @@ -2540,6 +2537,7 @@ if test "$skip_meson" = no; then
>    # Built-in options
>    test "$bindir" != "bin" && meson_option_add "-Dbindir=$bindir"
>    test "$default_feature" = no && meson_option_add -Dauto_features=disabled
> +  test "$static" = yes && meson_option_add -Dprefer_static=true
>    test "$pie" = no && meson_option_add -Db_pie=false
>    test "$werror" = yes && meson_option_add -Dwerror=true
>
> diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst
> index 189472174340..9db18aff159e 100644
> --- a/docs/devel/build-system.rst
> +++ b/docs/devel/build-system.rst
> @@ -311,8 +311,7 @@ dependency will be used::
>    sdl_image = not_found
>    if not get_option('sdl_image').auto() or have_system
>      sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
> -                           method: 'pkg-config',
> -                           static: enable_static)
> +                           method: 'pkg-config')
>    endif
>
>  This avoids warnings on static builds of user-mode emulators, for example.
> diff --git a/meson.build b/meson.build
> index 19b023985325..dced840bfbee 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -18,10 +18,7 @@ sh = find_program('sh')
>  cc = meson.get_compiler('c')
>  config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
>  enable_modules = 'CONFIG_MODULES' in config_host
> -enable_static = 'CONFIG_STATIC' in config_host
> -
> -# Allow both shared and static libraries unless --enable-static
> -static_kwargs = enable_static ? {'static': true} : {}
> +static_kwargs = {}
>
>  # Temporary directory used for files created while
>  # configure runs. Since it is in the build directory
> @@ -183,7 +180,7 @@ qemu_cflags = config_host['QEMU_CFLAGS'].split()
>  qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
>  qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
>
> -if enable_static
> +if get_option('prefer_static')
>    qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
>  endif
>
> @@ -830,7 +827,7 @@ if targetos == 'linux' and have_tools and get_option('mpath').allowed()
>                                      kwargs: static_kwargs)
>    if libmpathpersist.found()
>      mpathlibs += libmpathpersist
> -    if enable_static
> +    if get_option('prefer_static')
>        mpathlibs += cc.find_library('devmapper',
>                                       required: get_option('mpath'),
>                                       kwargs: static_kwargs)
> @@ -1214,7 +1211,7 @@ if not gnutls_crypto.found()
>      # Debian has removed -lgpg-error from libgcrypt-config
>      # as it "spreads unnecessary dependencies" which in
>      # turn breaks static builds...
> -    if gcrypt.found() and enable_static
> +    if gcrypt.found() and get_option('prefer_static')
>        gcrypt = declare_dependency(dependencies: [
>          gcrypt,
>          cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
> diff --git a/qga/meson.build b/qga/meson.build
> index 3cfb9166e5d8..ec67326b25f3 100644
> --- a/qga/meson.build
> +++ b/qga/meson.build
> @@ -22,7 +22,7 @@ have_qga_vss = get_option('qga_vss') \
>      Then run configure with: --extra-cxxflags="-isystem /path/to/vss/inc/win2003"''') \
>    .require(midl.found() or widl.found(),
>             error_message: 'VSS support requires midl or widl') \
> -  .require(not enable_static,
> +  .require(not get_option('prefer_static'),
>             error_message: 'VSS support requires dynamic linking with GLib') \
>    .allowed()
>
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 10/30] meson: remove static_kwargs
  2022-12-09 11:23 ` [PATCH 10/30] meson: remove static_kwargs Paolo Bonzini
@ 2022-12-12  8:32   ` Marc-André Lureau
  2022-12-16 14:59   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12  8:32 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 9, 2022 at 3:31 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> After static_kwargs has been changed to an empty dictionary, it has
> no functional effect and can be removed.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


> ---
>  meson.build     | 212 +++++++++++++++++++-----------------------------
>  tcg/meson.build |   2 +-
>  2 files changed, 84 insertions(+), 130 deletions(-)
>
> diff --git a/meson.build b/meson.build
> index dced840bfbee..9ccbe0f6e4ee 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -18,7 +18,6 @@ sh = find_program('sh')
>  cc = meson.get_compiler('c')
>  config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
>  enable_modules = 'CONFIG_MODULES' in config_host
> -static_kwargs = {}
>
>  # Temporary directory used for files created while
>  # configure runs. Since it is in the build directory
> @@ -510,7 +509,7 @@ gdbus_codegen = not_found
>  gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
>  if not get_option('gio').auto() or have_system
>    gio = dependency('gio-2.0', required: get_option('gio'),
> -                   method: 'pkg-config', kwargs: static_kwargs)
> +                   method: 'pkg-config')
>    if gio.found() and not cc.links('''
>      #include <gio/gio.h>
>      int main(void)
> @@ -527,7 +526,7 @@ if not get_option('gio').auto() or have_system
>      gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'),
>                                   required: get_option('gio'))
>      gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
> -                          method: 'pkg-config', kwargs: static_kwargs)
> +                          method: 'pkg-config')
>      gio = declare_dependency(dependencies: [gio, gio_unix],
>                               version: gio.version())
>    endif
> @@ -540,20 +539,19 @@ endif
>  lttng = not_found
>  if 'ust' in get_option('trace_backends')
>    lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
> -                     method: 'pkg-config', kwargs: static_kwargs)
> +                     method: 'pkg-config')
>  endif
>  pixman = not_found
>  if have_system or have_tools
>    pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
> -                      method: 'pkg-config', kwargs: static_kwargs)
> +                      method: 'pkg-config')
>  endif
> -zlib = dependency('zlib', required: true, kwargs: static_kwargs)
> +zlib = dependency('zlib', required: true)
>
>  libaio = not_found
>  if not get_option('linux_aio').auto() or have_block
>    libaio = cc.find_library('aio', has_headers: ['libaio.h'],
> -                           required: get_option('linux_aio'),
> -                           kwargs: static_kwargs)
> +                           required: get_option('linux_aio'))
>  endif
>
>  linux_io_uring_test = '''
> @@ -566,7 +564,7 @@ linux_io_uring = not_found
>  if not get_option('linux_io_uring').auto() or have_block
>    linux_io_uring = dependency('liburing', version: '>=0.3',
>                                required: get_option('linux_io_uring'),
> -                              method: 'pkg-config', kwargs: static_kwargs)
> +                              method: 'pkg-config')
>    if not cc.links(linux_io_uring_test)
>      linux_io_uring = not_found
>    endif
> @@ -576,7 +574,7 @@ libnfs = not_found
>  if not get_option('libnfs').auto() or have_block
>    libnfs = dependency('libnfs', version: '>=1.9.3',
>                        required: get_option('libnfs'),
> -                      method: 'pkg-config', kwargs: static_kwargs)
> +                      method: 'pkg-config')
>  endif
>
>  libattr_test = '''
> @@ -596,8 +594,7 @@ if get_option('attr').allowed()
>      libattr = declare_dependency()
>    else
>      libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
> -                              required: get_option('attr'),
> -                              kwargs: static_kwargs)
> +                              required: get_option('attr'))
>      if libattr.found() and not \
>        cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
>        libattr = not_found
> @@ -632,7 +629,7 @@ seccomp_has_sysrawrc = false
>  if not get_option('seccomp').auto() or have_system or have_tools
>    seccomp = dependency('libseccomp', version: '>=2.3.0',
>                         required: get_option('seccomp'),
> -                       method: 'pkg-config', kwargs: static_kwargs)
> +                       method: 'pkg-config')
>    if seccomp.found()
>      seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
>                                                  'SCMP_FLTATR_API_SYSRAWRC',
> @@ -643,8 +640,7 @@ endif
>  libcap_ng = not_found
>  if not get_option('cap_ng').auto() or have_system or have_tools
>    libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
> -                              required: get_option('cap_ng'),
> -                              kwargs: static_kwargs)
> +                              required: get_option('cap_ng'))
>  endif
>  if libcap_ng.found() and not cc.links('''
>     #include <cap-ng.h>
> @@ -665,13 +661,13 @@ if get_option('xkbcommon').auto() and not have_system and not have_tools
>    xkbcommon = not_found
>  else
>    xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
> -                         method: 'pkg-config', kwargs: static_kwargs)
> +                         method: 'pkg-config')
>  endif
>
>  slirp = not_found
>  if not get_option('slirp').auto() or have_system
>    slirp = dependency('slirp', required: get_option('slirp'),
> -                     method: 'pkg-config', kwargs: static_kwargs)
> +                     method: 'pkg-config')
>    # slirp < 4.7 is incompatible with CFI support in QEMU.  This is because
>    # it passes function pointers within libslirp as callbacks for timers.
>    # When using a system-wide shared libslirp, the type information for the
> @@ -691,8 +687,7 @@ endif
>  vde = not_found
>  if not get_option('vde').auto() or have_system or have_tools
>    vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
> -                           required: get_option('vde'),
> -                           kwargs: static_kwargs)
> +                           required: get_option('vde'))
>  endif
>  if vde.found() and not cc.links('''
>     #include <libvdeplug.h>
> @@ -714,35 +709,35 @@ endif
>  pulse = not_found
>  if not get_option('pa').auto() or (targetos == 'linux' and have_system)
>    pulse = dependency('libpulse', required: get_option('pa'),
> -                     method: 'pkg-config', kwargs: static_kwargs)
> +                     method: 'pkg-config')
>  endif
>  alsa = not_found
>  if not get_option('alsa').auto() or (targetos == 'linux' and have_system)
>    alsa = dependency('alsa', required: get_option('alsa'),
> -                    method: 'pkg-config', kwargs: static_kwargs)
> +                    method: 'pkg-config')
>  endif
>  jack = not_found
>  if not get_option('jack').auto() or have_system
>    jack = dependency('jack', required: get_option('jack'),
> -                    method: 'pkg-config', kwargs: static_kwargs)
> +                    method: 'pkg-config')
>  endif
>  sndio = not_found
>  if not get_option('sndio').auto() or have_system
>    sndio = dependency('sndio', required: get_option('sndio'),
> -                    method: 'pkg-config', kwargs: static_kwargs)
> +                    method: 'pkg-config')
>  endif
>
>  spice_protocol = not_found
>  if not get_option('spice_protocol').auto() or have_system
>    spice_protocol = dependency('spice-protocol', version: '>=0.12.3',
>                                required: get_option('spice_protocol'),
> -                              method: 'pkg-config', kwargs: static_kwargs)
> +                              method: 'pkg-config')
>  endif
>  spice = not_found
>  if not get_option('spice').auto() or have_system
>    spice = dependency('spice-server', version: '>=0.12.5',
>                       required: get_option('spice'),
> -                     method: 'pkg-config', kwargs: static_kwargs)
> +                     method: 'pkg-config')
>  endif
>  spice_headers = spice.partial_dependency(compile_args: true, includes: true)
>
> @@ -752,13 +747,13 @@ libiscsi = not_found
>  if not get_option('libiscsi').auto() or have_block
>    libiscsi = dependency('libiscsi', version: '>=1.9.0',
>                           required: get_option('libiscsi'),
> -                         method: 'pkg-config', kwargs: static_kwargs)
> +                         method: 'pkg-config')
>  endif
>  zstd = not_found
>  if not get_option('zstd').auto() or have_block
>    zstd = dependency('libzstd', version: '>=1.4.0',
>                      required: get_option('zstd'),
> -                    method: 'pkg-config', kwargs: static_kwargs)
> +                    method: 'pkg-config')
>  endif
>  virgl = not_found
>
> @@ -766,29 +761,25 @@ have_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found()
>  if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
>    virgl = dependency('virglrenderer',
>                       method: 'pkg-config',
> -                     required: get_option('virglrenderer'),
> -                     kwargs: static_kwargs)
> +                     required: get_option('virglrenderer'))
>  endif
>  blkio = not_found
>  if not get_option('blkio').auto() or have_block
>    blkio = dependency('blkio',
>                       method: 'pkg-config',
> -                     required: get_option('blkio'),
> -                     kwargs: static_kwargs)
> +                     required: get_option('blkio'))
>  endif
>  curl = not_found
>  if not get_option('curl').auto() or have_block
>    curl = dependency('libcurl', version: '>=7.29.0',
>                      method: 'pkg-config',
> -                    required: get_option('curl'),
> -                    kwargs: static_kwargs)
> +                    required: get_option('curl'))
>  endif
>  libudev = not_found
>  if targetos == 'linux' and (have_system or have_tools)
>    libudev = dependency('libudev',
>                         method: 'pkg-config',
> -                       required: get_option('libudev'),
> -                       kwargs: static_kwargs)
> +                       required: get_option('libudev'))
>  endif
>
>  mpathlibs = [libudev]
> @@ -823,18 +814,15 @@ if targetos == 'linux' and have_tools and get_option('mpath').allowed()
>            return 0;
>        }'''
>    libmpathpersist = cc.find_library('mpathpersist',
> -                                    required: get_option('mpath'),
> -                                    kwargs: static_kwargs)
> +                                    required: get_option('mpath'))
>    if libmpathpersist.found()
>      mpathlibs += libmpathpersist
>      if get_option('prefer_static')
>        mpathlibs += cc.find_library('devmapper',
> -                                     required: get_option('mpath'),
> -                                     kwargs: static_kwargs)
> +                                     required: get_option('mpath'))
>      endif
>      mpathlibs += cc.find_library('multipath',
> -                                 required: get_option('mpath'),
> -                                 kwargs: static_kwargs)
> +                                 required: get_option('mpath'))
>      foreach lib: mpathlibs
>        if not lib.found()
>          mpathlibs = []
> @@ -884,8 +872,7 @@ if have_system and get_option('curses').allowed()
>    curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
>    curses = dependency(curses_dep_list,
>                        required: false,
> -                      method: 'pkg-config',
> -                      kwargs: static_kwargs)
> +                      method: 'pkg-config')
>    msg = get_option('curses').enabled() ? 'curses library not found' : ''
>    curses_compile_args = ['-DNCURSES_WIDECHAR=1']
>    if curses.found()
> @@ -907,8 +894,7 @@ if have_system and get_option('curses').allowed()
>        curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
>        foreach curses_libname : curses_libname_list
>          libcurses = cc.find_library(curses_libname,
> -                                    required: false,
> -                                    kwargs: static_kwargs)
> +                                    required: false)
>          if libcurses.found()
>            if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
>              curses = declare_dependency(compile_args: curses_compile_args,
> @@ -958,8 +944,7 @@ endif
>  brlapi = not_found
>  if not get_option('brlapi').auto() or have_system
>    brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
> -                         required: get_option('brlapi'),
> -                         kwargs: static_kwargs)
> +                         required: get_option('brlapi'))
>    if brlapi.found() and not cc.links('''
>       #include <brlapi.h>
>       #include <stddef.h>
> @@ -975,7 +960,7 @@ endif
>
>  sdl = not_found
>  if not get_option('sdl').auto() or have_system
> -  sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
> +  sdl = dependency('sdl2', required: get_option('sdl'))
>    sdl_image = not_found
>  endif
>  if sdl.found()
> @@ -983,7 +968,7 @@ if sdl.found()
>    sdl = declare_dependency(compile_args: '-Wno-undef',
>                             dependencies: sdl)
>    sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
> -                         method: 'pkg-config', kwargs: static_kwargs)
> +                         method: 'pkg-config')
>  else
>    if get_option('sdl_image').enabled()
>      error('sdl-image required, but SDL was @0@'.format(
> @@ -994,11 +979,9 @@ endif
>
>  rbd = not_found
>  if not get_option('rbd').auto() or have_block
> -  librados = cc.find_library('rados', required: get_option('rbd'),
> -                             kwargs: static_kwargs)
> +  librados = cc.find_library('rados', required: get_option('rbd'))
>    librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
> -                           required: get_option('rbd'),
> -                           kwargs: static_kwargs)
> +                           required: get_option('rbd'))
>    if librados.found() and librbd.found()
>      if cc.links('''
>        #include <stdio.h>
> @@ -1026,7 +1009,7 @@ glusterfs_iocb_has_stat = false
>  if not get_option('glusterfs').auto() or have_block
>    glusterfs = dependency('glusterfs-api', version: '>=3',
>                           required: get_option('glusterfs'),
> -                         method: 'pkg-config', kwargs: static_kwargs)
> +                         method: 'pkg-config')
>    if glusterfs.found()
>      glusterfs_ftruncate_has_stat = cc.links('''
>        #include <glusterfs/api/glfs.h>
> @@ -1061,15 +1044,13 @@ libssh = not_found
>  if not get_option('libssh').auto() or have_block
>    libssh = dependency('libssh', version: '>=0.8.7',
>                      method: 'pkg-config',
> -                    required: get_option('libssh'),
> -                    kwargs: static_kwargs)
> +                    required: get_option('libssh'))
>  endif
>
>  libbzip2 = not_found
>  if not get_option('bzip2').auto() or have_block
>    libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
> -                             required: get_option('bzip2'),
> -                             kwargs: static_kwargs)
> +                             required: get_option('bzip2'))
>    if libbzip2.found() and not cc.links('''
>       #include <bzlib.h>
>       int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
> @@ -1085,8 +1066,7 @@ endif
>  liblzfse = not_found
>  if not get_option('lzfse').auto() or have_block
>    liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
> -                             required: get_option('lzfse'),
> -                             kwargs: static_kwargs)
> +                             required: get_option('lzfse'))
>  endif
>  if liblzfse.found() and not cc.links('''
>     #include <lzfse.h>
> @@ -1104,8 +1084,7 @@ if get_option('oss').allowed() and have_system
>    if not cc.has_header('sys/soundcard.h')
>      # not found
>    elif targetos == 'netbsd'
> -    oss = cc.find_library('ossaudio', required: get_option('oss'),
> -                          kwargs: static_kwargs)
> +    oss = cc.find_library('ossaudio', required: get_option('oss'))
>    else
>      oss = declare_dependency()
>    endif
> @@ -1138,7 +1117,7 @@ endif
>  opengl = not_found
>  if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
>    epoxy = dependency('epoxy', method: 'pkg-config',
> -                      required: get_option('opengl'), kwargs: static_kwargs)
> +                      required: get_option('opengl'))
>    if cc.has_header('epoxy/egl.h', dependencies: epoxy)
>      opengl = epoxy
>    elif get_option('opengl').enabled()
> @@ -1147,8 +1126,7 @@ if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
>  endif
>  gbm = not_found
>  if (have_system or have_tools) and (virgl.found() or opengl.found())
> -  gbm = dependency('gbm', method: 'pkg-config', required: false,
> -                   kwargs: static_kwargs)
> +  gbm = dependency('gbm', method: 'pkg-config', required: false)
>  endif
>  have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
>
> @@ -1170,16 +1148,14 @@ if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_syste
>    # the platform support requirements
>    gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
>                               method: 'pkg-config',
> -                             required: false,
> -                             kwargs: static_kwargs)
> +                             required: false)
>    if gnutls_crypto.found()
>      gnutls = gnutls_crypto
>    else
>      # Our min version if all we need is TLS
>      gnutls = dependency('gnutls', version: '>=3.5.18',
>                          method: 'pkg-config',
> -                        required: get_option('gnutls'),
> -                        kwargs: static_kwargs)
> +                        required: get_option('gnutls'))
>    endif
>  endif
>
> @@ -1206,34 +1182,31 @@ if not gnutls_crypto.found()
>    if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
>      gcrypt = dependency('libgcrypt', version: '>=1.8',
>                          method: 'config-tool',
> -                        required: get_option('gcrypt'),
> -                        kwargs: static_kwargs)
> +                        required: get_option('gcrypt'))
>      # Debian has removed -lgpg-error from libgcrypt-config
>      # as it "spreads unnecessary dependencies" which in
>      # turn breaks static builds...
>      if gcrypt.found() and get_option('prefer_static')
>        gcrypt = declare_dependency(dependencies: [
>          gcrypt,
> -        cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
> +        cc.find_library('gpg-error', required: true)])
>      endif
>    endif
>    if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
>      nettle = dependency('nettle', version: '>=3.4',
>                          method: 'pkg-config',
> -                        required: get_option('nettle'),
> -                        kwargs: static_kwargs)
> +                        required: get_option('nettle'))
>      if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
>        xts = 'private'
>      endif
>    endif
>  endif
>
> -gmp = dependency('gmp', required: false, method: 'pkg-config', kwargs: static_kwargs)
> +gmp = dependency('gmp', required: false, method: 'pkg-config')
>  if nettle.found() and gmp.found()
>    hogweed = dependency('hogweed', version: '>=3.4',
>                         method: 'pkg-config',
> -                       required: get_option('nettle'),
> -                       kwargs: static_kwargs)
> +                       required: get_option('nettle'))
>  endif
>
>
> @@ -1245,20 +1218,17 @@ have_gtk_clipboard = get_option('gtk_clipboard').enabled()
>  if not get_option('gtk').auto() or have_system
>    gtk = dependency('gtk+-3.0', version: '>=3.22.0',
>                     method: 'pkg-config',
> -                   required: get_option('gtk'),
> -                   kwargs: static_kwargs)
> +                   required: get_option('gtk'))
>    if gtk.found()
>      gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
>                          method: 'pkg-config',
> -                        required: false,
> -                        kwargs: static_kwargs)
> +                        required: false)
>      gtk = declare_dependency(dependencies: [gtk, gtkx11])
>
>      if not get_option('vte').auto() or have_system
>        vte = dependency('vte-2.91',
>                         method: 'pkg-config',
> -                       required: get_option('vte'),
> -                       kwargs: static_kwargs)
> +                       required: get_option('vte'))
>      endif
>    elif have_gtk_clipboard
>      error('GTK clipboard requested, but GTK not found')
> @@ -1267,13 +1237,12 @@ endif
>
>  x11 = not_found
>  if gtkx11.found()
> -  x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
> -                   kwargs: static_kwargs)
> +  x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
>  endif
>  png = not_found
>  if get_option('png').allowed() and have_system
>     png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
> -                    method: 'pkg-config', kwargs: static_kwargs)
> +                    method: 'pkg-config')
>  endif
>  vnc = not_found
>  jpeg = not_found
> @@ -1281,10 +1250,9 @@ sasl = not_found
>  if get_option('vnc').allowed() and have_system
>    vnc = declare_dependency() # dummy dependency
>    jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
> -                    method: 'pkg-config', kwargs: static_kwargs)
> +                    method: 'pkg-config')
>    sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
> -                         required: get_option('vnc_sasl'),
> -                         kwargs: static_kwargs)
> +                         required: get_option('vnc_sasl'))
>    if sasl.found()
>      sasl = declare_dependency(dependencies: sasl,
>                                compile_args: '-DSTRUCT_IOVEC_DEFINED')
> @@ -1294,8 +1262,7 @@ endif
>  pam = not_found
>  if not get_option('auth_pam').auto() or have_system
>    pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
> -                        required: get_option('auth_pam'),
> -                        kwargs: static_kwargs)
> +                        required: get_option('auth_pam'))
>  endif
>  if pam.found() and not cc.links('''
>     #include <stddef.h>
> @@ -1319,8 +1286,7 @@ endif
>  snappy = not_found
>  if not get_option('snappy').auto() or have_system
>    snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
> -                           required: get_option('snappy'),
> -                           kwargs: static_kwargs)
> +                           required: get_option('snappy'))
>  endif
>  if snappy.found() and not linker.links('''
>     #include <snappy-c.h>
> @@ -1336,8 +1302,7 @@ endif
>  lzo = not_found
>  if not get_option('lzo').auto() or have_system
>    lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
> -                        required: get_option('lzo'),
> -                        kwargs: static_kwargs)
> +                        required: get_option('lzo'))
>  endif
>  if lzo.found() and not cc.links('''
>     #include <lzo/lzo1x.h>
> @@ -1353,8 +1318,7 @@ endif
>  numa = not_found
>  if not get_option('numa').auto() or have_system or have_tools
>    numa = cc.find_library('numa', has_headers: ['numa.h'],
> -                              required: get_option('numa'),
> -                              kwargs: static_kwargs)
> +                              required: get_option('numa'))
>  endif
>  if numa.found() and not cc.links('''
>     #include <numa.h>
> @@ -1372,10 +1336,8 @@ rdma = not_found
>  if not get_option('rdma').auto() or have_system
>    libumad = cc.find_library('ibumad', required: get_option('rdma'))
>    rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
> -                               required: get_option('rdma'),
> -                               kwargs: static_kwargs),
> -               cc.find_library('ibverbs', required: get_option('rdma'),
> -                               kwargs: static_kwargs),
> +                               required: get_option('rdma')),
> +               cc.find_library('ibverbs', required: get_option('rdma')),
>                 libumad]
>    rdma = declare_dependency(dependencies: rdma_libs)
>    foreach lib: rdma_libs
> @@ -1388,30 +1350,30 @@ endif
>  xen = not_found
>  if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
>    xencontrol = dependency('xencontrol', required: false,
> -                          method: 'pkg-config', kwargs: static_kwargs)
> +                          method: 'pkg-config')
>    if xencontrol.found()
>      xen_pc = declare_dependency(version: xencontrol.version(),
>        dependencies: [
>          xencontrol,
>          # disabler: true makes xen_pc.found() return false if any is not found
>          dependency('xenstore', required: false,
> -                   method: 'pkg-config', kwargs: static_kwargs,
> +                   method: 'pkg-config',
>                     disabler: true),
>          dependency('xenforeignmemory', required: false,
> -                   method: 'pkg-config', kwargs: static_kwargs,
> +                   method: 'pkg-config',
>                     disabler: true),
>          dependency('xengnttab', required: false,
> -                   method: 'pkg-config', kwargs: static_kwargs,
> +                   method: 'pkg-config',
>                     disabler: true),
>          dependency('xenevtchn', required: false,
> -                   method: 'pkg-config', kwargs: static_kwargs,
> +                   method: 'pkg-config',
>                     disabler: true),
>          dependency('xendevicemodel', required: false,
> -                   method: 'pkg-config', kwargs: static_kwargs,
> +                   method: 'pkg-config',
>                     disabler: true),
>          # optional, no "disabler: true"
>          dependency('xentoolcore', required: false,
> -                   method: 'pkg-config', kwargs: static_kwargs)])
> +                   method: 'pkg-config')])
>      if xen_pc.found()
>        xen = xen_pc
>      endif
> @@ -1469,60 +1431,53 @@ have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
>  cacard = not_found
>  if not get_option('smartcard').auto() or have_system
>    cacard = dependency('libcacard', required: get_option('smartcard'),
> -                      version: '>=2.5.1', method: 'pkg-config',
> -                      kwargs: static_kwargs)
> +                      version: '>=2.5.1', method: 'pkg-config')
>  endif
>  u2f = not_found
>  if have_system
>    u2f = dependency('u2f-emu', required: get_option('u2f'),
> -                   method: 'pkg-config',
> -                   kwargs: static_kwargs)
> +                   method: 'pkg-config')
>  endif
>  canokey = not_found
>  if have_system
>    canokey = dependency('canokey-qemu', required: get_option('canokey'),
> -                   method: 'pkg-config',
> -                   kwargs: static_kwargs)
> +                   method: 'pkg-config')
>  endif
>  usbredir = not_found
>  if not get_option('usb_redir').auto() or have_system
>    usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
> -                        version: '>=0.6', method: 'pkg-config',
> -                        kwargs: static_kwargs)
> +                        version: '>=0.6', method: 'pkg-config')
>  endif
>  libusb = not_found
>  if not get_option('libusb').auto() or have_system
>    libusb = dependency('libusb-1.0', required: get_option('libusb'),
> -                      version: '>=1.0.13', method: 'pkg-config',
> -                      kwargs: static_kwargs)
> +                      version: '>=1.0.13', method: 'pkg-config')
>  endif
>
>  libpmem = not_found
>  if not get_option('libpmem').auto() or have_system
>    libpmem = dependency('libpmem', required: get_option('libpmem'),
> -                       method: 'pkg-config', kwargs: static_kwargs)
> +                       method: 'pkg-config')
>  endif
>  libdaxctl = not_found
>  if not get_option('libdaxctl').auto() or have_system
>    libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
> -                         version: '>=57', method: 'pkg-config',
> -                         kwargs: static_kwargs)
> +                         version: '>=57', method: 'pkg-config')
>  endif
>  tasn1 = not_found
>  if gnutls.found()
>    tasn1 = dependency('libtasn1',
> -                     method: 'pkg-config',
> -                     kwargs: static_kwargs)
> +                     method: 'pkg-config')
>  endif
>  keyutils = dependency('libkeyutils', required: false,
> -                      method: 'pkg-config', kwargs: static_kwargs)
> +                      method: 'pkg-config')
>
>  has_gettid = cc.has_function('gettid')
>
>  # libselinux
>  selinux = dependency('libselinux',
>                       required: get_option('selinux'),
> -                     method: 'pkg-config', kwargs: static_kwargs)
> +                     method: 'pkg-config')
>
>  # Malloc tests
>
> @@ -1586,8 +1541,7 @@ if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
>  endif
>
>  fuse = dependency('fuse3', required: get_option('fuse'),
> -                  version: '>=3.1', method: 'pkg-config',
> -                  kwargs: static_kwargs)
> +                  version: '>=3.1', method: 'pkg-config')
>
>  fuse_lseek = not_found
>  if get_option('fuse_lseek').allowed()
> @@ -2677,7 +2631,7 @@ genh += custom_target('config-poison.h',
>  capstone = not_found
>  if not get_option('capstone').auto() or have_system or have_user
>    capstone = dependency('capstone', version: '>=3.0.5',
> -                        kwargs: static_kwargs, method: 'pkg-config',
> +                        method: 'pkg-config',
>                          required: get_option('capstone'))
>
>    # Some versions of capstone have broken pkg-config file
> @@ -2713,7 +2667,7 @@ if have_system
>    fdt_opt = get_option('fdt')
>    if fdt_opt in ['enabled', 'auto', 'system']
>      have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
> -    fdt = cc.find_library('fdt', kwargs: static_kwargs,
> +    fdt = cc.find_library('fdt',
>                            required: fdt_opt == 'system' or
>                                      fdt_opt == 'enabled' and not have_internal)
>      if fdt.found() and cc.links('''
> diff --git a/tcg/meson.build b/tcg/meson.build
> index c4c63b19d4ed..3db551bb3485 100644
> --- a/tcg/meson.build
> +++ b/tcg/meson.build
> @@ -12,7 +12,7 @@ tcg_ss.add(files(
>
>  if get_option('tcg_interpreter')
>    libffi = dependency('libffi', version: '>=3.0', required: true,
> -                      method: 'pkg-config', kwargs: static_kwargs)
> +                      method: 'pkg-config')
>    specific_ss.add(libffi)
>    specific_ss.add(files('tci.c'))
>  endif
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 11/30] meson: cleanup dummy-cpus.c rules
  2022-12-09 11:23 ` [PATCH 11/30] meson: cleanup dummy-cpus.c rules Paolo Bonzini
@ 2022-12-12  8:39   ` Marc-André Lureau
  2022-12-16 14:59   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12  8:39 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

Hi

On Fri, Dec 9, 2022 at 3:48 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Now that qtest is available on all targets including Windows, dummy-cpus.c
> is included unconditionally in the build.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

(and doesn't have to be target specific)

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


> ---
>  accel/meson.build | 9 ++-------
>  1 file changed, 2 insertions(+), 7 deletions(-)
>
> diff --git a/accel/meson.build b/accel/meson.build
> index 259c35c4c882..3a480cc2efef 100644
> --- a/accel/meson.build
> +++ b/accel/meson.build
> @@ -11,10 +11,5 @@ if have_system
>    subdir('stubs')
>  endif
>
> -dummy_ss = ss.source_set()
> -dummy_ss.add(files(
> -  'dummy-cpus.c',
> -))
> -
> -specific_ss.add_all(when: ['CONFIG_SOFTMMU'], if_true: dummy_ss)
> -specific_ss.add_all(when: ['CONFIG_XEN'], if_true: dummy_ss)
> +# qtest
> +softmmu_ss.add(files('dummy-cpus.c'))
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 12/30] modinfo: lookup compile_commands.json by object
  2022-12-09 11:23 ` [PATCH 12/30] modinfo: lookup compile_commands.json by object Paolo Bonzini
@ 2022-12-12  8:47   ` Marc-André Lureau
  0 siblings, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12  8:47 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel, Gerd Hoffmann

On Fri, Dec 9, 2022 at 3:43 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> With Meson 0.63 having fixed various issues with extract_objects, the
> compile_commands.json lookups can be simplified.  If the lookup uses
> the object file as key, there is no need to use the command line to
> distinguish among all entries for a given source.
>
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>


> ---
>  meson.build                | 14 ++++----------
>  scripts/modinfo-collect.py | 23 +++++++++++------------
>  2 files changed, 15 insertions(+), 22 deletions(-)
>
> diff --git a/meson.build b/meson.build
> index 9ccbe0f6e4ee..8a9ed5628317 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -3123,16 +3123,11 @@ foreach d, list : modules
>          softmmu_mods += sl
>        endif
>        if module_ss.sources() != []
> -        # FIXME: Should use sl.extract_all_objects(recursive: true) as
> -        # input. Sources can be used multiple times but objects are
> -        # unique when it comes to lookup in compile_commands.json.
> -        # Depnds on a mesion version with
> -        # https://github.com/mesonbuild/meson/pull/8900
>          modinfo_files += custom_target(d + '-' + m + '.modinfo',
>                                         output: d + '-' + m + '.modinfo',
> -                                       input: module_ss.sources() + genh,
> +                                       input: sl.extract_all_objects(recursive: true),
>                                         capture: true,
> -                                       command: [modinfo_collect, module_ss.sources()])
> +                                       command: [modinfo_collect, '@INPUT@'])
>        endif
>      else
>        if d == 'block'
> @@ -3165,12 +3160,11 @@ foreach d, list : target_modules
>                                  c_args: c_args,
>                                  pic: true)
>              softmmu_mods += sl
> -            # FIXME: Should use sl.extract_all_objects(recursive: true) too.
>              modinfo_files += custom_target(module_name + '.modinfo',
>                                             output: module_name + '.modinfo',
> -                                           input: target_module_ss.sources() + genh,
> +                                           input: sl.extract_all_objects(recursive: true),
>                                             capture: true,
> -                                           command: [modinfo_collect, '--target', target, target_module_ss.sources()])
> +                                           command: [modinfo_collect, '--target', target, '@INPUT@'])
>            endif
>          endif
>        endforeach
> diff --git a/scripts/modinfo-collect.py b/scripts/modinfo-collect.py
> index 4e7584df6676..48bd92bd6180 100755
> --- a/scripts/modinfo-collect.py
> +++ b/scripts/modinfo-collect.py
> @@ -7,15 +7,6 @@
>  import shlex
>  import subprocess
>
> -def find_command(src, target, compile_commands):
> -    for command in compile_commands:
> -        if command['file'] != src:
> -            continue
> -        if target != '' and command['command'].find(target) == -1:
> -            continue
> -        return command['command']
> -    return 'false'
> -
>  def process_command(src, command):
>      skip = False
>      out = []
> @@ -43,14 +34,22 @@ def main(args):
>          print("MODINFO_DEBUG target %s" % target)
>          arch = target[:-8] # cut '-softmmu'
>          print("MODINFO_START arch \"%s\" MODINFO_END" % arch)
> +
>      with open('compile_commands.json') as f:
> -        compile_commands = json.load(f)
> -    for src in args:
> +        compile_commands_json = json.load(f)
> +    compile_commands = { x['output']: x for x in compile_commands_json }
> +
> +    for obj in args:
> +        entry = compile_commands.get(obj, None)
> +        if not entry:
> +            sys.stderr.print('modinfo: Could not find object file', obj)
> +            sys.exit(1)
> +        src = entry['file']
>          if not src.endswith('.c'):
>              print("MODINFO_DEBUG skip %s" % src)
>              continue
> +        command = entry['command']
>          print("MODINFO_DEBUG src %s" % src)
> -        command = find_command(src, target, compile_commands)
>          cmdline = process_command(src, command)
>          print("MODINFO_DEBUG cmd", cmdline)
>          result = subprocess.run(cmdline, stdout = subprocess.PIPE,
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 06/30] meson: tweak hardening options for Windows
  2022-12-12  8:18   ` Marc-André Lureau
@ 2022-12-12  8:52     ` Paolo Bonzini
  0 siblings, 0 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-12  8:52 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Mark Cave-Ayland

On 12/12/22 09:18, Marc-André Lureau wrote:
>> -  # Disable ASLR for debug builds to allow debugging with gdb
>> -  if get_option('optimization') == '0'
>> -    qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase')
>> -  endif
>> +  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
>
> What about the comment for disabling ASLR on debug builds?

The problem with that line is that it _enables_ ASLR for debug builds, 
and nobody has complained about gdb since last April...  And nobody has 
complained to Debian or other distros that have enabled the flag for 
years now.

I'll clarify the commit message.

> I wonder if we really have to add those flags ourself. Imho, we can
> leave them to the compiler default or distrib.. I bet most of the deps
> don't use those flags explicitly either.

I think so, at least Firefox does.  In general QEMU tries to do more 
build-time hardening than the average pacakge.

Paolo



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 13/30] configure: remove backwards-compatibility code
  2022-12-09 11:23 ` [PATCH 13/30] configure: remove backwards-compatibility code Paolo Bonzini
@ 2022-12-12  8:55   ` Marc-André Lureau
  0 siblings, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12  8:55 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

Hi

On Fri, Dec 9, 2022 at 3:28 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> The cmd_line.txt mangling is only needed when rebuilding from very old
> trees and is kept mostly as an example of how to extend it.  However,
> Meson 0.63 introduces a deprecation mechanism for meson_options.txt
> that can be used instead, so get rid of our home-grown hack.

For the curious
https://mesonbuild.com/Release-notes-for-0-63-0.html#deprecate-an-option-and-replace-it-with-a-new-one

>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  configure | 10 ----------
>  1 file changed, 10 deletions(-)
>
> diff --git a/configure b/configure
> index 6efc2055ce09..113db838a16f 100755
> --- a/configure
> +++ b/configure
> @@ -2556,16 +2556,6 @@ if test "$skip_meson" = no; then
>    if test "$?" -ne 0 ; then
>        error_exit "meson setup failed"
>    fi
> -else
> -  if test -f meson-private/cmd_line.txt; then
> -    # Adjust old command line options whose type was changed
> -    # Avoids having to use "setup --wipe" when Meson is upgraded
> -    perl -i -ne '
> -      s/^gettext = true$/gettext = auto/;
> -      s/^gettext = false$/gettext = disabled/;
> -      /^b_staticpic/ && next;
> -      print;' meson-private/cmd_line.txt
> -  fi
>  fi

It's unlikely that users will jump directly from those old versions to
this, so it's fine to me if don't handle adjustments in that case.

>
>  # Save the configure command line for later reuse.
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 15/30] meson: cleanup compiler detection
  2022-12-09 11:23 ` [PATCH 15/30] meson: cleanup compiler detection Paolo Bonzini
@ 2022-12-12  9:04   ` Marc-André Lureau
  2022-12-16 15:03   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12  9:04 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 9, 2022 at 3:29 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Detect all compilers at the beginning of meson.build, and store
> the available languages in an array.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  meson.build | 62 ++++++++++++++++++++++++++++++-----------------------
>  1 file changed, 35 insertions(+), 27 deletions(-)
>
> diff --git a/meson.build b/meson.build
> index 8a9ed5628317..c4fa82ae8ba4 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -15,9 +15,21 @@ ss = import('sourceset')
>  fs = import('fs')
>
>  sh = find_program('sh')
> -cc = meson.get_compiler('c')
>  config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
>  enable_modules = 'CONFIG_MODULES' in config_host
> +targetos = host_machine.system()
> +
> +cc = meson.get_compiler('c')
> +all_languages = ['c']
> +if add_languages('cpp', required: false, native: false)
> +  all_languages += ['cpp']
> +  cxx = meson.get_compiler('cpp')
> +endif
> +if targetos == 'darwin' and \
> +   add_languages('objc', required: get_option('cocoa'), native: false)
> +  all_languages += ['objc']
> +  objc = meson.get_compiler('objc')
> +endif
>
>  # Temporary directory used for files created while
>  # configure runs. Since it is in the build directory
> @@ -54,8 +66,6 @@ if cpu in ['riscv32', 'riscv64']
>    cpu = 'riscv'
>  endif
>
> -targetos = host_machine.system()
> -
>  target_dirs = config_host['TARGET_DIRS'].split()
>  have_linux_user = false
>  have_bsd_user = false
> @@ -161,7 +171,7 @@ if 'dtrace' in get_option('trace_backends')
>      # semaphores are linked into the main binary and not the module's shared
>      # object.
>      add_global_arguments('-DSTAP_SDT_V2',
> -                         native: false, language: ['c', 'cpp', 'objc'])
> +                         native: false, language: all_languages)
>    endif
>  endif
>
> @@ -203,7 +213,7 @@ endif
>  if get_option('fuzzing')
>    add_project_link_arguments(['-Wl,-T,',
>                                (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
> -                             native: false, language: ['c', 'cpp', 'objc'])
> +                             native: false, language: all_languages)
>
>    # Specify a filter to only instrument code that is directly related to
>    # virtual-devices.
> @@ -216,7 +226,7 @@ if get_option('fuzzing')
>                   args: ['-fsanitize-coverage-allowlist=/dev/null',
>                          '-fsanitize-coverage=trace-pc'] )
>      add_global_arguments('-fsanitize-coverage-allowlist=instrumentation-filter',
> -                         native: false, language: ['c', 'cpp', 'objc'])
> +                         native: false, language: all_languages)
>    endif
>
>    if get_option('fuzzing_engine') == ''
> @@ -225,9 +235,9 @@ if get_option('fuzzing')
>      # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
>      # unable to bind the fuzzer-related callbacks added by instrumentation.
>      add_global_arguments('-fsanitize=fuzzer-no-link',
> -                         native: false, language: ['c', 'cpp', 'objc'])
> +                         native: false, language: all_languages)
>      add_global_link_arguments('-fsanitize=fuzzer-no-link',
> -                              native: false, language: ['c', 'cpp', 'objc'])
> +                              native: false, language: all_languages)
>      # For the actual fuzzer binaries, we need to link against the libfuzzer
>      # library. They need to be configurable, to support OSS-Fuzz
>      fuzz_exe_ldflags = ['-fsanitize=fuzzer']
> @@ -238,15 +248,11 @@ if get_option('fuzzing')
>    endif
>  endif
>
> -add_global_arguments(qemu_cflags, native: false, language: ['c'])
> -add_global_arguments(qemu_objcflags, native: false, language: ['objc'])
> -
>  # Check that the C++ compiler exists and works with the C compiler.
>  link_language = 'c'
>  linker = cc
>  qemu_cxxflags = []
> -if add_languages('cpp', required: false, native: false)
> -  cxx = meson.get_compiler('cpp')
> +if 'cpp' in all_languages
>    add_global_arguments(['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'],
>                         native: false, language: 'cpp')
>    foreach k: qemu_cflags
> @@ -255,7 +261,6 @@ if add_languages('cpp', required: false, native: false)
>        qemu_cxxflags += [k]
>      endif
>    endforeach
> -  add_global_arguments(qemu_cxxflags, native: false, language: 'cpp')
>
>    if cxx.links(files('scripts/main.c'), args: qemu_cflags)
>      link_language = 'cpp'
> @@ -271,22 +276,21 @@ if targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN')
>    qemu_ldflags += linker.get_supported_link_arguments('-Wl,--warn-common')
>  endif
>
> -add_global_link_arguments(qemu_ldflags, native: false, language: ['c', 'cpp', 'objc'])
> +add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
>
> +add_global_arguments(qemu_cflags, native: false, language: 'c')
> +add_global_arguments(qemu_cxxflags, native: false, language: 'cpp')
> +add_global_arguments(qemu_objcflags, native: false, language: 'objc')
>  if targetos == 'linux'
>    add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
>                          '-isystem', 'linux-headers',
> -                        language: ['c', 'cpp'])
> +                        language: all_languages)
>  endif
>
>  add_project_arguments('-iquote', '.',
>                        '-iquote', meson.current_source_dir(),
>                        '-iquote', meson.current_source_dir() / 'include',
> -                      language: ['c', 'cpp', 'objc'])
> -
> -if host_machine.system() == 'darwin'
> -  add_languages('objc', required: false, native: false)
> -endif
> +                      language: all_languages)
>
>  sparse = find_program('cgcc', required: get_option('sparse'))
>  if sparse.found()
> @@ -468,7 +472,7 @@ if get_option('tcg').allowed()
>      tcg_arch = 'ppc'
>    endif
>    add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
> -                        language: ['c', 'cpp', 'objc'])
> +                        language: all_languages)
>
>    accelerators += 'CONFIG_TCG'
>    config_host += { 'CONFIG_TCG': 'y' }
> @@ -494,7 +498,7 @@ endif
>  # The path to glib.h is added to all compilation commands.  This was
>  # grandfathered in from the QEMU Makefiles.
>  add_project_arguments(config_host['GLIB_CFLAGS'].split(),
> -                      native: false, language: ['c', 'cpp', 'objc'])
> +                      native: false, language: all_languages)
>  glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
>                            link_args: config_host['GLIB_LIBS'].split(),
>                            version: config_host['GLIB_VERSION'],
> @@ -1674,8 +1678,8 @@ if get_option('cfi')
>        error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
>      endif
>    endif
> -  add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
> -  add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
> +  add_global_arguments(cfi_flags, native: false, language: all_languages)
> +  add_global_link_arguments(cfi_flags, native: false, language: all_languages)
>  endif
>
>  have_host_block_device = (targetos != 'darwin' or
> @@ -3713,8 +3717,12 @@ if link_args.length() > 0
>    summary_info += {'LDFLAGS':         ' '.join(link_args)}
>  endif
>  summary_info += {'QEMU_CFLAGS':       ' '.join(qemu_cflags)}
> -summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_cxxflags)}
> -summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_objcflags)}
> +if 'cpp' in all_languages
> +  summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_cxxflags)}
> +endif
> +if 'objc' in all_languages
> +  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_objcflags)}
> +endif
>  summary_info += {'QEMU_LDFLAGS':      ' '.join(qemu_ldflags)}
>  summary_info += {'profiler':          get_option('profiler')}
>  summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 17/30] configure: remove pkg-config functions
  2022-12-09 11:23 ` [PATCH 17/30] configure: remove pkg-config functions Paolo Bonzini
@ 2022-12-12  9:05   ` Marc-André Lureau
  2022-12-16 15:07   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12  9:05 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 9, 2022 at 3:39 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> All uses of pkg-config have been moved to Meson.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  configure                   | 19 +++----------------
>  docs/devel/build-system.rst |  4 ----
>  2 files changed, 3 insertions(+), 20 deletions(-)
>
> diff --git a/configure b/configure
> index fb28dd3963bd..9c336203d8d9 100755
> --- a/configure
> +++ b/configure
> @@ -365,11 +365,7 @@ smbd="$SMBD"
>  strip="${STRIP-${cross_prefix}strip}"
>  widl="${WIDL-${cross_prefix}widl}"
>  windres="${WINDRES-${cross_prefix}windres}"
> -pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
> -query_pkg_config() {
> -    "${pkg_config_exe}" ${QEMU_PKG_CONFIG_FLAGS} "$@"
> -}
> -pkg_config=query_pkg_config
> +pkg_config="${PKG_CONFIG-${cross_prefix}pkg-config}"
>  sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
>
>  # default flags for all hosts
> @@ -745,9 +741,7 @@ for opt do
>    ;;
>    --without-default-features) # processed above
>    ;;
> -  --static)
> -    static="yes"
> -    QEMU_PKG_CONFIG_FLAGS="--static $QEMU_PKG_CONFIG_FLAGS"
> +  --static) static="yes"
>    ;;
>    --bindir=*) bindir="$optarg"
>    ;;
> @@ -1419,13 +1413,6 @@ EOF
>    fi
>  fi
>
> -##########################################
> -# pkg-config probe
> -
> -if ! has "$pkg_config_exe"; then
> -  error_exit "pkg-config binary '$pkg_config_exe' not found"
> -fi
> -
>  ##########################################
>  # fdt probe
>
> @@ -2423,7 +2410,7 @@ if test "$skip_meson" = no; then
>    test -n "$objcc" && echo "objc = [$(meson_quote $objcc $CPU_CFLAGS)]" >> $cross
>    echo "ar = [$(meson_quote $ar)]" >> $cross
>    echo "nm = [$(meson_quote $nm)]" >> $cross
> -  echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
> +  echo "pkgconfig = [$(meson_quote $pkg_config)]" >> $cross
>    echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
>    if has $sdl2_config; then
>      echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
> diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst
> index 9db18aff159e..66cfe7b8bdc8 100644
> --- a/docs/devel/build-system.rst
> +++ b/docs/devel/build-system.rst
> @@ -103,10 +103,6 @@ developers in checking for system features:
>     Print $MESSAGE to stderr, followed by $MORE... and then exit from the
>     configure script with non-zero status
>
> -``query_pkg_config $ARGS...``
> -   Run pkg-config passing it $ARGS. If QEMU is doing a static build,
> -   then --static will be automatically added to $ARGS
> -
>
>  Stage 2: Meson
>  ==============
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 18/30] configure, meson: move --enable-modules to Meson
  2022-12-09 11:23 ` [PATCH 18/30] configure, meson: move --enable-modules to Meson Paolo Bonzini
@ 2022-12-12  9:07   ` Marc-André Lureau
  2022-12-16 15:09   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12  9:07 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 9, 2022 at 3:44 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

On Fri, Dec 9, 2022 at 3:39 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> All uses of pkg-config have been moved to Meson.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  configure                     | 21 +--------------------
>  meson.build                   |  7 ++++++-
>  meson_options.txt             |  2 ++
>  scripts/meson-buildoptions.sh |  3 +++
>  4 files changed, 12 insertions(+), 21 deletions(-)
>
> diff --git a/configure b/configure
> index 9c336203d8d9..26d10aeffd82 100755
> --- a/configure
> +++ b/configure
> @@ -273,7 +273,6 @@ sanitizers="no"
>  tsan="no"
>  fortify_source="yes"
>  EXESUF=""
> -modules="no"
>  prefix="/usr/local"
>  qemu_suffix="qemu"
>  softmmu="yes"
> @@ -705,12 +704,6 @@ for opt do
>    ;;
>    --disable-debug-info) meson_option_add -Ddebug=false
>    ;;
> -  --enable-modules)
> -      modules="yes"
> -  ;;
> -  --disable-modules)
> -      modules="no"
> -  ;;
>    --cpu=*)
>    ;;
>    --target-list=*) target_list="$optarg"
> @@ -1001,7 +994,6 @@ cat << EOF
>    linux-user      all linux usermode emulation targets
>    bsd-user        all BSD usermode emulation targets
>    pie             Position Independent Executables
> -  modules         modules support (non-Windows)
>    debug-tcg       TCG debugging (default is disabled)
>    debug-info      debugging information
>    safe-stack      SafeStack Stack Smash Protection. Depends on
> @@ -1260,16 +1252,8 @@ else
>    QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
>  fi
>
> -# Our module code doesn't support Windows
> -if test "$modules" = "yes" && test "$mingw32" = "yes" ; then
> -  error_exit "Modules are not available for Windows"
> -fi
> -
> -# Static linking is not possible with plugins, modules or PIE
> +# Resolve default for --enable-plugins
>  if test "$static" = "yes" ; then
> -  if test "$modules" = "yes" ; then
> -    error_exit "static and modules are mutually incompatible"
> -  fi
>    if test "$plugins" = "yes"; then
>      error_exit "static and plugins are mutually incompatible"
>    else
> @@ -2229,9 +2213,6 @@ if test "$solaris" = "yes" ; then
>  fi
>  echo "SRC_PATH=$source_path" >> $config_host_mak
>  echo "TARGET_DIRS=$target_list" >> $config_host_mak
> -if test "$modules" = "yes"; then
> -  echo "CONFIG_MODULES=y" >> $config_host_mak
> -fi
>
>  # XXX: suppress that
>  if [ "$bsd" = "yes" ] ; then
> diff --git a/meson.build b/meson.build
> index f63ab7f83bed..99c1bde4d154 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -16,7 +16,6 @@ fs = import('fs')
>
>  sh = find_program('sh')
>  config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
> -enable_modules = 'CONFIG_MODULES' in config_host
>  targetos = host_machine.system()
>
>  cc = meson.get_compiler('c')
> @@ -84,6 +83,12 @@ have_ga = get_option('guest_agent') \
>    .require(targetos in ['sunos', 'linux', 'windows', 'freebsd'],
>             error_message: 'unsupported OS for QEMU guest agent') \
>    .allowed()
> +enable_modules = get_option('modules') \
> +  .require(targetos != 'windows',
> +           error_message: 'Modules are not available for Windows') \
> +  .require(not get_option('prefer_static'),
> +           error_message: 'Modules are incompatible with static linking') \
> +  .allowed()
>  have_block = have_system or have_tools
>
>  python = import('python').find_installation()
> diff --git a/meson_options.txt b/meson_options.txt
> index 4b749ca54900..e492aaa73fbc 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -44,6 +44,8 @@ option('fuzzing', type : 'boolean', value: false,
>         description: 'build fuzzing targets')
>  option('gettext', type : 'feature', value : 'auto',
>         description: 'Localization of the GTK+ user interface')
> +option('modules', type : 'feature', value : 'disabled',
> +       description: 'modules support (non Windows)')
>  option('module_upgrades', type : 'boolean', value : false,
>         description: 'try to load modules from alternate paths for upgrades')
>  option('install_blobs', type : 'boolean', value : true,
> diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
> index aa6e30ea911e..f91797741eef 100644
> --- a/scripts/meson-buildoptions.sh
> +++ b/scripts/meson-buildoptions.sh
> @@ -119,6 +119,7 @@ meson_options_help() {
>    printf "%s\n" '  lzo             lzo compression support'
>    printf "%s\n" '  malloc-trim     enable libc malloc_trim() for memory optimization'
>    printf "%s\n" '  membarrier      membarrier system call (for Linux 4.14+ or Windows'
> +  printf "%s\n" '  modules         modules support (non Windows)'
>    printf "%s\n" '  mpath           Multipath persistent reservation passthrough'
>    printf "%s\n" '  multiprocess    Out of process device emulation support'
>    printf "%s\n" '  netmap          netmap network backend support'
> @@ -338,6 +339,8 @@ _meson_option_parse() {
>      --disable-membarrier) printf "%s" -Dmembarrier=disabled ;;
>      --enable-module-upgrades) printf "%s" -Dmodule_upgrades=true ;;
>      --disable-module-upgrades) printf "%s" -Dmodule_upgrades=false ;;
> +    --enable-modules) printf "%s" -Dmodules=enabled ;;
> +    --disable-modules) printf "%s" -Dmodules=disabled ;;
>      --enable-mpath) printf "%s" -Dmpath=enabled ;;
>      --disable-mpath) printf "%s" -Dmpath=disabled ;;
>      --enable-multiprocess) printf "%s" -Dmultiprocess=enabled ;;
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 20/30] meson: prepare move of QEMU_CFLAGS to meson
  2022-12-09 11:23 ` [PATCH 20/30] meson: prepare move of QEMU_CFLAGS to meson Paolo Bonzini
@ 2022-12-12 12:02   ` Marc-André Lureau
  2022-12-16 15:11   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12 12:02 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 9, 2022 at 3:34 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Clean up the handling of compiler flags in meson.build, splitting
> the general flags that should be included in subprojects as well,
> from warning flags that only apply to QEMU itself.  The two were
> mixed in both configure tests and meson tests.
>
> This split makes it easier to move the compiler tests piecewise
> from configure to Meson.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  meson.build | 53 +++++++++++++++++++++++++++++------------------------
>  1 file changed, 29 insertions(+), 24 deletions(-)
>
> diff --git a/meson.build b/meson.build
> index 99c1bde4d154..dac343d14797 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -190,10 +190,23 @@ endif
>  # Compiler flags #
>  ##################
>
> -qemu_cflags = config_host['QEMU_CFLAGS'].split()
> +qemu_common_flags = []
> +qemu_cflags = []
> +foreach arg : config_host['QEMU_CFLAGS'].split()
> +  if arg.startswith('-W')
> +    qemu_cflags += arg
> +  else
> +    qemu_common_flags += arg
> +  endif
> +endforeach
>  qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
>  qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
>
> +if get_option('gprof')
> +  qemu_common_flags += ['-p']
> +  qemu_ldflags += ['-p']
> +endif
> +
>  if get_option('prefer_static')
>    qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
>  endif
> @@ -207,10 +220,9 @@ if targetos == 'windows'
>    qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
>  endif
>
> -if get_option('gprof')
> -  qemu_cflags += ['-p']
> -  qemu_objcflags += ['-p']
> -  qemu_ldflags += ['-p']
> +# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
> +if targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN')
> +  qemu_ldflags += cc.get_supported_link_arguments('-Wl,--warn-common')
>  endif
>
>  # Specify linker-script with add_project_link_arguments so that it is not placed
> @@ -230,8 +242,7 @@ if get_option('fuzzing')
>                    name: '-fsanitize-coverage-allowlist=/dev/null',
>                   args: ['-fsanitize-coverage-allowlist=/dev/null',
>                          '-fsanitize-coverage=trace-pc'] )
> -    add_global_arguments('-fsanitize-coverage-allowlist=instrumentation-filter',
> -                         native: false, language: all_languages)
> +    qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter']
>    endif
>
>    if get_option('fuzzing_engine') == ''
> @@ -239,10 +250,8 @@ if get_option('fuzzing')
>      # compiled code.  To build non-fuzzer binaries with --enable-fuzzing, link
>      # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
>      # unable to bind the fuzzer-related callbacks added by instrumentation.
> -    add_global_arguments('-fsanitize=fuzzer-no-link',
> -                         native: false, language: all_languages)
> -    add_global_link_arguments('-fsanitize=fuzzer-no-link',
> -                              native: false, language: all_languages)
> +    qemu_common_flags += ['-fsanitize=fuzzer-no-link']
> +    qemu_ldflags += ['-fsanitize=fuzzer-no-link']
>      # For the actual fuzzer binaries, we need to link against the libfuzzer
>      # library. They need to be configurable, to support OSS-Fuzz
>      fuzz_exe_ldflags = ['-fsanitize=fuzzer']
> @@ -253,6 +262,9 @@ if get_option('fuzzing')
>    endif
>  endif
>
> +add_global_arguments(qemu_common_flags, native: false, language: all_languages)
> +add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
> +
>  # Check that the C++ compiler exists and works with the C compiler.
>  link_language = 'c'
>  linker = cc
> @@ -276,16 +288,9 @@ if 'cpp' in all_languages
>    endif
>  endif
>
> -# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
> -if targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN')
> -  qemu_ldflags += linker.get_supported_link_arguments('-Wl,--warn-common')
> -endif
> -
> -add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
> -
> -add_global_arguments(qemu_cflags, native: false, language: 'c')
> -add_global_arguments(qemu_cxxflags, native: false, language: 'cpp')
> -add_global_arguments(qemu_objcflags, native: false, language: 'objc')
> +add_project_arguments(qemu_cflags, native: false, language: 'c')
> +add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
> +add_project_arguments(qemu_objcflags, native: false, language: 'objc')
>  if targetos == 'linux'
>    add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
>                          '-isystem', 'linux-headers',
> @@ -3778,12 +3783,12 @@ link_args = get_option(link_language + '_link_args')
>  if link_args.length() > 0
>    summary_info += {'LDFLAGS':         ' '.join(link_args)}
>  endif
> -summary_info += {'QEMU_CFLAGS':       ' '.join(qemu_cflags)}
> +summary_info += {'QEMU_CFLAGS':       ' '.join(qemu_common_flags + qemu_cflags)}
>  if 'cpp' in all_languages
> -  summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_cxxflags)}
> +  summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_common_flags + qemu_cxxflags)}
>  endif
>  if 'objc' in all_languages
> -  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_objcflags)}
> +  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_common_flags + qemu_objcflags)}
>  endif
>  summary_info += {'QEMU_LDFLAGS':      ' '.join(qemu_ldflags)}
>  summary_info += {'profiler':          get_option('profiler')}
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 21/30] build: move sanitizer tests to meson
  2022-12-09 11:24 ` [PATCH 21/30] build: move sanitizer tests " Paolo Bonzini
@ 2022-12-12 12:16   ` Marc-André Lureau
  2022-12-12 17:31     ` Paolo Bonzini
  2022-12-12 20:37     ` Paolo Bonzini
  0 siblings, 2 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12 12:16 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

Hi

On Fri, Dec 9, 2022 at 3:42 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure                      | 151 ---------------------------------
>  docs/devel/build-system.rst    |   4 -
>  meson.build                    |  63 +++++++++++++-
>  meson_options.txt              |   4 +
>  scripts/meson-buildoptions.sh  |   6 ++
>  tests/qemu-iotests/meson.build |   2 +-
>  tests/unit/meson.build         |   2 +-
>  7 files changed, 73 insertions(+), 159 deletions(-)
>
> diff --git a/configure b/configure
> index b0df6c3cf754..babcf5d28a85 100755
> --- a/configure
> +++ b/configure
> @@ -269,9 +269,6 @@ EXTRA_OBJCFLAGS=""
>  EXTRA_LDFLAGS=""
>
>  debug_tcg="no"
> -sanitizers="no"
> -tsan="no"
> -fortify_source="yes"
>  EXESUF=""
>  prefix="/usr/local"
>  qemu_suffix="qemu"
> @@ -392,14 +389,6 @@ EOF
>    compile_object
>  }
>
> -check_include() {
> -cat > $TMPC <<EOF
> -#include <$1>
> -int main(void) { return 0; }
> -EOF
> -  compile_object
> -}
> -
>  write_c_skeleton() {
>      cat > $TMPC <<EOF
>  int main(void) { return 0; }
> @@ -755,15 +744,6 @@ for opt do
>        debug_tcg="yes"
>        meson_option_parse --enable-debug-mutex ""
>        meson_option_add -Doptimization=0
> -      fortify_source="no"
> -  ;;
> -  --enable-sanitizers) sanitizers="yes"
> -  ;;
> -  --disable-sanitizers) sanitizers="no"
> -  ;;
> -  --enable-tsan) tsan="yes"
> -  ;;
> -  --disable-tsan) tsan="no"
>    ;;
>    --disable-tcg) tcg="disabled"
>                   plugins="no"
> @@ -971,8 +951,6 @@ Advanced options (experts only):
>                             desired devices in configs/devices/)
>    --with-devices-ARCH=NAME override default configs/devices
>    --enable-debug           enable common debug build options
> -  --enable-sanitizers      enable default sanitizers
> -  --enable-tsan            enable thread sanitizer
>    --disable-werror         disable compilation abort on warning
>    --disable-stack-protector disable compiler-provided stack protection
>    --cpu=CPU                Build for host CPU [$cpu]
> @@ -1547,91 +1525,6 @@ if ! compile_object "-Werror"; then
>      ccache_cpp2=yes
>  fi
>
> -#################################################
> -# clang does not support glibc + FORTIFY_SOURCE.
> -
> -if test "$fortify_source" != "no"; then
> -  if echo | $cc -dM -E - | grep __clang__ > /dev/null 2>&1 ; then
> -    fortify_source="no";
> -  elif test -n "$cxx" && has $cxx &&
> -       echo | $cxx -dM -E - | grep __clang__ >/dev/null 2>&1 ; then
> -    fortify_source="no";
> -  else
> -    fortify_source="yes"
> -  fi
> -fi
> -
> -##########################################
> -# checks for sanitizers
> -
> -have_asan=no
> -have_ubsan=no
> -have_asan_iface_h=no
> -have_asan_iface_fiber=no
> -
> -if test "$sanitizers" = "yes" ; then
> -  write_c_skeleton
> -  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" ""; then
> -      have_asan=yes
> -  fi
> -
> -  # we could use a simple skeleton for flags checks, but this also
> -  # detect the static linking issue of ubsan, see also:
> -  # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
> -  cat > $TMPC << EOF
> -#include <stdlib.h>
> -int main(void) {
> -    void *tmp = malloc(10);
> -    if (tmp != NULL) {
> -        return *(int *)(tmp + 2);
> -    }
> -    return 1;
> -}
> -EOF
> -  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=undefined" ""; then
> -      have_ubsan=yes
> -  fi
> -
> -  if check_include "sanitizer/asan_interface.h" ; then
> -      have_asan_iface_h=yes
> -  fi
> -
> -  cat > $TMPC << EOF
> -#include <sanitizer/asan_interface.h>
> -int main(void) {
> -  __sanitizer_start_switch_fiber(0, 0, 0);
> -  return 0;
> -}
> -EOF
> -  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=address" "" ; then
> -      have_asan_iface_fiber=yes
> -  fi
> -fi
> -
> -# Thread sanitizer is, for now, much noisier than the other sanitizers;
> -# keep it separate until that is not the case.
> -if test "$tsan" = "yes" && test "$sanitizers" = "yes"; then
> -  error_exit "TSAN is not supported with other sanitiziers."
> -fi
> -have_tsan=no
> -have_tsan_iface_fiber=no
> -if test "$tsan" = "yes" ; then
> -  write_c_skeleton
> -  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
> -      have_tsan=yes
> -  fi
> -  cat > $TMPC << EOF
> -#include <sanitizer/tsan_interface.h>
> -int main(void) {
> -  __tsan_create_fiber(0);
> -  return 0;
> -}
> -EOF
> -  if compile_prog "$CPU_CFLAGS -Werror -fsanitize=thread" "" ; then
> -      have_tsan_iface_fiber=yes
> -  fi
> -fi
> -
>  ##########################################
>  # functions to probe cross compilers
>
> @@ -2057,42 +1950,6 @@ case "$vfio_user_server" in
>      ;;
>  esac
>
> -##########################################
> -# End of CC checks
> -# After here, no more $cc or $ld runs
> -
> -write_c_skeleton
> -
> -if test "$fortify_source" = "yes" ; then
> -  QEMU_CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
> -fi
> -
> -if test "$have_asan" = "yes"; then
> -  QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
> -  QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
> -  if test "$have_asan_iface_h" = "no" ; then
> -      echo "ASAN build enabled, but ASAN header missing." \
> -           "Without code annotation, the report may be inferior."
> -  elif test "$have_asan_iface_fiber" = "no" ; then
> -      echo "ASAN build enabled, but ASAN header is too old." \
> -           "Without code annotation, the report may be inferior."
> -  fi
> -fi
> -if test "$have_tsan" = "yes" ; then
> -  if test "$have_tsan_iface_fiber" = "yes" ; then
> -    QEMU_CFLAGS="-fsanitize=thread $QEMU_CFLAGS"
> -    QEMU_LDFLAGS="-fsanitize=thread $QEMU_LDFLAGS"
> -  else
> -    error_exit "Cannot enable TSAN due to missing fiber annotation interface."
> -  fi
> -elif test "$tsan" = "yes" ; then
> -  error_exit "Cannot enable TSAN due to missing sanitize thread interface."
> -fi
> -if test "$have_ubsan" = "yes"; then
> -  QEMU_CFLAGS="-fsanitize=undefined $QEMU_CFLAGS"
> -  QEMU_LDFLAGS="-fsanitize=undefined $QEMU_LDFLAGS"
> -fi
> -
>  #######################################
>  # cross-compiled firmware targets
>
> @@ -2216,14 +2073,6 @@ fi
>
>  echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
>
> -if test "$have_asan_iface_fiber" = "yes" ; then
> -    echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
> -fi
> -
> -if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
> -    echo "CONFIG_TSAN=y" >> $config_host_mak
> -fi
> -
>  if test "$plugins" = "yes" ; then
>      echo "CONFIG_PLUGIN=y" >> $config_host_mak
>  fi
> diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst
> index 66cfe7b8bdc8..4a733fc0a747 100644
> --- a/docs/devel/build-system.rst
> +++ b/docs/devel/build-system.rst
> @@ -91,10 +91,6 @@ developers in checking for system features:
>  ``check_define $NAME``
>     Determine if the macro $NAME is defined by the system C compiler
>
> -``check_include $NAME``
> -   Determine if the include $NAME file is available to the system C
> -   compiler.  The replacement in Meson is ``cc.has_header()``.
> -
>  ``write_c_skeleton``
>     Write a minimal C program main() function to the temporary file
>     indicated by $TMPC
> diff --git a/meson.build b/meson.build
> index dac343d14797..41a45fa495b2 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -211,6 +211,42 @@ if get_option('prefer_static')
>    qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
>  endif
>
> +if get_option('sanitizers')
> +  if cc.has_argument('-fsanitize=address')
> +    qemu_cflags = ['-fsanitize=address'] + qemu_cflags
> +    qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags

why not the += syntax? same below

> +  endif
> +
> +  # Detect static linking issue with ubsan - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
> +  if cc.links('''
> +    #include <stdlib.h>
> +    int main(void) {
> +      void *tmp = malloc(10);
> +      if (tmp != NULL) {
> +        return *(int *)(tmp + 2);
> +      }
> +      return 1;
> +  }''', args: [qemu_ldflags, '-fsanitize=undefined'])
> +    qemu_cflags = ['-fsanitize=undefined'] + qemu_cflags
> +    qemu_ldflags = ['-fsanitize=undefined'] + qemu_ldflags
> +  endif
> +endif
> +
> +# Thread sanitizer is, for now, much noisier than the other sanitizers;
> +# keep it separate until that is not the case.
> +if get_option('tsan')
> +  if get_option('sanitizers')
> +    error('TSAN is not supported with other sanitizers')
> +  endif
> +  if not cc.has_function('__tsan_create_fiber',
> +                         args: '-fsanitize=thread',
> +                         prefix: '#include <sanitizer/tsan_interface.h>')
> +    error('Cannot enable TSAN due to missing fiber annotation interface')
> +  endif
> +  qemu_cflags = ['-fsanitize=thread'] + qemu_cflags
> +  qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
> +endif
> +
>  # Detect support for PT_GNU_RELRO + DT_BIND_NOW.
>  # The combination is known as "full relro", because .got.plt is read-only too.
>  qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
> @@ -221,7 +257,7 @@ if targetos == 'windows'
>  endif
>
>  # Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
> -if targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN')
> +if targetos != 'sunos' and not get_option('tsan')
>    qemu_ldflags += cc.get_supported_link_arguments('-Wl,--warn-common')
>  endif
>
> @@ -288,6 +324,16 @@ if 'cpp' in all_languages
>    endif
>  endif
>
> +# clang does not support glibc + FORTIFY_SOURCE (is it still true?)

No, it compiles successfully with clang (Fedora 15.0.4-1.fc37) and
glibc-2.36-8.fc37.x86_64 at least.

I guess we need someone to check on macos with glibc 2.35
(https://formulae.brew.sh/formula/glibc#default)

> +if get_option('optimization') != '0' and targetos == 'linux'
> +  if cc.get_id() == 'gcc'
> +    qemu_cflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2']
> +  endif
> +  if 'cpp' in all_languages and cxx.get_id() == 'gcc'
> +    qemu_cxxflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2']
> +  endif
> +endif
> +
>  add_project_arguments(qemu_cflags, native: false, language: 'c')
>  add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
>  add_project_arguments(qemu_objcflags, native: false, language: 'objc')
> @@ -1890,6 +1936,7 @@ if seccomp.found()
>  endif
>  config_host_data.set('CONFIG_SNAPPY', snappy.found())
>  config_host_data.set('CONFIG_TPM', have_tpm)
> +config_host_data.set('CONFIG_TSAN', get_option('tsan'))
>  config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
>  config_host_data.set('CONFIG_VDE', vde.found())
>  config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
> @@ -2018,6 +2065,18 @@ if rdma.found()
>                                         prefix: '#include <infiniband/verbs.h>'))
>  endif
>
> +have_asan_fiber = false
> +if get_option('sanitizers') and \
> +   not cc.has_function('__sanitizer_start_switch_fiber',
> +                         args: '-fsanitize=address',
> +                         prefix: '#include <sanitizer/asan_interface.h>')
> +  warning('Missing ASAN due to missing fiber annotation interface')
> +  warning('Without code annotation, the report may be inferior.')
> +else
> +  have_asan_fiber = true
> +endif
> +config_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
> +
>  # has_header_symbol
>  config_host_data.set('CONFIG_BYTESWAP_H',
>                       cc.has_header_symbol('byteswap.h', 'bswap_32'))
> @@ -3804,7 +3863,7 @@ summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
>  summary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
>  summary_info += {'gprof enabled':     get_option('gprof')}
>  summary_info += {'gcov':              get_option('b_coverage')}
> -summary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
> +summary_info += {'thread sanitizer':  get_option('tsan')}
>  summary_info += {'CFI support':       get_option('cfi')}
>  if get_option('cfi')
>    summary_info += {'CFI debug support': get_option('cfi_debug')}
> diff --git a/meson_options.txt b/meson_options.txt
> index e492aaa73fbc..feeefa2ccbc1 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -84,6 +84,10 @@ option('tcg', type: 'feature', value: 'enabled',
>         description: 'TCG support')
>  option('tcg_interpreter', type: 'boolean', value: false,
>         description: 'TCG with bytecode interpreter (slow)')
> +option('sanitizers', type: 'boolean', value: false,
> +       description: 'enable default sanitizers')
> +option('tsan', type: 'boolean', value: false,
> +       description: 'enable thread sanitizer')
>  option('cfi', type: 'boolean', value: false,
>         description: 'Control-Flow Integrity (CFI)')
>  option('cfi_debug', type: 'boolean', value: false,
> diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
> index cb277347bb18..bafc40ddfbf4 100644
> --- a/scripts/meson-buildoptions.sh
> +++ b/scripts/meson-buildoptions.sh
> @@ -36,11 +36,13 @@ meson_options_help() {
>    printf "%s\n" '  --enable-qom-cast-debug  cast debugging support'
>    printf "%s\n" '  --enable-rng-none        dummy RNG, avoid using /dev/(u)random and'
>    printf "%s\n" '                           getrandom()'
> +  printf "%s\n" '  --enable-sanitizers      enable default sanitizers'
>    printf "%s\n" '  --enable-strip           Strip targets on install'
>    printf "%s\n" '  --enable-tcg-interpreter TCG with bytecode interpreter (slow)'
>    printf "%s\n" '  --enable-trace-backends=CHOICES'
>    printf "%s\n" '                           Set available tracing backends [log] (choices:'
>    printf "%s\n" '                           dtrace/ftrace/log/nop/simple/syslog/ust)'
> +  printf "%s\n" '  --enable-tsan            enable thread sanitizer'
>    printf "%s\n" '  --firmwarepath=VALUES    search PATH for firmware files [share/qemu-firmware]'
>    printf "%s\n" '  --iasl=VALUE             Path to ACPI disassembler'
>    printf "%s\n" '  --includedir=VALUE       Header file directory [include]'
> @@ -388,6 +390,8 @@ _meson_option_parse() {
>      --disable-replication) printf "%s" -Dreplication=disabled ;;
>      --enable-rng-none) printf "%s" -Drng_none=true ;;
>      --disable-rng-none) printf "%s" -Drng_none=false ;;
> +    --enable-sanitizers) printf "%s" -Dsanitizers=true ;;
> +    --disable-sanitizers) printf "%s" -Dsanitizers=false ;;
>      --enable-sdl) printf "%s" -Dsdl=enabled ;;
>      --disable-sdl) printf "%s" -Dsdl=disabled ;;
>      --enable-sdl-image) printf "%s" -Dsdl_image=enabled ;;
> @@ -427,6 +431,8 @@ _meson_option_parse() {
>      --disable-tpm) printf "%s" -Dtpm=disabled ;;
>      --enable-trace-backends=*) quote_sh "-Dtrace_backends=$2" ;;
>      --with-trace-file=*) quote_sh "-Dtrace_file=$2" ;;
> +    --enable-tsan) printf "%s" -Dtsan=true ;;
> +    --disable-tsan) printf "%s" -Dtsan=false ;;
>      --enable-u2f) printf "%s" -Du2f=enabled ;;
>      --disable-u2f) printf "%s" -Du2f=disabled ;;
>      --enable-usb-redir) printf "%s" -Dusb_redir=enabled ;;
> diff --git a/tests/qemu-iotests/meson.build b/tests/qemu-iotests/meson.build
> index 323a4acb6a3f..583468c5b9b3 100644
> --- a/tests/qemu-iotests/meson.build
> +++ b/tests/qemu-iotests/meson.build
> @@ -2,7 +2,7 @@ if not have_tools or targetos == 'windows' or get_option('gprof')
>    subdir_done()
>  endif
>
> -foreach cflag: config_host['QEMU_CFLAGS'].split()
> +foreach cflag: qemu_ldflags
>    if cflag.startswith('-fsanitize') and \
>       not cflag.contains('safe-stack') and not cflag.contains('cfi-icall')
>      message('Sanitizers are enabled ==> Disabled the qemu-iotests.')
> diff --git a/tests/unit/meson.build b/tests/unit/meson.build
> index b497a4137830..46d88b49cbcf 100644
> --- a/tests/unit/meson.build
> +++ b/tests/unit/meson.build
> @@ -143,7 +143,7 @@ if have_system
>    # Some tests: test-char, test-qdev-global-props, and test-qga,
>    # are not runnable under TSan due to a known issue.
>    # https://github.com/google/sanitizers/issues/1116
> -  if 'CONFIG_TSAN' not in config_host
> +  if not get_option('tsan')
>      if 'CONFIG_POSIX' in config_host
>          tests += {
>            'test-char': ['socket-helpers.c', qom, io, chardev]
> --
> 2.38.1
>
>

otherwise, lgtm

-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 23/30] build: move coroutine backend selection to meson
  2022-12-09 11:24 ` [PATCH 23/30] build: move coroutine backend selection " Paolo Bonzini
@ 2022-12-12 12:18   ` Marc-André Lureau
  0 siblings, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12 12:18 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 9, 2022 at 3:37 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> To simplify the code, rename coroutine-win32.c to match the option
> passed to configure.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  configure                                     | 62 -------------------
>  meson.build                                   | 32 +++++++++-
>  meson_options.txt                             |  3 +
>  scripts/meson-buildoptions.py                 |  1 +
>  scripts/meson-buildoptions.sh                 |  3 +
>  ...{coroutine-win32.c => coroutine-windows.c} |  0
>  util/meson.build                              |  2 +-
>  7 files changed, 38 insertions(+), 65 deletions(-)
>  rename util/{coroutine-win32.c => coroutine-windows.c} (100%)
>
> diff --git a/configure b/configure
> index fea9cbf3abd0..1f7c5bbba4b9 100755
> --- a/configure
> +++ b/configure
> @@ -275,7 +275,6 @@ softmmu="yes"
>  linux_user=""
>  bsd_user=""
>  pie=""
> -coroutine=""
>  plugins="$default_feature"
>  meson=""
>  ninja=""
> @@ -792,8 +791,6 @@ for opt do
>    ;;
>    --enable-fdt=*) fdt="$optarg"
>    ;;
> -  --with-coroutine=*) coroutine="$optarg"
> -  ;;
>    --with-git=*) git="$optarg"
>    ;;
>    --with-git-submodules=*)
> @@ -949,8 +946,6 @@ Advanced options (experts only):
>    --disable-werror         disable compilation abort on warning
>    --disable-stack-protector disable compiler-provided stack protection
>    --cpu=CPU                Build for host CPU [$cpu]
> -  --with-coroutine=BACKEND coroutine backend. Supported options:
> -                           ucontext, sigaltstack, windows
>    --enable-plugins
>                             enable plugins via shared library loading
>    --disable-containers     don't use containers for cross-building
> @@ -1373,61 +1368,6 @@ case "$fdt" in
>      ;;
>  esac
>
> -##########################################
> -# check and set a backend for coroutine
> -
> -# We prefer ucontext, but it's not always possible. The fallback
> -# is sigcontext. On Windows the only valid backend is the Windows
> -# specific one.
> -
> -ucontext_works=no
> -if test "$darwin" != "yes"; then
> -  cat > $TMPC << EOF
> -#include <ucontext.h>
> -#ifdef __stub_makecontext
> -#error Ignoring glibc stub makecontext which will always fail
> -#endif
> -int main(void) { makecontext(0, 0, 0); return 0; }
> -EOF
> -  if compile_prog "" "" ; then
> -    ucontext_works=yes
> -  fi
> -fi
> -
> -if test "$coroutine" = ""; then
> -  if test "$mingw32" = "yes"; then
> -    coroutine=win32
> -  elif test "$ucontext_works" = "yes"; then
> -    coroutine=ucontext
> -  else
> -    coroutine=sigaltstack
> -  fi
> -else
> -  case $coroutine in
> -  windows)
> -    if test "$mingw32" != "yes"; then
> -      error_exit "'windows' coroutine backend only valid for Windows"
> -    fi
> -    # Unfortunately the user visible backend name doesn't match the
> -    # coroutine-*.c filename for this case, so we have to adjust it here.
> -    coroutine=win32
> -    ;;
> -  ucontext)
> -    if test "$ucontext_works" != "yes"; then
> -      error_exit "'ucontext' backend requested but makecontext not available"
> -    fi
> -    ;;
> -  sigaltstack)
> -    if test "$mingw32" = "yes"; then
> -      error_exit "only the 'windows' coroutine backend is valid for Windows"
> -    fi
> -    ;;
> -  *)
> -    error_exit "unknown coroutine backend $coroutine"
> -    ;;
> -  esac
> -fi
> -
>  ########################################
>  # check if ccache is interfering with
>  # semantic analysis of macros
> @@ -2002,8 +1942,6 @@ if [ "$bsd" = "yes" ] ; then
>    echo "CONFIG_BSD=y" >> $config_host_mak
>  fi
>
> -echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
> -
>  if test "$plugins" = "yes" ; then
>      echo "CONFIG_PLUGIN=y" >> $config_host_mak
>  fi
> diff --git a/meson.build b/meson.build
> index 7ee9f081d0a1..b9df49667a19 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -211,6 +211,34 @@ if get_option('prefer_static')
>    qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
>  endif
>
> +coroutine_backend = get_option('coroutine_backend')
> +ucontext_probe = '''
> +  #include <ucontext.h>
> +  #ifdef __stub_makecontext
> +  #error Ignoring glibc stub makecontext which will always fail
> +  #endif
> +  int main(void) { makecontext(0, 0, 0); return 0; }'''
> +
> +# On Windows the only valid backend is the Windows specific one.
> +# For POSIX prefer ucontext, but it's not always possible. The fallback
> +# is sigcontext.
> +supported_backends = []
> +if targetos == 'windows'
> +  supported_backends += ['windows']
> +else
> +  if targetos != 'darwin' and cc.links(ucontext_probe)
> +    supported_backends += ['ucontext']
> +  endif
> +  supported_backends += ['sigaltstack']
> +endif
> +
> +if coroutine_backend == 'auto'
> +  coroutine_backend = supported_backends[0]
> +elif coroutine_backend not in supported_backends
> +  error('"@0@" backend requested but not available.  Available backends: @1@' \
> +        .format(coroutine_backend, ', '.join(supported_backends)))
> +endif
> +
>  # Compiles if SafeStack *not* enabled
>  safe_stack_probe = '''
>    int main(void)
> @@ -232,7 +260,7 @@ if get_option('safe_stack') != not cc.compiles(safe_stack_probe)
>    qemu_cflags += safe_stack_arg
>    qemu_ldflags += safe_stack_arg
>  endif
> -if get_option('safe_stack') and config_host['CONFIG_COROUTINE_BACKEND'] != 'ucontext'
> +if get_option('safe_stack') and coroutine_backend != 'ucontext'
>    error('SafeStack is only supported with the ucontext coroutine backend')
>  endif
>
> @@ -3949,7 +3977,7 @@ summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
>
>  # Block layer
>  summary_info = {}
> -summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
> +summary_info += {'coroutine backend': coroutine_backend}
>  summary_info += {'coroutine pool':    have_coroutine_pool}
>  if have_block
>    summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
> diff --git a/meson_options.txt b/meson_options.txt
> index d39d2a060ae7..126f89517e9a 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -33,6 +33,9 @@ option('fuzzing_engine', type : 'string', value : '',
>         description: 'fuzzing engine library for OSS-Fuzz')
>  option('trace_file', type: 'string', value: 'trace',
>         description: 'Trace file prefix for simple backend')
> +option('coroutine_backend', type: 'combo',
> +       choices: ['ucontext', 'sigaltstack', 'windows', 'auto'],
> +       value: 'auto', description: 'coroutine backend to use')
>
>  # Everything else can be set via --enable/--disable-* option
>  # on the configure script command line.  After adding an option
> diff --git a/scripts/meson-buildoptions.py b/scripts/meson-buildoptions.py
> index 8e4e5c4e8bd6..66a79cf37ea8 100755
> --- a/scripts/meson-buildoptions.py
> +++ b/scripts/meson-buildoptions.py
> @@ -35,6 +35,7 @@
>  OPTION_NAMES = {
>      "b_coverage": "gcov",
>      "b_lto": "lto",
> +    "coroutine_backend": "with-coroutine",
>      "debug": "debug-info",
>      "malloc": "enable-malloc",
>      "pkgversion": "with-pkgversion",
> diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
> index 237220d9b308..29695ac88eea 100644
> --- a/scripts/meson-buildoptions.sh
> +++ b/scripts/meson-buildoptions.sh
> @@ -59,6 +59,8 @@ meson_options_help() {
>    printf "%s\n" '  --sysconfdir=VALUE       Sysconf data directory [etc]'
>    printf "%s\n" '  --tls-priority=VALUE     Default TLS protocol/cipher priority string'
>    printf "%s\n" '                           [NORMAL]'
> +  printf "%s\n" '  --with-coroutine=CHOICE  coroutine backend to use (choices:'
> +  printf "%s\n" '                           auto/sigaltstack/ucontext/windows)'
>    printf "%s\n" '  --with-pkgversion=VALUE  use specified string as sub-version of the'
>    printf "%s\n" '                           package'
>    printf "%s\n" '  --with-trace-file=VALUE  Trace file prefix for simple backend [trace]'
> @@ -236,6 +238,7 @@ _meson_option_parse() {
>      --disable-cocoa) printf "%s" -Dcocoa=disabled ;;
>      --enable-coreaudio) printf "%s" -Dcoreaudio=enabled ;;
>      --disable-coreaudio) printf "%s" -Dcoreaudio=disabled ;;
> +    --with-coroutine=*) quote_sh "-Dcoroutine_backend=$2" ;;
>      --enable-coroutine-pool) printf "%s" -Dcoroutine_pool=true ;;
>      --disable-coroutine-pool) printf "%s" -Dcoroutine_pool=false ;;
>      --enable-crypto-afalg) printf "%s" -Dcrypto_afalg=enabled ;;
> diff --git a/util/coroutine-win32.c b/util/coroutine-windows.c
> similarity index 100%
> rename from util/coroutine-win32.c
> rename to util/coroutine-windows.c
> diff --git a/util/meson.build b/util/meson.build
> index 25b9b61f9817..b2a0aea21beb 100644
> --- a/util/meson.build
> +++ b/util/meson.build
> @@ -74,7 +74,7 @@ if have_block or have_ga
>    util_ss.add(files('lockcnt.c'))
>    util_ss.add(files('main-loop.c'))
>    util_ss.add(files('qemu-coroutine.c', 'qemu-coroutine-lock.c', 'qemu-coroutine-io.c'))
> -  util_ss.add(files('coroutine-@0@.c'.format(config_host['CONFIG_COROUTINE_BACKEND'])))
> +  util_ss.add(files(f'coroutine-@coroutine_backend@.c'))
>    util_ss.add(files('thread-pool.c', 'qemu-timer.c'))
>    util_ss.add(files('qemu-sockets.c'))
>  endif
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 24/30] build: move stack protector flag selection to meson
  2022-12-09 11:24 ` [PATCH 24/30] build: move stack protector flag " Paolo Bonzini
@ 2022-12-12 12:22   ` Marc-André Lureau
  0 siblings, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12 12:22 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

Hi

On Fri, Dec 9, 2022 at 3:42 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  configure                     | 44 ++---------------------------------
>  meson.build                   | 28 +++++++++++++++++++++-
>  meson_options.txt             |  2 ++
>  scripts/meson-buildoptions.sh |  3 +++
>  4 files changed, 34 insertions(+), 43 deletions(-)
>
> diff --git a/configure b/configure
> index 1f7c5bbba4b9..5d31294f316f 100755
> --- a/configure
> +++ b/configure
> @@ -175,7 +175,7 @@ compile_prog() {
>    local_cflags="$1"
>    local_ldflags="$2"
>    do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
> -      $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $QEMU_LDFLAGS $local_ldflags
> +      $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $local_ldflags
>  }
>
>  # symbolically link $1 to $2.  Portable version of "ln -sf".
> @@ -221,7 +221,6 @@ static="no"
>  cross_compile="no"
>  cross_prefix=""
>  host_cc="cc"
> -stack_protector=""
>  use_containers="yes"
>  gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
>
> @@ -370,8 +369,6 @@ sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
>  QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv"
>  QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
>
> -QEMU_LDFLAGS=
> -
>  # Flags that are needed during configure but later taken care of by Meson
>  CONFIGURE_CFLAGS="-std=gnu11 -Wall"
>  CONFIGURE_LDFLAGS=
> @@ -773,10 +770,6 @@ for opt do
>    ;;
>    --disable-werror) werror="no"
>    ;;
> -  --enable-stack-protector) stack_protector="yes"
> -  ;;
> -  --disable-stack-protector) stack_protector="no"
> -  ;;
>    --enable-cfi)
>        cfi="true";
>        meson_option_add -Db_lto=true
> @@ -944,7 +937,6 @@ Advanced options (experts only):
>    --with-devices-ARCH=NAME override default configs/devices
>    --enable-debug           enable common debug build options
>    --disable-werror         disable compilation abort on warning
> -  --disable-stack-protector disable compiler-provided stack protection
>    --cpu=CPU                Build for host CPU [$cpu]
>    --enable-plugins
>                             enable plugins via shared library loading
> @@ -1157,7 +1149,7 @@ EOF
>      optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
>      do_objc -Werror $optflag \
>        $OBJCFLAGS $EXTRA_OBJCFLAGS $CONFIGURE_OBJCFLAGS $QEMU_OBJCFLAGS \
> -      -o $TMPE $TMPM $QEMU_LDFLAGS
> +      -o $TMPE $TMPM
>  }
>
>  for flag in $gcc_flags; do
> @@ -1169,37 +1161,6 @@ for flag in $gcc_flags; do
>      fi
>  done
>
> -if test "$stack_protector" != "no"; then
> -  cat > $TMPC << EOF
> -int main(int argc, char *argv[])
> -{
> -    char arr[64], *p = arr, *c = argv[argc - 1];
> -    while (*c) {
> -        *p++ = *c++;
> -    }
> -    return 0;
> -}
> -EOF
> -  gcc_flags="-fstack-protector-strong -fstack-protector-all"
> -  sp_on=0
> -  for flag in $gcc_flags; do
> -    # We need to check both a compile and a link, since some compiler
> -    # setups fail only on a .c->.o compile and some only at link time
> -    if compile_object "-Werror $flag" &&
> -       compile_prog "-Werror $flag" ""; then
> -      QEMU_CFLAGS="$QEMU_CFLAGS $flag"
> -      QEMU_LDFLAGS="$QEMU_LDFLAGS $flag"
> -      sp_on=1
> -      break
> -    fi
> -  done
> -  if test "$stack_protector" = yes; then
> -    if test $sp_on = 0; then
> -      error_exit "Stack protector not supported"
> -    fi
> -  fi
> -fi
> -
>  # Disable -Wmissing-braces on older compilers that warn even for
>  # the "universal" C zero initializer {0}.
>  cat > $TMPC << EOF
> @@ -1968,7 +1929,6 @@ echo "PKG_CONFIG=${pkg_config_exe}" >> $config_host_mak
>  echo "CC=$cc" >> $config_host_mak
>  echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
>  echo "QEMU_OBJCFLAGS=$QEMU_OBJCFLAGS" >> $config_host_mak
> -echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
>  echo "EXESUF=$EXESUF" >> $config_host_mak
>
>  # use included Linux headers
> diff --git a/meson.build b/meson.build
> index b9df49667a19..c5a8dce9e1d6 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -200,7 +200,7 @@ foreach arg : config_host['QEMU_CFLAGS'].split()
>    endif
>  endforeach
>  qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
> -qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
> +qemu_ldflags = []
>
>  if get_option('gprof')
>    qemu_common_flags += ['-p']
> @@ -211,6 +211,32 @@ if get_option('prefer_static')
>    qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
>  endif
>
> +if not get_option('stack_protector').disabled()
> +  stack_protector_probe = '''
> +    int main(int argc, char *argv[])
> +    {
> +      char arr[64], *p = arr, *c = argv[argc - 1];
> +      while (*c) {
> +          *p++ = *c++;
> +      }
> +      return 0;
> +    }'''
> +  have_stack_protector = false
> +  foreach arg : ['-fstack-protector-strong', '-fstack-protector-all']
> +    # We need to check both a compile and a link, since some compiler
> +    # setups fail only on a .c->.o compile and some only at link time
> +    if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \
> +       cc.links(stack_protector_probe, args: ['-Werror', arg])
> +      have_stack_protector = true
> +      qemu_cflags += arg
> +      qemu_ldflags += arg
> +      break
> +    endif
> +  endforeach
> +  get_option('stack_protector') \
> +    .require(have_stack_protector, error_message: 'Stack protector not supported')
> +endif
> +
>  coroutine_backend = get_option('coroutine_backend')
>  ucontext_probe = '''
>    #include <ucontext.h>
> diff --git a/meson_options.txt b/meson_options.txt
> index 126f89517e9a..98456b7cf2ea 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -93,6 +93,8 @@ option('sanitizers', type: 'boolean', value: false,
>         description: 'enable default sanitizers')
>  option('tsan', type: 'boolean', value: false,
>         description: 'enable thread sanitizer')
> +option('stack_protector', type: 'feature', value: 'auto',
> +       description: 'compiler-provided stack protection')
>  option('cfi', type: 'boolean', value: false,
>         description: 'Control-Flow Integrity (CFI)')
>  option('cfi_debug', type: 'boolean', value: false,
> diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
> index 29695ac88eea..a87b3702e955 100644
> --- a/scripts/meson-buildoptions.sh
> +++ b/scripts/meson-buildoptions.sh
> @@ -157,6 +157,7 @@ meson_options_help() {
>    printf "%s\n" '  sparse          sparse checker'
>    printf "%s\n" '  spice           Spice server support'
>    printf "%s\n" '  spice-protocol  Spice protocol support'
> +  printf "%s\n" '  stack-protector compiler-provided stack protection'
>    printf "%s\n" '  tcg             TCG support'
>    printf "%s\n" '  tools           build support utilities that come with QEMU'
>    printf "%s\n" '  tpm             TPM support'
> @@ -424,6 +425,8 @@ _meson_option_parse() {
>      --disable-spice) printf "%s" -Dspice=disabled ;;
>      --enable-spice-protocol) printf "%s" -Dspice_protocol=enabled ;;
>      --disable-spice-protocol) printf "%s" -Dspice_protocol=disabled ;;
> +    --enable-stack-protector) printf "%s" -Dstack_protector=enabled ;;
> +    --disable-stack-protector) printf "%s" -Dstack_protector=disabled ;;
>      --enable-strip) printf "%s" -Dstrip=true ;;
>      --disable-strip) printf "%s" -Dstrip=false ;;
>      --sysconfdir=*) quote_sh "-Dsysconfdir=$2" ;;
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 25/30] build: move warning flag selection to meson
  2022-12-09 11:24 ` [PATCH 25/30] build: move warning " Paolo Bonzini
@ 2022-12-12 12:58   ` Marc-André Lureau
  0 siblings, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12 12:58 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

Hi

On Fri, Dec 9, 2022 at 3:48 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Meson already knows to test with the positive form of the flag, which
> simplifies the test.  Warnings are now tested explicitly for the C++
> compiler, instead of hardcoding those that are only available for
> the C language.
>
> At this point all compiler flags in QEMU_CFLAGS are global and only
> depend on the OS.  No feature tests are performed in configure.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  configure                | 94 ----------------------------------------
>  contrib/plugins/Makefile |  3 +-
>  meson.build              | 72 ++++++++++++++++++++----------
>  3 files changed, 51 insertions(+), 118 deletions(-)
>
> diff --git a/configure b/configure
> index 5d31294f316f..6df61f4337e4 100755
> --- a/configure
> +++ b/configure
> @@ -75,7 +75,6 @@ fi
>  TMPB="qemu-conf"
>  TMPC="${TMPDIR1}/${TMPB}.c"
>  TMPO="${TMPDIR1}/${TMPB}.o"
> -TMPM="${TMPDIR1}/${TMPB}.m"
>  TMPE="${TMPDIR1}/${TMPB}.exe"
>
>  rm -f config.log
> @@ -157,15 +156,6 @@ do_cc() {
>      do_compiler_werror "$cc" $CPU_CFLAGS "$@"
>  }
>
> -do_objc() {
> -    do_compiler_werror "$objcc" $CPU_CFLAGS "$@"
> -}
> -
> -# Append $2 to the variable named $1, with space separation
> -add_to() {
> -    eval $1=\${$1:+\"\$$1 \"}\$2
> -}
> -
>  compile_object() {
>    local_cflags="$1"
>    do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
> @@ -1091,89 +1081,6 @@ if ! compile_prog "" "" ; then
>      error_exit "You need at least GCC v7.4 or Clang v6.0 (or XCode Clang v10.0)"
>  fi
>
> -# Accumulate -Wfoo and -Wno-bar separately.
> -# We will list all of the enable flags first, and the disable flags second.
> -# Note that we do not add -Werror, because that would enable it for all
> -# configure tests. If a configure test failed due to -Werror this would
> -# just silently disable some features, so it's too error prone.
> -
> -warn_flags=
> -add_to warn_flags -Wundef
> -add_to warn_flags -Wwrite-strings
> -add_to warn_flags -Wmissing-prototypes
> -add_to warn_flags -Wstrict-prototypes
> -add_to warn_flags -Wredundant-decls
> -add_to warn_flags -Wold-style-declaration
> -add_to warn_flags -Wold-style-definition
> -add_to warn_flags -Wtype-limits
> -add_to warn_flags -Wformat-security
> -add_to warn_flags -Wformat-y2k
> -add_to warn_flags -Winit-self
> -add_to warn_flags -Wignored-qualifiers
> -add_to warn_flags -Wempty-body
> -add_to warn_flags -Wnested-externs
> -add_to warn_flags -Wendif-labels
> -add_to warn_flags -Wexpansion-to-defined
> -add_to warn_flags -Wimplicit-fallthrough=2
> -
> -nowarn_flags=
> -add_to nowarn_flags -Wno-initializer-overrides
> -add_to nowarn_flags -Wno-missing-include-dirs
> -add_to nowarn_flags -Wno-shift-negative-value
> -add_to nowarn_flags -Wno-string-plus-int
> -add_to nowarn_flags -Wno-typedef-redefinition
> -add_to nowarn_flags -Wno-tautological-type-limit-compare
> -add_to nowarn_flags -Wno-psabi
> -add_to nowarn_flags -Wno-gnu-variable-sized-type-not-at-end
> -
> -gcc_flags="$warn_flags $nowarn_flags"
> -
> -cc_has_warning_flag() {
> -    write_c_skeleton;
> -
> -    # Use the positive sense of the flag when testing for -Wno-wombat
> -    # support (gcc will happily accept the -Wno- form of unknown
> -    # warning options).
> -    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
> -    compile_prog "-Werror $optflag" ""
> -}
> -
> -objcc_has_warning_flag() {
> -    cat > $TMPM <<EOF
> -int main(void) { return 0; }
> -EOF
> -
> -    # Use the positive sense of the flag when testing for -Wno-wombat
> -    # support (gcc will happily accept the -Wno- form of unknown
> -    # warning options).
> -    optflag="$(echo $1 | sed -e 's/^-Wno-/-W/')"
> -    do_objc -Werror $optflag \
> -      $OBJCFLAGS $EXTRA_OBJCFLAGS $CONFIGURE_OBJCFLAGS $QEMU_OBJCFLAGS \
> -      -o $TMPE $TMPM
> -}
> -
> -for flag in $gcc_flags; do
> -    if cc_has_warning_flag $flag ; then
> -        QEMU_CFLAGS="$QEMU_CFLAGS $flag"
> -    fi
> -    if objcc_has_warning_flag $flag ; then
> -        QEMU_OBJCFLAGS="$QEMU_OBJCFLAGS $flag"
> -    fi
> -done
> -
> -# Disable -Wmissing-braces on older compilers that warn even for
> -# the "universal" C zero initializer {0}.
> -cat > $TMPC << EOF
> -struct {
> -  int a[2];
> -} x = {0};
> -EOF
> -if compile_object "-Werror" "" ; then
> -  :
> -else
> -  QEMU_CFLAGS="$QEMU_CFLAGS -Wno-missing-braces"
> -fi
> -
>  # Resolve default for --enable-plugins
>  if test "$static" = "yes" ; then
>    if test "$plugins" = "yes"; then
> @@ -1928,7 +1835,6 @@ echo "NINJA=$ninja" >> $config_host_mak
>  echo "PKG_CONFIG=${pkg_config_exe}" >> $config_host_mak
>  echo "CC=$cc" >> $config_host_mak
>  echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
> -echo "QEMU_OBJCFLAGS=$QEMU_OBJCFLAGS" >> $config_host_mak
>  echo "EXESUF=$EXESUF" >> $config_host_mak
>
>  # use included Linux headers
> diff --git a/contrib/plugins/Makefile b/contrib/plugins/Makefile
> index 8a316cd76f2f..b2b9db9f51af 100644
> --- a/contrib/plugins/Makefile
> +++ b/contrib/plugins/Makefile
> @@ -27,8 +27,7 @@ SONAMES := $(addsuffix .so,$(addprefix lib,$(NAMES)))
>  # The main QEMU uses Glib extensively so it's perfectly fine to use it
>  # in plugins (which many example do).
>  CFLAGS := $(shell $(PKG_CONFIG) --cflags glib-2.0)
> -CFLAGS += -fPIC -Wall $(filter -W%, $(QEMU_CFLAGS))
> -CFLAGS += $(if $(findstring no-psabi,$(QEMU_CFLAGS)),-Wpsabi)
> +CFLAGS += -fPIC -Wall
>  CFLAGS += $(if $(CONFIG_DEBUG_TCG), -ggdb -O0)
>  CFLAGS += -I$(SRC_PATH)/include/qemu
>
> diff --git a/meson.build b/meson.build
> index c5a8dce9e1d6..4ec8104b73a3 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -190,16 +190,8 @@ endif
>  # Compiler flags #
>  ##################
>
> -qemu_common_flags = []
> +qemu_common_flags = config_host['QEMU_CFLAGS'].split()
>  qemu_cflags = []
> -foreach arg : config_host['QEMU_CFLAGS'].split()
> -  if arg.startswith('-W')
> -    qemu_cflags += arg
> -  else
> -    qemu_common_flags += arg
> -  endif
> -endforeach
> -qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
>  qemu_ldflags = []
>
>  if get_option('gprof')
> @@ -380,20 +372,49 @@ endif
>  add_global_arguments(qemu_common_flags, native: false, language: all_languages)
>  add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
>
> +# Collect warnings that we want to enable
> +
> +warn_flags = [
> +  '-Wundef',
> +  '-Wwrite-strings',
> +  '-Wmissing-prototypes',
> +  '-Wstrict-prototypes',
> +  '-Wredundant-decls',
> +  '-Wold-style-declaration',
> +  '-Wold-style-definition',
> +  '-Wtype-limits',
> +  '-Wformat-security',
> +  '-Wformat-y2k',
> +  '-Winit-self',
> +  '-Wignored-qualifiers',
> +  '-Wempty-body',
> +  '-Wnested-externs',
> +  '-Wendif-labels',
> +  '-Wexpansion-to-defined',
> +  '-Wimplicit-fallthrough=2',
> +  '-Wno-initializer-overrides',
> +  '-Wno-missing-include-dirs',
> +  '-Wno-shift-negative-value',
> +  '-Wno-string-plus-int',
> +  '-Wno-typedef-redefinition',
> +  '-Wno-tautological-type-limit-compare',
> +  '-Wno-psabi',
> +  '-Wno-gnu-variable-sized-type-not-at-end',
> +]
> +
> +if not cc.compiles('''
> +  struct {
> +    int a[2];
> +  } x = {0};''', args: ['-Werror'])
> +  warn_flags += ['-Wno-missing-braces']
> +endif
> +
>  # Check that the C++ compiler exists and works with the C compiler.
>  link_language = 'c'
>  linker = cc
>  qemu_cxxflags = []
>  if 'cpp' in all_languages
> -  add_global_arguments(['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'],
> -                       native: false, language: 'cpp')
> -  foreach k: qemu_cflags
> -    if k not in ['-Wstrict-prototypes', '-Wmissing-prototypes', '-Wnested-externs',
> -                 '-Wold-style-declaration', '-Wold-style-definition', '-Wredundant-decls']
> -      qemu_cxxflags += [k]
> -    endif
> -  endforeach
> -
> +  qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags
>    if cxx.links(files('scripts/main.c'), args: qemu_cflags)
>      link_language = 'cpp'
>      linker = cxx
> @@ -413,9 +434,16 @@ if get_option('optimization') != '0' and targetos == 'linux'
>    endif
>  endif
>
> -add_project_arguments(qemu_cflags, native: false, language: 'c')
> -add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
> -add_project_arguments(qemu_objcflags, native: false, language: 'objc')
> +add_project_arguments(qemu_cflags, native: false, language: 'objc')
> +add_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c')
> +if 'cpp' in all_languages
> +  add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
> +  add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp')
> +endif
> +if 'objc' in all_languages
> +  # Note sanitizer flags are not applied to Objective-C sources!
> +  add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc')
> +endif
>  if targetos == 'linux'
>    add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
>                          '-isystem', 'linux-headers',
> @@ -3927,7 +3955,7 @@ if 'cpp' in all_languages
>    summary_info += {'QEMU_CXXFLAGS':     ' '.join(qemu_common_flags + qemu_cxxflags)}
>  endif
>  if 'objc' in all_languages
> -  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_common_flags + qemu_objcflags)}
> +  summary_info += {'QEMU_OBJCFLAGS':    ' '.join(qemu_common_flags)}
>  endif
>  summary_info += {'QEMU_LDFLAGS':      ' '.join(qemu_ldflags)}
>  summary_info += {'profiler':          get_option('profiler')}
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 26/30] build: move remaining compiler flag tests to meson
  2022-12-09 11:24 ` [PATCH 26/30] build: move remaining compiler flag tests " Paolo Bonzini
@ 2022-12-12 13:54   ` Marc-André Lureau
  0 siblings, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12 13:54 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

Hi

On Fri, Dec 9, 2022 at 3:38 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Remove the only remaining uses of QEMU_CFLAGS.  Now that no
> feature tests are done in configure, it is possible to remove
> CONFIGURE_CFLAGS and CONFIGURE_LDFLAGS as well.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  configure   | 79 ++++++++---------------------------------------------
>  meson.build | 49 ++++++++++++++++++++++++++++++++-
>  2 files changed, 59 insertions(+), 69 deletions(-)
>
> diff --git a/configure b/configure
> index 6df61f4337e4..d5491fc3b986 100755
> --- a/configure
> +++ b/configure
> @@ -158,14 +158,14 @@ do_cc() {
>
>  compile_object() {
>    local_cflags="$1"
> -  do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -c -o $TMPO $TMPC
> +  do_cc $CFLAGS $EXTRA_CFLAGS $local_cflags -c -o $TMPO $TMPC
>  }
>
>  compile_prog() {
>    local_cflags="$1"
>    local_ldflags="$2"
> -  do_cc $CFLAGS $EXTRA_CFLAGS $CONFIGURE_CFLAGS $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC \
> -      $LDFLAGS $EXTRA_LDFLAGS $CONFIGURE_LDFLAGS $local_ldflags
> +  do_cc $CFLAGS $EXTRA_CFLAGS $local_cflags -o $TMPE $TMPC \
> +      $LDFLAGS $EXTRA_LDFLAGS $local_ldflags
>  }
>
>  # symbolically link $1 to $2.  Portable version of "ln -sf".
> @@ -351,19 +351,6 @@ windres="${WINDRES-${cross_prefix}windres}"
>  pkg_config="${PKG_CONFIG-${cross_prefix}pkg-config}"
>  sdl2_config="${SDL2_CONFIG-${cross_prefix}sdl2-config}"
>
> -# default flags for all hosts
> -# We use -fwrapv to tell the compiler that we require a C dialect where
> -# left shift of signed integers is well defined and has the expected
> -# 2s-complement style results. (Both clang and gcc agree that it
> -# provides these semantics.)
> -QEMU_CFLAGS="-fno-strict-aliasing -fno-common -fwrapv"
> -QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
> -
> -# Flags that are needed during configure but later taken care of by Meson
> -CONFIGURE_CFLAGS="-std=gnu11 -Wall"
> -CONFIGURE_LDFLAGS=
> -
> -
>  check_define() {
>  cat > $TMPC <<EOF
>  #if !defined($1)
> @@ -442,21 +429,13 @@ openbsd)
>  darwin)
>    bsd="yes"
>    darwin="yes"
> -  # Disable attempts to use ObjectiveC features in os/object.h since they
> -  # won't work when we're compiling with gcc as a C compiler.
> -  QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
>  ;;
>  sunos)
>    solaris="yes"
>    make="${MAKE-gmake}"
> -# needed for CMSG_ macros in sys/socket.h
> -  QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
> -# needed for TIOCWIN* defines in termios.h
> -  QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
>  ;;
>  haiku)
>    pie="no"
> -  QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -D_BSD_SOURCE -fPIC $QEMU_CFLAGS"
>  ;;
>  linux)
>    linux="yes"
> @@ -589,8 +568,6 @@ fi
>
>  if test "$mingw32" = "yes" ; then
>    EXESUF=".exe"
> -  # MinGW needs -mthreads for TLS and macro _MT.
> -  CONFIGURE_CFLAGS="-mthreads $CONFIGURE_CFLAGS"
>    prefix="/qemu"
>    bindir=""
>    qemu_suffix=""
> @@ -1102,59 +1079,26 @@ static THREAD int tls_var;
>  int main(void) { return tls_var; }
>  EOF
>
> -# Meson currently only handles pie as a boolean for now so if we have
> -# explicitly disabled PIE we need to extend our cflags because it wont.
>  if test "$static" = "yes"; then
>    if test "$pie" != "no" && compile_prog "-Werror -fPIE -DPIE" "-static-pie"; then
> -    CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
>      pie="yes"
>    elif test "$pie" = "yes"; then
>      error_exit "-static-pie not available due to missing toolchain support"
>    else
>      pie="no"
> -    QEMU_CFLAGS="-fno-pie -no-pie $QEMU_CFLAGS"
>    fi
> -elif test "$pie" = "no"; then
> -  if compile_prog "-Werror -fno-pie" "-no-pie"; then
> -    CONFIGURE_CFLAGS="-fno-pie $CONFIGURE_CFLAGS"
> -    CONFIGURE_LDFLAGS="-no-pie $CONFIGURE_LDFLAGS"
> -    QEMU_CFLAGS="-fno-pie -no-pie $QEMU_CFLAGS"
> +elif test "$pie" != "no"; then
> +  if compile_prog "-Werror -fPIE -DPIE" "-pie"; then
> +    pie="yes"
> +  elif test "$pie" = "yes"; then
> +    error_exit "PIE not available due to missing toolchain support"
> +  else
> +    echo "Disabling PIE due to missing toolchain support"
> +    pie="no"
>    fi
> -elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
> -  CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
> -  CONFIGURE_LDFLAGS="-pie $CONFIGURE_LDFLAGS"
> -  pie="yes"
> -elif test "$pie" = "yes"; then
> -  error_exit "PIE not available due to missing toolchain support"
> -else
> -  echo "Disabling PIE due to missing toolchain support"
> -  pie="no"
>  fi
>
>  ##########################################
> -# __sync_fetch_and_and requires at least -march=i486. Many toolchains
> -# use i686 as default anyway, but for those that don't, an explicit
> -# specification is necessary
> -
> -if test "$cpu" = "i386"; then
> -  cat > $TMPC << EOF
> -static int sfaa(int *ptr)
> -{
> -  return __sync_fetch_and_and(ptr, 0);
> -}
> -
> -int main(void)
> -{
> -  int val = 42;
> -  val = __sync_val_compare_and_swap(&val, 0, 1);
> -  sfaa(&val);
> -  return val;
> -}
> -EOF
> -  if ! compile_prog "" "" ; then
> -    QEMU_CFLAGS="-march=i486 $QEMU_CFLAGS"
> -  fi
> -fi
>
>  if test -z "${target_list+xxx}" ; then
>      default_targets=yes
> @@ -1834,7 +1778,6 @@ echo "MESON=$meson" >> $config_host_mak
>  echo "NINJA=$ninja" >> $config_host_mak
>  echo "PKG_CONFIG=${pkg_config_exe}" >> $config_host_mak
>  echo "CC=$cc" >> $config_host_mak
> -echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
>  echo "EXESUF=$EXESUF" >> $config_host_mak
>
>  # use included Linux headers
> diff --git a/meson.build b/meson.build
> index 4ec8104b73a3..01c6ac0045bc 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -190,10 +190,50 @@ endif
>  # Compiler flags #
>  ##################
>
> -qemu_common_flags = config_host['QEMU_CFLAGS'].split()
> +# default flags for all hosts
> +# We use -fwrapv to tell the compiler that we require a C dialect where
> +# left shift of signed integers is well defined and has the expected
> +# 2s-complement style results. (Both clang and gcc agree that it
> +# provides these semantics.)
> +
> +qemu_common_flags = [
> +  '-D_GNU_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE',
> +  '-fno-strict-aliasing', '-fno-common', '-fwrapv' ]
>  qemu_cflags = []
>  qemu_ldflags = []
>
> +if targetos == 'darwin'
> +  # Disable attempts to use ObjectiveC features in os/object.h since they
> +  # won't work when we're compiling with gcc as a C compiler.
> +  qemu_common_flags += '-DOS_OBJECT_USE_OBJC=0'
> +elif targetos == 'solaris'
> +  # needed for CMSG_ macros in sys/socket.h
> +  qemu_common_flags += '-D_XOPEN_SOURCE=600'
> +  # needed for TIOCWIN* defines in termios.h
> +  qemu_common_flags += '-D__EXTENSIONS__'
> +elif targetos == 'haiku'
> +  qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC']
> +endif
> +
> +# __sync_fetch_and_and requires at least -march=i486. Many toolchains
> +# use i686 as default anyway, but for those that don't, an explicit
> +# specification is necessary
> +if host_arch == 'i386' and not cc.links('''
> +  static int sfaa(int *ptr)
> +  {
> +    return __sync_fetch_and_and(ptr, 0);
> +  }
> +
> +  int main(void)
> +  {
> +    int val = 42;
> +    val = __sync_val_compare_and_swap(&val, 0, 1);
> +    sfaa(&val);
> +    return val;
> +  }''')
> +  qemu_common_flags = ['-march=i486'] + qemu_common_flags
> +endif
> +
>  if get_option('gprof')
>    qemu_common_flags += ['-p']
>    qemu_ldflags += ['-p']
> @@ -203,6 +243,13 @@ if get_option('prefer_static')
>    qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
>  endif
>
> +# Meson currently only handles pie as a boolean for now, so if the user
> +# has explicitly disabled PIE we need to extend our cflags.
> +if not get_option('b_pie')
> +  qemu_cflags += cc.get_supported_arguments('-fno-pie')
> +  qemu_ldflags += cc.get_supported_link_arguments('-no-pie')
> +endif
> +
>  if not get_option('stack_protector').disabled()
>    stack_protector_probe = '''
>      int main(int argc, char *argv[])
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 29/30] configure: do not rerun the tests with -Werror
  2022-12-09 11:24 ` [PATCH 29/30] configure: do not rerun the tests with -Werror Paolo Bonzini
@ 2022-12-12 14:00   ` Marc-André Lureau
  0 siblings, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12 14:00 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

Hi

On Fri, Dec 9, 2022 at 3:44 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Tests run in configure are pretty trivial at this point, so
> do not bother with the extra complication of running tests
> both with and without -Werror.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>

> ---
>  configure | 35 +----------------------------------
>  1 file changed, 1 insertion(+), 34 deletions(-)
>
> diff --git a/configure b/configure
> index a7c95535fd01..745745ded35b 100755
> --- a/configure
> +++ b/configure
> @@ -119,41 +119,8 @@ lines: ${BASH_LINENO[*]}"
>    $compiler "$@" >> config.log 2>&1 || return $?
>  }
>
> -do_compiler_werror() {
> -    # Run the compiler, capturing its output to the log. First argument
> -    # is compiler binary to execute.
> -    compiler="$1"
> -    shift
> -    if test -n "$BASH_VERSION"; then eval '
> -        echo >>config.log "
> -funcs: ${FUNCNAME[*]}
> -lines: ${BASH_LINENO[*]}"
> -    '; fi
> -    echo $compiler "$@" >> config.log
> -    $compiler "$@" >> config.log 2>&1 || return $?
> -    # Test passed. If this is an --enable-werror build, rerun
> -    # the test with -Werror and bail out if it fails. This
> -    # makes warning-generating-errors in configure test code
> -    # obvious to developers.
> -    if test "$werror" != "yes"; then
> -        return 0
> -    fi
> -    # Don't bother rerunning the compile if we were already using -Werror
> -    case "$*" in
> -        *-Werror*)
> -           return 0
> -        ;;
> -    esac
> -    echo $compiler -Werror "$@" >> config.log
> -    $compiler -Werror "$@" >> config.log 2>&1 && return $?
> -    error_exit "configure test passed without -Werror but failed with -Werror." \
> -        "This is probably a bug in the configure script. The failing command" \
> -        "will be at the bottom of config.log." \
> -        "You can run configure with --disable-werror to bypass this check."
> -}
> -
>  do_cc() {
> -    do_compiler_werror "$cc" $CPU_CFLAGS "$@"
> +    do_compiler "$cc" $CPU_CFLAGS "$@"
>  }
>
>  compile_object() {
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 28/30] docs: update build system docs
  2022-12-09 11:24 ` [PATCH 28/30] docs: update build system docs Paolo Bonzini
@ 2022-12-12 14:00   ` Marc-André Lureau
  0 siblings, 0 replies; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12 14:00 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

Hi

On Fri, Dec 9, 2022 at 3:28 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Now that configure is only doing compiler and host setup, adjust the
> relevant documentation.  It is also possible to build emulators with
> ninja directly if one is so inclined.
>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

better if it didn't break the build :)
qemu/docs/devel/build-system.rst:446:Inline literal start-string
without end-string.

> ---
>  docs/devel/build-system.rst | 275 +++++++++++++++++++++---------------
>  1 file changed, 164 insertions(+), 111 deletions(-)
>
> diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst
> index 4a733fc0a747..a25070fcaac8 100644
> --- a/docs/devel/build-system.rst
> +++ b/docs/devel/build-system.rst
> @@ -4,30 +4,14 @@ The QEMU build system architecture
>
>  This document aims to help developers understand the architecture of the
>  QEMU build system. As with projects using GNU autotools, the QEMU build
> -system has two stages, first the developer runs the "configure" script
> +system has two stages; first the developer runs the "configure" script
>  to determine the local build environment characteristics, then they run
> -"make" to build the project. There is about where the similarities with
> +"make" to build the project.  This is about where the similarities with
>  GNU autotools end, so try to forget what you know about them.
>
> +The two general ways to perform a build are as follows:
>
> -Stage 1: configure
> -==================
> -
> -The QEMU configure script is written directly in shell, and should be
> -compatible with any POSIX shell, hence it uses #!/bin/sh. An important
> -implication of this is that it is important to avoid using bash-isms on
> -development platforms where bash is the primary host.
> -
> -In contrast to autoconf scripts, QEMU's configure is expected to be
> -silent while it is checking for features. It will only display output
> -when an error occurs, or to show the final feature enablement summary
> -on completion.
> -
> -Because QEMU uses the Meson build system under the hood, only VPATH
> -builds are supported.  There are two general ways to invoke configure &
> -perform a build:
> -
> - - VPATH, build artifacts outside of QEMU source tree entirely::
> + - build artifacts outside of QEMU source tree entirely::
>
>       cd ../
>       mkdir build
> @@ -35,80 +19,114 @@ perform a build:
>       ../qemu/configure
>       make
>
> - - VPATH, build artifacts in a subdir of QEMU source tree::
> + - build artifacts in a subdir of QEMU source tree::
>
>       mkdir build
>       cd build
>       ../configure
>       make
>
> -The configure script automatically recognizes
> -command line options for which a same-named Meson option exists;
> -dashes in the command line are replaced with underscores.
> +Most of the actual build process uses Meson under the hood, therefore
> +build artifacts cannot be placed in the source tree itself.
>
> -Many checks on the compilation environment are still found in configure
> -rather than ``meson.build``, but new checks should be added directly to
> -``meson.build``.
>
> -Patches are also welcome to move existing checks from the configure
> -phase to ``meson.build``.  When doing so, ensure that ``meson.build`` does
> -not use anymore the keys that you have removed from ``config-host.mak``.
> -Typically these will be replaced in ``meson.build`` by boolean variables,
> -``get_option('optname')`` invocations, or ``dep.found()`` expressions.
> -In general, the remaining checks have little or no interdependencies,
> -so they can be moved one by one.
> +Stage 1: configure
> +==================
>
> -Helper functions
> -----------------
> +The configure script has four tasks:
>
> -The configure script provides a variety of helper functions to assist
> -developers in checking for system features:
> + - detect the host architecture
>
> -``do_cc $ARGS...``
> -   Attempt to run the system C compiler passing it $ARGS...
> + - list the targets for which to build emulators; the list of
> +   targets also affects which firmware binaries and tests to build
>
> -``do_cxx $ARGS...``
> -   Attempt to run the system C++ compiler passing it $ARGS...
> + - find the compilers (native and cross) used to build executables,
> +   firmware and tests.  The results are written as either Makefile
> +   fragments (``config-host.mak``) or a Meson machine file
> +   (``config-meson.cross``)
>
> -``compile_object $CFLAGS``
> -   Attempt to compile a test program with the system C compiler using
> -   $CFLAGS. The test program must have been previously written to a file
> -   called $TMPC.  The replacement in Meson is the compiler object ``cc``,
> -   which has methods such as ``cc.compiles()``,
> -   ``cc.check_header()``, ``cc.has_function()``.
> + - invoke Meson to perform the actual configuration step for the
> +   emulator build
>
> -``compile_prog $CFLAGS $LDFLAGS``
> -   Attempt to compile a test program with the system C compiler using
> -   $CFLAGS and link it with the system linker using $LDFLAGS. The test
> -   program must have been previously written to a file called $TMPC.
> -   The replacement in Meson is ``cc.find_library()`` and ``cc.links()``.
> +The configure script automatically recognizes command line options for
> +which a same-named Meson option exists; dashes in the command line are
> +replaced with underscores.
> +
> +Almost all QEMU developers that need to modify the build system will
> +only be concerned with Meson, and therefore can skip the rest of this
> +section.
> +
> +
> +Modifying ``configure``
> +-----------------------
> +
> +``configure`` is a shell script; it uses ``#!/bin/sh`` and therefore
> +should be compatible with any POSIX shell. It is important to avoid
> +using bash-isms to avoid breaking development platforms where bash is
> +the primary host.
> +
> +The configure script provides a variety of functions to help writing
> +portable shell code and providing consistent behavior across architectures
> +and operating systems:
> +
> +``error_exit $MESSAGE $MORE...``
> +   Print $MESSAGE to stderr, followed by $MORE... and then exit from the
> +   configure script with non-zero status.
>
>  ``has $COMMAND``
>     Determine if $COMMAND exists in the current environment, either as a
>     shell builtin, or executable binary, returning 0 on success.  The
>     replacement in Meson is ``find_program()``.
>
> +``probe_target_compiler $TARGET``
> +  Detect a cross compiler and cross tools for the QEMU target $TARGET (e.g.,
> +  ``$CPU-softmmu``, ``$CPU-linux-user``, ``$CPU-bsd-user``).  If a working
> +  compiler is present, return success and set variables ``$target_cc``,
> +  ``$target_ar``, etc. to non-empty values.
> +
> +``write_target_makefile``
> +  Write a Makefile fragment to stdout, exposing the result of the most
> +  ``probe_target_compiler`` call as the usual Make variables (``CC``,
> +  ``AR``, ``LD``, etc.).
> +
> +
> +Configure does not generally perform tests for compiler options beyond
> +basic checks to detect the host platform and ensure the compiler is
> +functioning.  These are performed using a few more helper functions:
> +
> +``compile_object $CFLAGS``
> +   Attempt to compile a test program with the system C compiler using
> +   $CFLAGS. The test program must have been previously written to a file
> +   called $TMPC.
> +
> +``compile_prog $CFLAGS $LDFLAGS``
> +   Attempt to compile a test program with the system C compiler using
> +   $CFLAGS and link it with the system linker using $LDFLAGS. The test
> +   program must have been previously written to a file called $TMPC.
> +
>  ``check_define $NAME``
> -   Determine if the macro $NAME is defined by the system C compiler
> +   Determine if the macro $NAME is defined by the system C compiler.
> +
> +``do_compiler $CC $ARGS...``
> +   Attempt to run the C compiler $CC, passing it $ARGS...  This function
> +   does not use flags passed via options such as ``--extra-cflags``, and
> +   therefore can be used to check for cross compilers.  However, most
> +   such checks are done at ``make`` time instead (see for example the
> +   ``cc-option`` macro in ``pc-bios/option-rom/Makefile``).
>
>  ``write_c_skeleton``
>     Write a minimal C program main() function to the temporary file
> -   indicated by $TMPC
> -
> -``error_exit $MESSAGE $MORE...``
> -   Print $MESSAGE to stderr, followed by $MORE... and then exit from the
> -   configure script with non-zero status
> +   indicated by $TMPC.
>
>
>  Stage 2: Meson
>  ==============
>
> -The Meson build system is currently used to describe the build
> -process for:
> +The Meson build system describes the build and install process for:
>
>  1) executables, which include:
>
> -   - Tools - ``qemu-img``, ``qemu-nbd``, ``qga`` (guest agent), etc
> +   - Tools - ``qemu-img``, ``qemu-nbd``, ``qemu-ga`` (guest agent), etc
>
>     - System emulators - ``qemu-system-$ARCH``
>
> @@ -118,7 +136,8 @@ process for:
>
>  2) documentation
>
> -3) ROMs, which can be either installed as binary blobs or compiled
> +3) ROMs, whether provided as binary blobs in the QEMU distributions
> +   or cross compiled under the direction of the configure script
>
>  4) other data files, such as icons or desktop files
>
> @@ -273,8 +292,7 @@ system/userspace emulation target
>  Adding checks
>  -------------
>
> -New checks should be added to Meson.  Compiler checks can be as simple as
> -the following::
> +Compiler checks can be as simple as the following::
>
>    config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
>
> @@ -351,22 +369,30 @@ script, which may point to something other than the first python3
>  binary on the path.
>
>
> -Stage 3: makefiles
> -==================
> +Stage 3: Make
> +=============
>
> -The use of GNU make is required with the QEMU build system.
> +The next step in building QEMU is to invoke make.  GNU Make is required
> +to build QEMU, and may be installed as ``gmake`` on some hosts.
>
> -The output of Meson is a build.ninja file, which is used with the Ninja
> -build system.  QEMU uses a different approach, where Makefile rules are
> -synthesized from the build.ninja file.  The main Makefile includes these
> -rules and wraps them so that e.g. submodules are built before QEMU.
> -The resulting build system is largely non-recursive in nature, in
> -contrast to common practices seen with automake.
> +The output of Meson is a ``build.ninja`` file, which is used with the
> +Ninja build tool.  However, QEMU's build comprises other components than
> +just the emulators (namely firmware and the tests in ``tests/tcg``) which
> +need different cross compilers.  The QEMU Makefile wraps both Ninja and
> +the smaller build systems for firmware and tests; it also takes care of
> +running ``configure`` again when the script changes.  Apart from invoking
> +these sub-Makefiles, the resulting build is largely non-recursive.
>
> -Tests are also ran by the Makefile with the traditional ``make check``
> -phony target, while benchmarks are run with ``make bench``.  Meson test
> -suites such as ``unit`` can be ran with ``make check-unit`` too.  It is also
> -possible to run tests defined in meson.build with ``meson test``.
> +Tests, whether defined in ``meson.build`` or not, are also ran by the
> +Makefile with the traditional ``make check`` phony target, while benchmarks
> +are run with ``make bench``.  Meson test suites such as ``unit`` can be ran
> +with ``make check-unit``, and ``make check-tcg`` builds and runs "non-Meson"
> +tests for all targets.
> +
> +If desired, it is also possible to use ``ninja`` and ``meson test``,
> +respectively to build emulators and run tests defined in meson.build.
> +The main difference is that ``make`` needs the ``-jN`` flag in order to
> +enable parallel builds or tests.
>
>  Useful make targets
>  -------------------
> @@ -378,6 +404,7 @@ Useful make targets
>    Print the value of the variable VAR. Useful for debugging the build
>    system.
>
> +
>  Important files for the build system
>  ====================================
>
> @@ -391,8 +418,7 @@ number of dynamically created files listed later.
>  ``Makefile``
>    The main entry point used when invoking make to build all the components
>    of QEMU. The default 'all' target will naturally result in the build of
> -  every component. Makefile takes care of recursively building submodules
> -  directly via a non-recursive set of rules.
> +  every component.
>
>  ``*/meson.build``
>    The meson.build file in the root directory is the main entry point for the
> @@ -401,59 +427,86 @@ number of dynamically created files listed later.
>    other meson.build files spread throughout the QEMU source tree.
>
>  ``tests/Makefile.include``
> -  Rules for external test harnesses. These include the TCG tests,
> -  ``qemu-iotests`` and the Avocado-based integration tests.
> +  Rules for external test harnesses. These include the TCG tests
> +  and the Avocado-based integration tests.
>
>  ``tests/docker/Makefile.include``
> -  Rules for Docker tests. Like tests/Makefile, this file is included
> -  directly by the top level Makefile, anything defined in this file will
> -  influence the entire build system.
> +  Rules for Docker tests. Like ``tests/Makefile.include``, this file is
> +  included directly by the top level Makefile, anything defined in this
> +  file will influence the entire build system.
>
>  ``tests/vm/Makefile.include``
> -  Rules for VM-based tests. Like tests/Makefile, this file is included
> -  directly by the top level Makefile, anything defined in this file will
> -  influence the entire build system.
> +  Rules for VM-based tests. Like ``tests/Makefile.include``, this file is
> +  included directly by the top level Makefile, anything defined in this
> +  file will influence the entire build system.
>
>  Dynamically created files
>  -------------------------
>
> -The following files are generated dynamically by configure in order to
> -control the behaviour of the statically defined makefiles. This avoids
> -the need for QEMU makefiles to go through any pre-processing as seen
> -with autotools, where Makefile.am generates Makefile.in which generates
> -Makefile.
> +The following files are generated at run-time in order to control the
> +behaviour of the Makefiles. This avoids the need for QEMU makefiles to
> +go through any pre-processing as seen with autotools, where configure
> +generates ``Makefile`` from ``Makefile.in`.
>
>  Built by configure:
>
>  ``config-host.mak``
>    When configure has determined the characteristics of the build host it
> -  will write a long list of variables to config-host.mak file. This
> -  provides the various install directories, compiler / linker flags and a
> +  will write them to this file for use in ``Makefile`` and to a smaller
> +  extent ``meson.build``. These include the paths to various tools and a
>    variety of ``CONFIG_*`` variables related to optionally enabled features.
> -  This is imported by the top level Makefile and meson.build in order to
> -  tailor the build output.
>
> -  config-host.mak is also used as a dependency checking mechanism. If make
> +  ``config-host.mak`` is also used as a dependency checking mechanism. If make
>    sees that the modification timestamp on configure is newer than that on
> -  config-host.mak, then configure will be re-run.
> +  ``config-host.mak``, then configure will be re-run.
>
> -  The variables defined here are those which are applicable to all QEMU
> -  build outputs. Variables which are potentially different for each
> -  emulator target are defined by the next file...
> +  The variables defined here apply to all QEMU
> +  build outputs.
> +
> +``config-meson.cross``
> +
> +  A Meson "cross file" (or native file) used to communicate the paths to
> +  the toolchain and other configuration options.
> +
> +``config.status``
> +
> +  A small shell script that will invoke configure again with the same
> +  environment variables that were set during the first run.  It's used to
> +  rerun configure after changes to the source code, but it can also be
> +  inspected manually to check the contents of the environment.
> +
> +``Makefile.prereqs``
> +
> +  A set of Makefile dependencies that order the build and execution of
> +  firmware and tests after the container images and emulators that they
> +  need.
> +
> +``pc-bios/*/config.mak``, ``tests/tcg/config-host.mak``, ``tests/tcg/*/config-target.mak``
> +
> +  Configuration variables used to build the firmware and TCG tests,
> +  including paths to cross compilation toolchains.
>
>
>  Built by Meson:
>
> -``${TARGET-NAME}-config-devices.mak``
> -  TARGET-NAME is again the name of a system or userspace emulator. The
> -  config-devices.mak file is automatically generated by make using the
> -  scripts/make_device_config.sh program, feeding it the
> -  default-configs/$TARGET-NAME file as input.
> +``config-host.h``
> +  Used by C code to determine the properties of the build environment
> +  and the set of enabled features for the entire build.
>
> -``config-host.h``, ``$TARGET_NAME-config-target.h``, ``$TARGET_NAME-config-devices.h``
> -  These files are used by source code to determine what features are
> -  enabled.  They are generated from the contents of the corresponding
> -  ``*.mak`` files using Meson's ``configure_file()`` function.
> +``${TARGET-NAME}-config-devices.mak``
> +  TARGET-NAME is the name of a system emulator. The file is
> +  generated by Meson using files under ``configs/devices`` as input.
> +
> +``${TARGET-NAME}-config-target.mak``
> +  TARGET-NAME is the name of a system or usermode emulator. The file is
> +  generated by Meson using files under ``configs/targets`` as input.
> +
> +``$TARGET_NAME-config-target.h``, ``$TARGET_NAME-config-devices.h``
> +  Used by C code to determine the properties and enabled
> +  features for each target.  enabled.  They are generated from
> +  the contents of the corresponding ``*.mak`` files using Meson's
> +  ``configure_file()`` function; each target can include them using
> +  the ``CONFIG_TARGET`` and ``CONFIG_DEVICES`` macro respectively.
>
>  ``build.ninja``
>    The build rules.
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 30/30] meson: always log qemu-iotests verbosely
  2022-12-09 11:24 ` [PATCH 30/30] meson: always log qemu-iotests verbosely Paolo Bonzini
@ 2022-12-12 14:02   ` Marc-André Lureau
  2022-12-12 16:48     ` Paolo Bonzini
  2022-12-12 16:55   ` Peter Maydell
  1 sibling, 1 reply; 92+ messages in thread
From: Marc-André Lureau @ 2022-12-12 14:02 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel, Kevin Wolf, Hanna Reitz

Hi

On Fri, Dec 9, 2022 at 3:29 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>

Sounds fine, but I like silence too. Could you give a bit of motivation details?
thanks!

> ---
>  tests/qemu-iotests/meson.build | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/tests/qemu-iotests/meson.build b/tests/qemu-iotests/meson.build
> index 583468c5b9b3..3d8637c8f2b6 100644
> --- a/tests/qemu-iotests/meson.build
> +++ b/tests/qemu-iotests/meson.build
> @@ -43,5 +43,6 @@ foreach format, speed: qemu_iotests_formats
>         protocol: 'tap',
>         suite: suites,
>         timeout: 0,
> +       verbose: true,
>         is_parallel: false)
>  endforeach
> --
> 2.38.1
>
>


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 30/30] meson: always log qemu-iotests verbosely
  2022-12-12 14:02   ` Marc-André Lureau
@ 2022-12-12 16:48     ` Paolo Bonzini
  0 siblings, 0 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-12 16:48 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Kevin Wolf, Hanna Reitz

On 12/12/22 15:02, Marc-André Lureau wrote:
> Sounds fine, but I like silence too. Could you give a bit of motivation details?
> thanks!

One qemu-iotests TAP testcase is comparable to a test() invocation 
elsewhere (in terms of both runtime and kind of test).  This makes it 
useful to see the last logged test.

Paolo



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 30/30] meson: always log qemu-iotests verbosely
  2022-12-09 11:24 ` [PATCH 30/30] meson: always log qemu-iotests verbosely Paolo Bonzini
  2022-12-12 14:02   ` Marc-André Lureau
@ 2022-12-12 16:55   ` Peter Maydell
  2022-12-12 21:36     ` Paolo Bonzini
  1 sibling, 1 reply; 92+ messages in thread
From: Peter Maydell @ 2022-12-12 16:55 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, 9 Dec 2022 at 11:44, Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> ---
>  tests/qemu-iotests/meson.build | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/tests/qemu-iotests/meson.build b/tests/qemu-iotests/meson.build
> index 583468c5b9b3..3d8637c8f2b6 100644
> --- a/tests/qemu-iotests/meson.build
> +++ b/tests/qemu-iotests/meson.build
> @@ -43,5 +43,6 @@ foreach format, speed: qemu_iotests_formats
>         protocol: 'tap',
>         suite: suites,
>         timeout: 0,
> +       verbose: true,
>         is_parallel: false)
>  endforeach

How much does this increase the size of a build-and-test logfile by?
I know the gitlab CI has a size limit on that these days, so if this
noticeably increases the total log size we might want to check how
close we are to the limit...

thanks
-- PMM


^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 21/30] build: move sanitizer tests to meson
  2022-12-12 12:16   ` Marc-André Lureau
@ 2022-12-12 17:31     ` Paolo Bonzini
  2022-12-12 20:37     ` Paolo Bonzini
  1 sibling, 0 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-12 17:31 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel

On 12/12/22 13:16, Marc-André Lureau wrote:
> No, it compiles successfully with clang (Fedora 15.0.4-1.fc37) and
> glibc-2.36-8.fc37.x86_64 at least.
> 
> I guess we need someone to check on macos with glibc 2.35
> (https://formulae.brew.sh/formula/glibc#default)

That's a Linux-only formula, so no need to check with macos.  I'll leave 
this patch as is, we can remove it later.

Paolo



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 21/30] build: move sanitizer tests to meson
  2022-12-12 12:16   ` Marc-André Lureau
  2022-12-12 17:31     ` Paolo Bonzini
@ 2022-12-12 20:37     ` Paolo Bonzini
  1 sibling, 0 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-12 20:37 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 423 bytes --]

Il lun 12 dic 2022, 13:16 Marc-André Lureau <marcandre.lureau@gmail.com> ha
scritto:

> +if get_option('sanitizers')
> +  if cc.has_argument('-fsanitize=address')
> +    qemu_cflags = ['-fsanitize=address'] + qemu_cflags
> +    qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags

why not the += syntax? same below


Configure puts it at the beginning of QEMU_CFLAGS and I didn't want to
change it.

Paolo

[-- Attachment #2: Type: text/html, Size: 869 bytes --]

^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 30/30] meson: always log qemu-iotests verbosely
  2022-12-12 16:55   ` Peter Maydell
@ 2022-12-12 21:36     ` Paolo Bonzini
  0 siblings, 0 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-12 21:36 UTC (permalink / raw)
  To: Peter Maydell; +Cc: qemu-devel

On 12/12/22 17:55, Peter Maydell wrote:
> On Fri, 9 Dec 2022 at 11:44, Paolo Bonzini <pbonzini@redhat.com> wrote:
>>
>> ---
>>   tests/qemu-iotests/meson.build | 1 +
>>   1 file changed, 1 insertion(+)
>>
>> diff --git a/tests/qemu-iotests/meson.build b/tests/qemu-iotests/meson.build
>> index 583468c5b9b3..3d8637c8f2b6 100644
>> --- a/tests/qemu-iotests/meson.build
>> +++ b/tests/qemu-iotests/meson.build
>> @@ -43,5 +43,6 @@ foreach format, speed: qemu_iotests_formats
>>          protocol: 'tap',
>>          suite: suites,
>>          timeout: 0,
>> +       verbose: true,
>>          is_parallel: false)
>>   endforeach
> 
> How much does this increase the size of a build-and-test logfile by?
> I know the gitlab CI has a size limit on that these days, so if this
> noticeably increases the total log size we might want to check how
> close we are to the limit...

~300 lines, so probably around 20-30 kilobytes.

Paolo



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 01/30] configure: remove useless write_c_skeleton
  2022-12-09 11:23 ` [PATCH 01/30] configure: remove useless write_c_skeleton Paolo Bonzini
  2022-12-09 11:38   ` Peter Maydell
@ 2022-12-16 14:33   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 14:33 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:40PM +0100, Paolo Bonzini wrote:
> This is not needed ever since QEMU stopped detecting -liberty; this
> happened with the Meson switch but it is quite likely that the
> library was not really necessary years before.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure | 1 -
>  1 file changed, 1 deletion(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 02/30] configure: remove dead function
  2022-12-09 11:23 ` [PATCH 02/30] configure: remove dead function Paolo Bonzini
  2022-12-09 11:36   ` Peter Maydell
@ 2022-12-16 14:33   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 14:33 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:41PM +0100, Paolo Bonzini wrote:
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure | 4 ----
>  1 file changed, 4 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 03/30] configure: remove useless test
  2022-12-09 11:23 ` [PATCH 03/30] configure: remove useless test Paolo Bonzini
  2022-12-09 11:34   ` Peter Maydell
@ 2022-12-16 14:35   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 14:35 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:42PM +0100, Paolo Bonzini wrote:
> $cpu is derived from preprocessor defines rather than uname these days,
> so do not bother using isainfo on Solaris.  Likewise do not recognize
> BeOS's uname -m output.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure | 12 +-----------
>  1 file changed, 1 insertion(+), 11 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 04/30] configure: preserve qemu-ga variables
  2022-12-09 11:23 ` [PATCH 04/30] configure: preserve qemu-ga variables Paolo Bonzini
  2022-12-12  7:52   ` Marc-André Lureau
@ 2022-12-16 14:39   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 14:39 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:43PM +0100, Paolo Bonzini wrote:
> Ensure that qemu-ga variables set at configure time are kept
> later when the script is rerun.  For preserve_env to work,
> the variables need to be empty so move the default values
> to config-host.mak generation.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure | 23 ++++++-----------------
>  1 file changed, 6 insertions(+), 17 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 05/30] configure: remove backwards-compatibility and obsolete options
  2022-12-09 11:23 ` [PATCH 05/30] configure: remove backwards-compatibility and obsolete options Paolo Bonzini
  2022-12-12  7:57   ` Marc-André Lureau
@ 2022-12-16 14:40   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 14:40 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:44PM +0100, Paolo Bonzini wrote:
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure | 20 --------------------
>  1 file changed, 20 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 06/30] meson: tweak hardening options for Windows
  2022-12-09 11:23 ` [PATCH 06/30] meson: tweak hardening options for Windows Paolo Bonzini
  2022-12-12  8:18   ` Marc-André Lureau
@ 2022-12-16 14:42   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 14:42 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:45PM +0100, Paolo Bonzini wrote:
> -Wl,--dynamicbase has been enabled for DLLs upstream for roughly 2
> years (https://sourceware.org/bugzilla/show_bug.cgi?id=19011), and
> also by some distros including Debian for 6 years even
> (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=836365), so
> just enable it unconditionally.
> 
> Also add -Wl,--high-entropy-va.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  meson.build | 5 +----
>  1 file changed, 1 insertion(+), 4 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 07/30] meson: support meson 0.64 -Doptimization=plain
  2022-12-09 11:23 ` [PATCH 07/30] meson: support meson 0.64 -Doptimization=plain Paolo Bonzini
  2022-12-12  8:21   ` Marc-André Lureau
@ 2022-12-16 14:53   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 14:53 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:46PM +0100, Paolo Bonzini wrote:
> In Meson 0.64, the optimization built-in option now accepts the "plain" value,
> which will not set any optimization flags.  While QEMU does not check the
> contents of the option and therefore does not suffer any ill effect
> from the new value, it uses get_option to print the optimization flags
> in the summary.  Clean the code up to remove duplication, and check for
> -Doptimization=plain at the same time.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  meson.build | 16 +++++++---------
>  1 file changed, 7 insertions(+), 9 deletions(-)
> 
> diff --git a/meson.build b/meson.build
> index d61c7a82f112..dbd0b5563446 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -3752,18 +3752,16 @@ endif
>  if targetos == 'darwin'
>    summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
>  endif
> -summary_info += {'CFLAGS':            ' '.join(get_option('c_args')
> -                                               + ['-O' + get_option('optimization')]
> -                                               + (get_option('debug') ? ['-g'] : []))}
> +option_cflags = (get_option('debug') ? ['-g'] : [])
> +if get_option('optimization') != 'plain'
> +  option_cflags += ['-O' + get_option('optimization')]
> +endif

Instead of trying to secondguess what these flags will be turned into
by Meson, why not just log them directly

  summary_info += {'optimization': get_option('optimization')}
  summary_info += {'debug': get_option('debug')}

> +summary_info += {'CFLAGS':            ' '.join(get_option('c_args') + option_cflags)}
>  if link_language == 'cpp'
> -  summary_info += {'CXXFLAGS':        ' '.join(get_option('cpp_args')
> -                                               + ['-O' + get_option('optimization')]
> -                                               + (get_option('debug') ? ['-g'] : []))}
> +  summary_info += {'CXXFLAGS':        ' '.join(get_option('cpp_args') + option_cflags)}
>  endif
>  if targetos == 'darwin'
> -  summary_info += {'OBJCFLAGS':       ' '.join(get_option('objc_args')
> -                                               + ['-O' + get_option('optimization')]
> -                                               + (get_option('debug') ? ['-g'] : []))}
> +  summary_info += {'OBJCFLAGS':       ' '.join(get_option('objc_args') + option_cflags)}
>  endif
>  link_args = get_option(link_language + '_link_args')
>  if link_args.length() > 0
> -- 
> 2.38.1
> 
> 

With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 09/30] meson: use prefer_static option
  2022-12-09 11:23 ` [PATCH 09/30] meson: use prefer_static option Paolo Bonzini
  2022-12-12  8:29   ` Marc-André Lureau
@ 2022-12-16 14:58   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 14:58 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:48PM +0100, Paolo Bonzini wrote:
> The option is new in Meson 0.63 and removes the need to pass "static:
> true" to all dependency and find_library invocation.  Actually cleaning
> up the invocations is left for a separate patch.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure                   |  4 +---
>  docs/devel/build-system.rst |  3 +--
>  meson.build                 | 11 ++++-------
>  qga/meson.build             |  2 +-
>  4 files changed, 7 insertions(+), 13 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 10/30] meson: remove static_kwargs
  2022-12-09 11:23 ` [PATCH 10/30] meson: remove static_kwargs Paolo Bonzini
  2022-12-12  8:32   ` Marc-André Lureau
@ 2022-12-16 14:59   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 14:59 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:49PM +0100, Paolo Bonzini wrote:
> After static_kwargs has been changed to an empty dictionary, it has
> no functional effect and can be removed.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  meson.build     | 212 +++++++++++++++++++-----------------------------
>  tcg/meson.build |   2 +-
>  2 files changed, 84 insertions(+), 130 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 11/30] meson: cleanup dummy-cpus.c rules
  2022-12-09 11:23 ` [PATCH 11/30] meson: cleanup dummy-cpus.c rules Paolo Bonzini
  2022-12-12  8:39   ` Marc-André Lureau
@ 2022-12-16 14:59   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 14:59 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:50PM +0100, Paolo Bonzini wrote:
> Now that qtest is available on all targets including Windows, dummy-cpus.c
> is included unconditionally in the build.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  accel/meson.build | 9 ++-------
>  1 file changed, 2 insertions(+), 7 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 14/30] configure: test all warnings
  2022-12-09 11:23 ` [PATCH 14/30] configure: test all warnings Paolo Bonzini
  2022-12-09 12:45   ` Philippe Mathieu-Daudé
@ 2022-12-16 15:01   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 15:01 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:53PM +0100, Paolo Bonzini wrote:
> Some warnings are hardcoded in QEMU_CFLAGS and not tested.  There is
> no particular reason to single out these five, as many more -W flags are
> present on all the supported compilers.  For homogeneity when moving
> the detection to meson, make them use the same warn_flags infrastructure.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 15/30] meson: cleanup compiler detection
  2022-12-09 11:23 ` [PATCH 15/30] meson: cleanup compiler detection Paolo Bonzini
  2022-12-12  9:04   ` Marc-André Lureau
@ 2022-12-16 15:03   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 15:03 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:54PM +0100, Paolo Bonzini wrote:
> Detect all compilers at the beginning of meson.build, and store
> the available languages in an array.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  meson.build | 62 ++++++++++++++++++++++++++++++-----------------------
>  1 file changed, 35 insertions(+), 27 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 17/30] configure: remove pkg-config functions
  2022-12-09 11:23 ` [PATCH 17/30] configure: remove pkg-config functions Paolo Bonzini
  2022-12-12  9:05   ` Marc-André Lureau
@ 2022-12-16 15:07   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 15:07 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:56PM +0100, Paolo Bonzini wrote:
> All uses of pkg-config have been moved to Meson.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure                   | 19 +++----------------
>  docs/devel/build-system.rst |  4 ----
>  2 files changed, 3 insertions(+), 20 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 18/30] configure, meson: move --enable-modules to Meson
  2022-12-09 11:23 ` [PATCH 18/30] configure, meson: move --enable-modules to Meson Paolo Bonzini
  2022-12-12  9:07   ` Marc-André Lureau
@ 2022-12-16 15:09   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 15:09 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:57PM +0100, Paolo Bonzini wrote:
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure                     | 21 +--------------------
>  meson.build                   |  7 ++++++-
>  meson_options.txt             |  2 ++
>  scripts/meson-buildoptions.sh |  3 +++
>  4 files changed, 12 insertions(+), 21 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 19/30] configure, meson: move --enable-debug-info to Meson
  2022-12-09 11:23 ` [PATCH 19/30] configure, meson: move --enable-debug-info " Paolo Bonzini
  2022-12-09 12:55   ` Philippe Mathieu-Daudé
@ 2022-12-16 15:09   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 15:09 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:58PM +0100, Paolo Bonzini wrote:
> Older versions of Meson had an unclear description of the -Ddebug option,
> but this is fixed in 0.63.0 that is required now.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure                     | 5 -----
>  scripts/meson-buildoptions.py | 2 ++
>  scripts/meson-buildoptions.sh | 3 +++
>  3 files changed, 5 insertions(+), 5 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
 

With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH 20/30] meson: prepare move of QEMU_CFLAGS to meson
  2022-12-09 11:23 ` [PATCH 20/30] meson: prepare move of QEMU_CFLAGS to meson Paolo Bonzini
  2022-12-12 12:02   ` Marc-André Lureau
@ 2022-12-16 15:11   ` Daniel P. Berrangé
  1 sibling, 0 replies; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 15:11 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:59PM +0100, Paolo Bonzini wrote:
> Clean up the handling of compiler flags in meson.build, splitting
> the general flags that should be included in subprojects as well,
> from warning flags that only apply to QEMU itself.  The two were
> mixed in both configure tests and meson tests.
> 
> This split makes it easier to move the compiler tests piecewise
> from configure to Meson.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  meson.build | 53 +++++++++++++++++++++++++++++------------------------
>  1 file changed, 29 insertions(+), 24 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH for-8.0 00/30] Meson changes for QEMU 8.0
  2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
                   ` (29 preceding siblings ...)
  2022-12-09 11:24 ` [PATCH 30/30] meson: always log qemu-iotests verbosely Paolo Bonzini
@ 2022-12-16 15:35 ` Daniel P. Berrangé
  2022-12-17 12:54   ` Paolo Bonzini
  30 siblings, 1 reply; 92+ messages in thread
From: Daniel P. Berrangé @ 2022-12-16 15:35 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Fri, Dec 09, 2022 at 12:23:39PM +0100, Paolo Bonzini wrote:
> The final bout of conversions removes the remaining compiler tests
> for emulators, applies a few cleanups that are enabled by version 0.63
> of Meson, and updates the documentation.
> 
> Committing this however requires first a libvirt-ci update, in order to
> enable using Python 3.8/3.9 on CentOS 8 and SLES 15.  I am still working
> on it but the review can start early for these patches.
> 
> A final comparison for the effort has a net negative of around 4000
> lines of code, despite the growth of QEMU itself in the meanwhile:
> 
>       before                             after
> --------------------------------------------------------------------------
>  8647 configure                     4240 meson.build
>  1296 Makefile                      1970 configure                            
>   985 tests/Makefile.include         337 Makefile
>   440 rules.mak                      224 scripts/meson-buildoptions.py
>   379 scripts/tap-driver.pl          171 tests/Makefile.include
>   287 Makefile.target                129 scripts/nsis.py
>   263 tests/tcg/configure.sh         113 scripts/mtest2make.py
>   129 scripts/create_config           48 scripts/undefsym.py
> ~5500 various Makefile fragments   ~6500 various meson.build files
> --------------------------------------------------------------------------
> 17926 total                        13732 total

So after applying this series, at least on Fedora, I barely needed
configure at all, in so muc as the following successfully built AFAICT:

$ mkdir build
$ cat > build/config-host.mak <<EOF
all:
GIT=git
GIT_SUBMODULES=ui/keycodemapdb tests/fp/berkeley-testfloat-3 tests/fp/berkeley-softfloat-3 dtc
GIT_SUBMODULES_ACTION=update
CONFIG_POSIX=y
CONFIG_LINUX=y
SRC_PATH=/home/berrange/src/virt/qemu
TARGET_DIRS=x86_64-softmmu
CONFIG_PLUGIN=y
HAVE_GDB_BIN=/usr/bin/gdb
ENGINE=podman
ROMS=pc-bios/optionrom
MAKE=make
PYTHON=/usr/bin/python3 -B
GENISOIMAGE=/usr/bin/genisoimage
MESON=/usr/bin/meson
NINJA=/usr/bin/ninja
PKG_CONFIG=
CC=cc
EXESUF=
TCG_TESTS_TARGETS= x86_64-softmmu
EOF
$ meson build
$ ninja -C build

Out of the things in config-host.mak there, a few meson already knows,
like CC, SRC_PATH, 50% would be just a meson find_program() command,
a couple would need meson args (eg TARGET_DIRS), and some just look
redundant, eg CONFIG_LINUX largely duplicates __linux__, and
CONFIG_POSIX is effectively  !_WIN32.


With 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 :|



^ permalink raw reply	[flat|nested] 92+ messages in thread

* Re: [PATCH for-8.0 00/30] Meson changes for QEMU 8.0
  2022-12-16 15:35 ` [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Daniel P. Berrangé
@ 2022-12-17 12:54   ` Paolo Bonzini
  0 siblings, 0 replies; 92+ messages in thread
From: Paolo Bonzini @ 2022-12-17 12:54 UTC (permalink / raw)
  To: Daniel P. Berrangé; +Cc: qemu-devel

On 12/16/22 16:35, Daniel P. Berrangé wrote:
> So after applying this series, at least on Fedora, I barely needed
> configure at all, in so muc as the following successfully built AFAICT:
> 
> $ mkdir build
> $ cat > build/config-host.mak <<EOF
> all:
> GIT=git
> GIT_SUBMODULES=ui/keycodemapdb tests/fp/berkeley-testfloat-3 tests/fp/berkeley-softfloat-3 dtc
> GIT_SUBMODULES_ACTION=update
> CONFIG_POSIX=y
> CONFIG_LINUX=y
> SRC_PATH=/home/berrange/src/virt/qemu
> TARGET_DIRS=x86_64-softmmu
> CONFIG_PLUGIN=y
> HAVE_GDB_BIN=/usr/bin/gdb
> ENGINE=podman
> ROMS=pc-bios/optionrom
> MAKE=make
> PYTHON=/usr/bin/python3 -B
> GENISOIMAGE=/usr/bin/genisoimage
> MESON=/usr/bin/meson
> NINJA=/usr/bin/ninja
> PKG_CONFIG=
> CC=cc
> EXESUF=
> TCG_TESTS_TARGETS= x86_64-softmmu
> EOF
> $ meson build
> $ ninja -C build

Yep.  It wouldn't build the firmwares though, or be able to run TCG or 
Avocado tests.  This kind of build system orchestration is the remaining 
task of configure (see new docs in patch 28).  It's not really possible 
for it to go away, it's beyond Meson's capabilities and intentions.

I would also like to move Python virtual environment configuration to 
configure.  This would give a lot more flexibility in whether to use 
network or not, for example, and is in line with submodule handling that 
is already in configure.

> Out of the things in config-host.mak there, a few meson already knows,
> like CC, SRC_PATH, 50% would be just a meson find_program() command,
> a couple would need meson args (eg TARGET_DIRS), and some just look
> redundant, eg CONFIG_LINUX largely duplicates __linux__, and
> CONFIG_POSIX is effectively  !_WIN32.

There are a couple like ENGINE or HAVE_GDB_BIN that are only needed by 
non-QEMU parts of the build system, and I don't think it makes much 
sense to move those detections out of configure.

But yeah, the OS symbols are pretty low-hanging fruit.  In fact 
meson.build recomputes them:

   config_host_data.set('CONFIG_POSIX', targetos != 'windows')

... and with Windriver's patches to get much closer to POSIX/Windows 
feature parity, the Makefiles don't use them as much as they did.

Paolo



^ permalink raw reply	[flat|nested] 92+ messages in thread

end of thread, other threads:[~2022-12-17 12:55 UTC | newest]

Thread overview: 92+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-12-09 11:23 [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Paolo Bonzini
2022-12-09 11:23 ` [PATCH 01/30] configure: remove useless write_c_skeleton Paolo Bonzini
2022-12-09 11:38   ` Peter Maydell
2022-12-16 14:33   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 02/30] configure: remove dead function Paolo Bonzini
2022-12-09 11:36   ` Peter Maydell
2022-12-16 14:33   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 03/30] configure: remove useless test Paolo Bonzini
2022-12-09 11:34   ` Peter Maydell
2022-12-09 16:35     ` Paolo Bonzini
2022-12-16 14:35   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 04/30] configure: preserve qemu-ga variables Paolo Bonzini
2022-12-12  7:52   ` Marc-André Lureau
2022-12-16 14:39   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 05/30] configure: remove backwards-compatibility and obsolete options Paolo Bonzini
2022-12-12  7:57   ` Marc-André Lureau
2022-12-16 14:40   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 06/30] meson: tweak hardening options for Windows Paolo Bonzini
2022-12-12  8:18   ` Marc-André Lureau
2022-12-12  8:52     ` Paolo Bonzini
2022-12-16 14:42   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 07/30] meson: support meson 0.64 -Doptimization=plain Paolo Bonzini
2022-12-12  8:21   ` Marc-André Lureau
2022-12-16 14:53   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 08/30] meson: require 0.63.0 Paolo Bonzini
2022-12-09 13:25   ` Thomas Huth
2022-12-09 11:23 ` [PATCH 09/30] meson: use prefer_static option Paolo Bonzini
2022-12-12  8:29   ` Marc-André Lureau
2022-12-16 14:58   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 10/30] meson: remove static_kwargs Paolo Bonzini
2022-12-12  8:32   ` Marc-André Lureau
2022-12-16 14:59   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 11/30] meson: cleanup dummy-cpus.c rules Paolo Bonzini
2022-12-12  8:39   ` Marc-André Lureau
2022-12-16 14:59   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 12/30] modinfo: lookup compile_commands.json by object Paolo Bonzini
2022-12-12  8:47   ` Marc-André Lureau
2022-12-09 11:23 ` [PATCH 13/30] configure: remove backwards-compatibility code Paolo Bonzini
2022-12-12  8:55   ` Marc-André Lureau
2022-12-09 11:23 ` [PATCH 14/30] configure: test all warnings Paolo Bonzini
2022-12-09 12:45   ` Philippe Mathieu-Daudé
2022-12-16 15:01   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 15/30] meson: cleanup compiler detection Paolo Bonzini
2022-12-12  9:04   ` Marc-André Lureau
2022-12-16 15:03   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 16/30] build: move glib detection and workarounds to meson Paolo Bonzini
2022-12-09 12:50   ` Philippe Mathieu-Daudé
2022-12-09 11:23 ` [PATCH 17/30] configure: remove pkg-config functions Paolo Bonzini
2022-12-12  9:05   ` Marc-André Lureau
2022-12-16 15:07   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 18/30] configure, meson: move --enable-modules to Meson Paolo Bonzini
2022-12-12  9:07   ` Marc-André Lureau
2022-12-16 15:09   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 19/30] configure, meson: move --enable-debug-info " Paolo Bonzini
2022-12-09 12:55   ` Philippe Mathieu-Daudé
2022-12-09 13:54     ` Paolo Bonzini
2022-12-09 14:21       ` Philippe Mathieu-Daudé
2022-12-09 16:21         ` Paolo Bonzini
2022-12-16 15:09   ` Daniel P. Berrangé
2022-12-09 11:23 ` [PATCH 20/30] meson: prepare move of QEMU_CFLAGS to meson Paolo Bonzini
2022-12-12 12:02   ` Marc-André Lureau
2022-12-16 15:11   ` Daniel P. Berrangé
2022-12-09 11:24 ` [PATCH 21/30] build: move sanitizer tests " Paolo Bonzini
2022-12-12 12:16   ` Marc-André Lureau
2022-12-12 17:31     ` Paolo Bonzini
2022-12-12 20:37     ` Paolo Bonzini
2022-12-09 11:24 ` [PATCH 22/30] build: move SafeStack " Paolo Bonzini
2022-12-09 12:57   ` Philippe Mathieu-Daudé
2022-12-09 11:24 ` [PATCH 23/30] build: move coroutine backend selection " Paolo Bonzini
2022-12-12 12:18   ` Marc-André Lureau
2022-12-09 11:24 ` [PATCH 24/30] build: move stack protector flag " Paolo Bonzini
2022-12-12 12:22   ` Marc-André Lureau
2022-12-09 11:24 ` [PATCH 25/30] build: move warning " Paolo Bonzini
2022-12-12 12:58   ` Marc-André Lureau
2022-12-09 11:24 ` [PATCH 26/30] build: move remaining compiler flag tests " Paolo Bonzini
2022-12-12 13:54   ` Marc-André Lureau
2022-12-09 11:24 ` [PATCH 27/30] build: move compiler version check " Paolo Bonzini
2022-12-09 11:52   ` Peter Maydell
2022-12-09 14:09     ` Paolo Bonzini
2022-12-09 14:19       ` Peter Maydell
2022-12-09 16:21         ` Paolo Bonzini
2022-12-09 11:24 ` [PATCH 28/30] docs: update build system docs Paolo Bonzini
2022-12-12 14:00   ` Marc-André Lureau
2022-12-09 11:24 ` [PATCH 29/30] configure: do not rerun the tests with -Werror Paolo Bonzini
2022-12-12 14:00   ` Marc-André Lureau
2022-12-09 11:24 ` [PATCH 30/30] meson: always log qemu-iotests verbosely Paolo Bonzini
2022-12-12 14:02   ` Marc-André Lureau
2022-12-12 16:48     ` Paolo Bonzini
2022-12-12 16:55   ` Peter Maydell
2022-12-12 21:36     ` Paolo Bonzini
2022-12-16 15:35 ` [PATCH for-8.0 00/30] Meson changes for QEMU 8.0 Daniel P. Berrangé
2022-12-17 12:54   ` Paolo Bonzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).