build: move glib detection and workarounds to meson
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>
diff --git a/meson.build b/meson.build
index 5678551..a28e78c 100644
--- a/meson.build
+++ b/meson.build
@@ -492,23 +492,79 @@
# 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 @@
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
@@ -1967,6 +2023,7 @@
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>'))
@@ -3055,7 +3112,6 @@
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')
@@ -3677,7 +3733,7 @@
'@OUTPUT@',
get_option('prefix'),
meson.current_source_dir(),
- config_host['GLIB_BINDIR'],
+ glib_pc.get_variable('bindir'),
host_machine.cpu(),
'--',
'-DDISPLAYVERSION=' + meson.project_version(),