From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Philippe Mathieu-Daudé" <philmd@linaro.org>
Subject: [PULL 51/68] build: move glib detection and workarounds to meson
Date: Wed, 17 May 2023 19:45:03 +0200 [thread overview]
Message-ID: <20230517174520.887405-52-pbonzini@redhat.com> (raw)
In-Reply-To: <20230517174520.887405-1-pbonzini@redhat.com>
QEMU adds the path to glib.h 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, with export enabled for
modules and disabled for plugin.
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
configure | 98 +---------------------------------------
contrib/plugins/Makefile | 4 +-
meson.build | 92 +++++++++++++++++++++++++++++--------
util/meson.build | 4 +-
4 files changed, 80 insertions(+), 118 deletions(-)
diff --git a/configure b/configure
index 651ada7b6bc3..9b296c0ec132 100755
--- a/configure
+++ b/configure
@@ -231,7 +231,6 @@ safe_stack=""
use_containers="yes"
gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
gdb_arches=""
-glib_has_gslice="no"
if test -e "$source_path/.git"
then
@@ -1509,95 +1508,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
-
-# Check whether glib has gslice, which we have to avoid for correctness.
-# TODO: remove this check and the corresponding workaround (qtree) when
-# the minimum supported glib is >= $glib_dropped_gslice_version.
-glib_dropped_gslice_version=2.75.3
-for i in $glib_modules; do
- if ! $pkg_config --atleast-version=$glib_dropped_gslice_version $i; then
- glib_has_gslice="yes"
- break
- 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
@@ -2454,16 +2364,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
-if test "$glib_has_gslice" = "yes" ; then
- echo "HAVE_GLIB_WITH_SLICE_ALLOCATOR=y" >> $config_host_mak
-fi
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 88fba57cca81..50e36729eb67 100644
--- a/meson.build
+++ b/meson.build
@@ -492,23 +492,79 @@ 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'],
- variables: {
- 'bindir': config_host['GLIB_BINDIR'],
- })
-# override glib dep with the configure results (for subprojects)
-meson.override_dependency('glib-2.0', glib)
-# pass down whether Glib has the slice allocator
-if config_host.has_key('HAVE_GLIB_WITH_SLICE_ALLOCATOR')
- config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', true)
+# 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_pc = 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_pc, 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_pc, args: ['-Werror'])
+ glib_cflags += cc.get_supported_arguments('-Wno-unused-function')
+endif
+glib = declare_dependency(dependencies: [glib_pc, gmodule],
+ compile_args: glib_cflags,
+ version: glib_pc.version())
+
+# Check whether glib has gslice, which we have to avoid for correctness.
+# TODO: remove this check and the corresponding workaround (qtree) when
+# the minimum supported glib is >= 2.75.3
+glib_has_gslice = glib.version().version_compare('<2.75.3')
+
+# 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'
@@ -931,7 +987,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
@@ -1962,6 +2018,7 @@ config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'
config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
+config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
@@ -3034,7 +3091,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')
@@ -3656,7 +3712,7 @@ if host_machine.system() == 'windows'
'@OUTPUT@',
get_option('prefix'),
meson.current_source_dir(),
- config_host['GLIB_BINDIR'],
+ glib_pc.get_variable('bindir'),
host_machine.cpu(),
'--',
'-DDISPLAYVERSION=' + meson.project_version(),
diff --git a/util/meson.build b/util/meson.build
index 3c2cfc6ede66..2cb103fc727e 100644
--- a/util/meson.build
+++ b/util/meson.build
@@ -26,7 +26,9 @@ util_ss.add(when: 'CONFIG_WIN32', if_true: files('oslib-win32.c'))
util_ss.add(when: 'CONFIG_WIN32', if_true: files('qemu-thread-win32.c'))
util_ss.add(when: 'CONFIG_WIN32', if_true: winmm)
util_ss.add(when: 'CONFIG_WIN32', if_true: pathcch)
-util_ss.add(when: 'HAVE_GLIB_WITH_SLICE_ALLOCATOR', if_true: files('qtree.c'))
+if glib_has_gslice
+ util_ss.add(files('qtree.c'))
+endif
util_ss.add(files('envlist.c', 'path.c', 'module.c'))
util_ss.add(files('host-utils.c'))
util_ss.add(files('bitmap.c', 'bitops.c'))
--
2.40.1
next prev parent reply other threads:[~2023-05-17 18:03 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-17 17:44 [PULL 00/68] i386, build system, KVM changes for 2023-05-18 Paolo Bonzini
2023-05-17 17:44 ` [PULL 01/68] target/i386: add support for FLUSH_L1D feature Paolo Bonzini
2023-05-17 17:44 ` [PULL 02/68] target/i386: add support for FB_CLEAR feature Paolo Bonzini
2023-05-17 17:44 ` [PULL 03/68] target/i386: fix operand size for VCOMI/VUCOMI instructions Paolo Bonzini
2023-05-17 17:44 ` [PULL 04/68] target/i386: fix avx2 instructions vzeroall and vpermdq Paolo Bonzini
2023-05-17 17:44 ` [PULL 05/68] tests/tcg/i386: correct mask for VPERM2F128/VPERM2I128 Paolo Bonzini
2023-05-17 17:44 ` [PULL 06/68] target/i386: Fix and add some comments next to SSE/AVX instructions Paolo Bonzini
2023-05-17 17:44 ` [PULL 07/68] target/i386: Fix exception classes for " Paolo Bonzini
2023-05-17 17:44 ` [PULL 08/68] target/i386: Fix exception classes for MOVNTPS/MOVNTPD Paolo Bonzini
2023-05-17 17:44 ` [PULL 09/68] meson: Pass -j option to sphinx Paolo Bonzini
2023-05-17 17:44 ` [PULL 10/68] migration: Add last stage indicator to global dirty log Paolo Bonzini
2023-05-17 17:44 ` [PULL 11/68] kvm: Synchronize the backup bitmap in the last stage Paolo Bonzini
2023-05-17 17:44 ` [PULL 12/68] kvm: Add helper kvm_dirty_ring_init() Paolo Bonzini
2023-05-17 17:44 ` [PULL 13/68] kvm: Enable dirty ring for arm64 Paolo Bonzini
2023-05-17 17:44 ` [PULL 14/68] tcg: round-robin: do not use mb_read for rr_current_cpu Paolo Bonzini
2023-05-17 17:44 ` [PULL 15/68] coverity: the definitive COMPONENTS.md update Paolo Bonzini
2023-05-17 17:44 ` [PULL 16/68] scsi-generic: fix buffer overflow on block limits inquiry Paolo Bonzini
2023-05-17 17:44 ` [PULL 17/68] make: clean after distclean deletes source files Paolo Bonzini
2023-05-17 17:44 ` [PULL 18/68] python: shut up "pip install" during "make check-minreqs" Paolo Bonzini
2023-05-17 17:44 ` [PULL 19/68] python: update pylint configuration Paolo Bonzini
2023-05-17 17:44 ` [PULL 20/68] python: add mkvenv.py Paolo Bonzini
2023-05-17 17:44 ` [PULL 21/68] mkvenv: add better error message for broken or missing ensurepip Paolo Bonzini
2023-05-17 17:44 ` [PULL 22/68] mkvenv: add nested venv workaround Paolo Bonzini
2023-05-17 17:44 ` [PULL 23/68] mkvenv: add ensure subcommand Paolo Bonzini
2023-05-17 17:44 ` [PULL 24/68] mkvenv: add --diagnose option to explain "ensure" failures Paolo Bonzini
2023-05-17 17:44 ` [PULL 25/68] mkvenv: add console script entry point generation Paolo Bonzini
2023-05-17 17:44 ` [PULL 26/68] mkvenv: use pip's vendored distlib as a fallback Paolo Bonzini
2023-05-17 17:44 ` [PULL 27/68] mkvenv: avoid ensurepip if pip is installed Paolo Bonzini
2023-05-17 17:44 ` [PULL 28/68] mkvenv: work around broken pip installations on Debian 10 Paolo Bonzini
2023-05-17 17:44 ` [PULL 29/68] tests/docker: add python3-venv dependency Paolo Bonzini
2023-05-17 17:44 ` [PULL 30/68] tests/vm: Configure netbsd to use Python 3.10 Paolo Bonzini
2023-05-17 17:44 ` [PULL 31/68] tests/vm: add py310-expat to NetBSD Paolo Bonzini
2023-05-17 17:44 ` [PULL 32/68] python: add vendor.py utility Paolo Bonzini
2023-05-17 17:44 ` [PULL 33/68] configure: create a python venv unconditionally Paolo Bonzini
2023-05-17 17:44 ` [PULL 34/68] python/wheels: add vendored meson package Paolo Bonzini
2023-05-17 17:44 ` [PULL 35/68] configure: use 'mkvenv ensure meson' to bootstrap meson Paolo Bonzini
2023-05-17 17:44 ` [PULL 36/68] qemu.git: drop meson git submodule Paolo Bonzini
2023-05-17 17:44 ` [PULL 37/68] tests: Use configure-provided pyvenv for tests Paolo Bonzini
2023-05-17 17:44 ` [PULL 38/68] configure: move --enable-docs and --disable-docs back to configure Paolo Bonzini
2023-05-17 17:44 ` [PULL 39/68] configure: bootstrap sphinx with mkvenv Paolo Bonzini
2023-05-17 17:44 ` [PULL 40/68] configure: add --enable-pypi and --disable-pypi Paolo Bonzini
2023-05-17 17:44 ` [PULL 41/68] Python: Drop support for Python 3.6 Paolo Bonzini
2023-05-17 17:44 ` [PULL 42/68] configure: Add courtesy hint to Python version failure message Paolo Bonzini
2023-05-17 17:44 ` [PULL 43/68] mkvenv: mark command as required Paolo Bonzini
2023-05-17 17:44 ` [PULL 44/68] python: bump some of the dependencies Paolo Bonzini
2023-05-17 17:44 ` [PULL 45/68] meson: regenerate meson-buildoptions.sh Paolo Bonzini
2023-05-17 17:44 ` [PULL 46/68] meson: require 0.63.0 Paolo Bonzini
2023-05-17 17:44 ` [PULL 47/68] meson: use prefer_static option Paolo Bonzini
2023-05-17 17:45 ` [PULL 48/68] meson: remove static_kwargs Paolo Bonzini
2023-05-17 17:45 ` [PULL 49/68] meson: add more version numbers to the summary Paolo Bonzini
2023-05-17 17:45 ` [PULL 50/68] meson: drop unnecessary declare_dependency() Paolo Bonzini
2023-05-17 17:45 ` Paolo Bonzini [this message]
2023-05-17 17:45 ` [PULL 52/68] configure: remove pkg-config functions Paolo Bonzini
2023-05-17 17:45 ` [PULL 53/68] configure, meson: move --enable-modules to Meson Paolo Bonzini
2023-05-17 17:45 ` [PULL 54/68] meson: prepare move of QEMU_CFLAGS to meson Paolo Bonzini
2023-05-17 17:45 ` [PULL 55/68] build: move sanitizer tests " Paolo Bonzini
2023-05-17 17:45 ` [PULL 56/68] build: move SafeStack " Paolo Bonzini
2023-05-17 17:45 ` [PULL 57/68] build: move coroutine backend selection " Paolo Bonzini
2023-05-17 17:45 ` [PULL 58/68] build: move stack protector flag " Paolo Bonzini
2023-05-17 17:45 ` [PULL 59/68] build: move warning " Paolo Bonzini
2023-05-17 17:45 ` [PULL 60/68] build: move remaining compiler flag tests " Paolo Bonzini
2023-05-17 17:45 ` [PULL 61/68] build: move compiler version check " Paolo Bonzini
2023-05-17 17:45 ` [PULL 62/68] build: move --disable-debug-info " Paolo Bonzini
2023-05-17 17:45 ` [PULL 63/68] configure: remove compiler sanity check Paolo Bonzini
2023-05-17 18:48 ` Peter Maydell
2023-05-18 4:57 ` Paolo Bonzini
2023-05-17 17:45 ` [PULL 64/68] configure: do not rerun the tests with -Werror Paolo Bonzini
2023-05-17 17:45 ` [PULL 65/68] configure: remove unnecessary mkdir Paolo Bonzini
2023-05-17 17:45 ` [PULL 66/68] configure: reorder option parsing code Paolo Bonzini
2023-05-17 17:45 ` [PULL 67/68] configure: remove unnecessary check Paolo Bonzini
2023-05-17 17:45 ` [PULL 68/68] docs/devel: update build system docs Paolo Bonzini
2023-05-17 20:31 ` [PULL 00/68] i386, build system, KVM changes for 2023-05-18 Richard Henderson
2023-05-18 5:09 ` Paolo Bonzini
2023-05-18 9:22 ` Peter Maydell
2023-05-18 9:52 ` Paolo Bonzini
2023-05-18 11:35 ` Paolo Bonzini
2023-05-18 13:04 ` Richard Henderson
2023-05-19 3:06 ` Yang Zhong
2023-05-19 8:29 ` Paolo Bonzini
2023-05-22 9:11 ` Yang Zhong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230517174520.887405-52-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).