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>
This commit is contained in:
parent
5328353c05
commit
fc9a809e0d
|
@ -231,7 +231,6 @@ safe_stack=""
|
||||||
use_containers="yes"
|
use_containers="yes"
|
||||||
gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
|
gdb_bin=$(command -v "gdb-multiarch" || command -v "gdb")
|
||||||
gdb_arches=""
|
gdb_arches=""
|
||||||
glib_has_gslice="no"
|
|
||||||
|
|
||||||
if test -e "$source_path/.git"
|
if test -e "$source_path/.git"
|
||||||
then
|
then
|
||||||
|
@ -1509,95 +1508,6 @@ if ! has "$pkg_config_exe"; then
|
||||||
error_exit "pkg-config binary '$pkg_config_exe' not found"
|
error_exit "pkg-config binary '$pkg_config_exe' not found"
|
||||||
fi
|
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
|
# fdt probe
|
||||||
|
|
||||||
|
@ -2454,16 +2364,10 @@ echo "PYTHON=$python" >> $config_host_mak
|
||||||
echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
|
echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
|
||||||
echo "MESON=$meson" >> $config_host_mak
|
echo "MESON=$meson" >> $config_host_mak
|
||||||
echo "NINJA=$ninja" >> $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 "CC=$cc" >> $config_host_mak
|
||||||
echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
|
echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
|
||||||
echo "QEMU_OBJCFLAGS=$QEMU_OBJCFLAGS" >> $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 "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
|
||||||
echo "EXESUF=$EXESUF" >> $config_host_mak
|
echo "EXESUF=$EXESUF" >> $config_host_mak
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
# This Makefile example is fairly independent from the main makefile
|
# This Makefile example is fairly independent from the main makefile
|
||||||
# so users can take and adapt it for their build. We only really
|
# 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
|
# 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)/../..
|
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
|
# The main QEMU uses Glib extensively so it's perfectly fine to use it
|
||||||
# in plugins (which many example do).
|
# 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 += -fPIC -Wall $(filter -W%, $(QEMU_CFLAGS))
|
||||||
CFLAGS += $(if $(findstring no-psabi,$(QEMU_CFLAGS)),-Wpsabi)
|
CFLAGS += $(if $(findstring no-psabi,$(QEMU_CFLAGS)),-Wpsabi)
|
||||||
CFLAGS += $(if $(CONFIG_DEBUG_TCG), -ggdb -O0)
|
CFLAGS += $(if $(CONFIG_DEBUG_TCG), -ggdb -O0)
|
||||||
|
|
92
meson.build
92
meson.build
|
@ -492,23 +492,79 @@ endif
|
||||||
# Dependencies #
|
# Dependencies #
|
||||||
################
|
################
|
||||||
|
|
||||||
# The path to glib.h is added to all compilation commands. This was
|
# When bumping glib minimum version, please check also whether to increase
|
||||||
# grandfathered in from the QEMU Makefiles.
|
# the _WIN32_WINNT setting in osdep.h according to the value from glib
|
||||||
add_project_arguments(config_host['GLIB_CFLAGS'].split(),
|
glib_req_ver = '>=2.56.0'
|
||||||
native: false, language: all_languages)
|
glib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
|
||||||
glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
|
method: 'pkg-config')
|
||||||
link_args: config_host['GLIB_LIBS'].split(),
|
glib_cflags = []
|
||||||
version: config_host['GLIB_VERSION'],
|
if config_host.has_key('CONFIG_MODULES')
|
||||||
variables: {
|
gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
|
||||||
'bindir': config_host['GLIB_BINDIR'],
|
method: 'pkg-config')
|
||||||
})
|
elif config_host.has_key('CONFIG_PLUGIN')
|
||||||
# override glib dep with the configure results (for subprojects)
|
gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
|
||||||
meson.override_dependency('glib-2.0', glib)
|
method: 'pkg-config')
|
||||||
# pass down whether Glib has the slice allocator
|
else
|
||||||
if config_host.has_key('HAVE_GLIB_WITH_SLICE_ALLOCATOR')
|
gmodule = not_found
|
||||||
config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', true)
|
|
||||||
endif
|
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
|
gio = not_found
|
||||||
gdbus_codegen = not_found
|
gdbus_codegen = not_found
|
||||||
gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
|
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) {
|
int main(void) {
|
||||||
iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
|
iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
|
||||||
return conv != (iconv_t) -1;
|
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)
|
iconv = declare_dependency(link_args: link_args, dependencies: glib)
|
||||||
break
|
break
|
||||||
endif
|
endif
|
||||||
|
@ -1967,6 +2023,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('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_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
|
||||||
config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
|
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_OPENPTY', cc.has_function('openpty', dependencies: util))
|
||||||
config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
|
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>'))
|
config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
|
||||||
|
@ -3055,7 +3112,6 @@ subdir('ui')
|
||||||
subdir('hw')
|
subdir('hw')
|
||||||
subdir('gdbstub')
|
subdir('gdbstub')
|
||||||
|
|
||||||
|
|
||||||
if enable_modules
|
if enable_modules
|
||||||
libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
|
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')
|
modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
|
||||||
|
@ -3677,7 +3733,7 @@ if host_machine.system() == 'windows'
|
||||||
'@OUTPUT@',
|
'@OUTPUT@',
|
||||||
get_option('prefix'),
|
get_option('prefix'),
|
||||||
meson.current_source_dir(),
|
meson.current_source_dir(),
|
||||||
config_host['GLIB_BINDIR'],
|
glib_pc.get_variable('bindir'),
|
||||||
host_machine.cpu(),
|
host_machine.cpu(),
|
||||||
'--',
|
'--',
|
||||||
'-DDISPLAYVERSION=' + meson.project_version(),
|
'-DDISPLAYVERSION=' + meson.project_version(),
|
||||||
|
|
|
@ -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: files('qemu-thread-win32.c'))
|
||||||
util_ss.add(when: 'CONFIG_WIN32', if_true: winmm)
|
util_ss.add(when: 'CONFIG_WIN32', if_true: winmm)
|
||||||
util_ss.add(when: 'CONFIG_WIN32', if_true: pathcch)
|
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('envlist.c', 'path.c', 'module.c'))
|
||||||
util_ss.add(files('host-utils.c'))
|
util_ss.add(files('host-utils.c'))
|
||||||
util_ss.add(files('bitmap.c', 'bitops.c'))
|
util_ss.add(files('bitmap.c', 'bitops.c'))
|
||||||
|
|
Loading…
Reference in New Issue