* Meson conversions + introspection-based command line parser

-----BEGIN PGP SIGNATURE-----
 
 iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmFn4ZoUHHBib256aW5p
 QHJlZGhhdC5jb20ACgkQv/vSX3jHroPaLgf+Lt95rOLXIdfdTIk/aND8BvneLT+M
 ARA/ARKJt5VYqEQDHejtzYaeyUyd+gpT8PtTWTLtEmzqRcpQ+cmvVYsieoLqvCMG
 soYeR6btwMIzaZip9BRFsor2veYiPpKK69aVGOlkBNTHA2dbUD2Pie1AB6rawZgk
 36PJKopoZ+jPVQmAyNm0kPP5LJe+nzjSBiD/TTUREv5Ed4drAaHhdKJHYeCfh5vI
 nBe+cK4GtZ88NSJmjWYT545z0kN6N1aa2y/fLl2uq6TSKoQaqg5Da9Qlh4wu0ej9
 LPlOP/6JetBTiA/4C9u1vBDsxaDxvKgtrJLzX8MUUbeGL3QAiQKLmrjcsQ==
 =Amz9
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging

* Meson conversions + introspection-based command line parser

# gpg: Signature made Thu 14 Oct 2021 12:51:54 AM PDT
# gpg:                using RSA key F13338574B662389866C7682BFFBD25F78C7AE83
# gpg:                issuer "pbonzini@redhat.com"
# gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full]
# gpg:                 aka "Paolo Bonzini <pbonzini@redhat.com>" [full]

* remotes/bonzini/tags/for-upstream: (26 commits)
  configure: automatically parse command line for meson -D options
  meson-buildoptions: include list of tracing backends
  configure: prepare for auto-generated option parsing
  configure: accept "internal" for --enable-capstone/slirp/fdt
  configure: remove deprecated --{enable, disable}-git-update
  configure, meson: move more compiler checks to Meson
  configure: remove obsolete Solaris ar check
  configure, meson: move Spice configure handling to meson
  configure, meson: move netmap detection to meson
  configure, meson: move vde detection to meson
  configure, meson: move libaio check to meson.build
  configure, meson: move pthread_setname_np checks to Meson
  configure, meson: move remaining HAVE_* compiler tests to Meson
  meson: HAVE_GDB_BIN is not used by C code
  configure, meson: remove CONFIG_GCOV from config-host.mak
  configure, meson: get HOST_WORDS_BIGENDIAN via the machine object
  configure, meson: move CONFIG_HOST_DSOSUF to Meson
  trace: move configuration from configure to Meson
  trace: simple: pass trace_file unmodified to config-host.h
  configure, meson: move fuzzing configuration to Meson
  ...

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2021-10-14 10:49:38 -07:00
commit 4d1a525dfa
23 changed files with 1041 additions and 1365 deletions

View File

@ -41,3 +41,7 @@ config PVRDMA
config MULTIPROCESS_ALLOWED config MULTIPROCESS_ALLOWED
bool bool
imply MULTIPROCESS imply MULTIPROCESS
config FUZZ
bool
select SPARSE_MEM

View File

@ -87,7 +87,7 @@ x := $(shell rm -rf meson-private meson-info meson-logs)
endif endif
# 1. ensure config-host.mak is up-to-date # 1. ensure config-host.mak is up-to-date
config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/pc-bios $(SRC_PATH)/VERSION config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/scripts/meson-buildoptions.sh $(SRC_PATH)/pc-bios $(SRC_PATH)/VERSION
@echo config-host.mak is out-of-date, running configure @echo config-host.mak is out-of-date, running configure
@if test -f meson-private/coredata.dat; then \ @if test -f meson-private/coredata.dat; then \
./config.status --skip-meson; \ ./config.status --skip-meson; \
@ -124,6 +124,12 @@ ifneq ($(MESON),)
Makefile.mtest: build.ninja scripts/mtest2make.py Makefile.mtest: build.ninja scripts/mtest2make.py
$(MESON) introspect --targets --tests --benchmarks | $(PYTHON) scripts/mtest2make.py > $@ $(MESON) introspect --targets --tests --benchmarks | $(PYTHON) scripts/mtest2make.py > $@
-include Makefile.mtest -include Makefile.mtest
.PHONY: update-buildoptions
all update-buildoptions: $(SRC_PATH)/scripts/meson-buildoptions.sh
$(SRC_PATH)/scripts/meson-buildoptions.sh: $(SRC_PATH)/meson_options.txt
$(MESON) introspect --buildoptions $(SRC_PATH)/meson.build | $(PYTHON) \
scripts/meson-buildoptions.py > $@.tmp && mv $@.tmp $@
endif endif
# 4. Rules to bridge to other makefiles # 4. Rules to bridge to other makefiles

View File

@ -7,23 +7,22 @@ softmmu_ss.add(files(
'wavcapture.c', 'wavcapture.c',
)) ))
softmmu_ss.add(when: [coreaudio, 'CONFIG_AUDIO_COREAUDIO'], if_true: files('coreaudio.c')) softmmu_ss.add(when: coreaudio, if_true: files('coreaudio.c'))
softmmu_ss.add(when: [dsound, 'CONFIG_AUDIO_DSOUND'], if_true: files('dsoundaudio.c')) softmmu_ss.add(when: dsound, if_true: files('dsoundaudio.c', 'audio_win_int.c'))
softmmu_ss.add(when: ['CONFIG_AUDIO_WIN_INT'], if_true: files('audio_win_int.c'))
audio_modules = {} audio_modules = {}
foreach m : [ foreach m : [
['CONFIG_AUDIO_ALSA', 'alsa', alsa, 'alsaaudio.c'], ['alsa', alsa, files('alsaaudio.c')],
['CONFIG_AUDIO_OSS', 'oss', oss, 'ossaudio.c'], ['oss', oss, files('ossaudio.c')],
['CONFIG_AUDIO_PA', 'pa', pulse, 'paaudio.c'], ['pa', pulse, files('paaudio.c')],
['CONFIG_AUDIO_SDL', 'sdl', sdl, 'sdlaudio.c'], ['sdl', sdl, files('sdlaudio.c')],
['CONFIG_AUDIO_JACK', 'jack', jack, 'jackaudio.c'], ['jack', jack, files('jackaudio.c')],
['CONFIG_SPICE', 'spice', spice, 'spiceaudio.c'] ['spice', spice, files('spiceaudio.c')]
] ]
if config_host.has_key(m[0]) if m[1].found()
module_ss = ss.source_set() module_ss = ss.source_set()
module_ss.add(when: m[2], if_true: files(m[3])) module_ss.add(m[1], m[2])
audio_modules += {m[1] : module_ss} audio_modules += {m[0] : module_ss}
endif endif
endforeach endforeach

View File

@ -65,7 +65,7 @@ block_ss.add(when: 'CONFIG_POSIX', if_true: [files('file-posix.c'), coref, iokit
block_ss.add(when: libiscsi, if_true: files('iscsi-opts.c')) block_ss.add(when: libiscsi, if_true: files('iscsi-opts.c'))
block_ss.add(when: 'CONFIG_LINUX', if_true: files('nvme.c')) block_ss.add(when: 'CONFIG_LINUX', if_true: files('nvme.c'))
block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c')) block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
block_ss.add(when: ['CONFIG_LINUX_AIO', libaio], if_true: files('linux-aio.c')) block_ss.add(when: libaio, if_true: files('linux-aio.c'))
block_ss.add(when: linux_io_uring, if_true: files('io_uring.c')) block_ss.add(when: linux_io_uring, if_true: files('io_uring.c'))
block_modules = {} block_modules = {}

View File

@ -35,7 +35,7 @@ if brlapi.found()
chardev_modules += { 'baum': module_ss } chardev_modules += { 'baum': module_ss }
endif endif
if config_host.has_key('CONFIG_SPICE') if spice.found()
module_ss = ss.source_set() module_ss = ss.source_set()
module_ss.add(when: [spice], if_true: files('spice.c')) module_ss.add(when: [spice], if_true: files('spice.c'))
chardev_modules += { 'spice': module_ss } chardev_modules += { 'spice': module_ss }

1271
configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -42,73 +42,21 @@ perform a build:
../configure ../configure
make make
For now, checks on the compilation environment are found in configure The configure script automatically recognizes
rather than meson.build, though this is expected to change. The command command line options for which a same-named Meson option exists;
line is parsed in the configure script and, whenever needed, converted dashes in the command line are replaced with underscores.
into the appropriate options to Meson.
New checks should be added to Meson, which usually comprises the
following tasks:
- Add a Meson build option to meson_options.txt.
- Add support to the command line arg parser to handle any new
``--enable-XXX``/``--disable-XXX`` flags required by the feature.
- Add information to the help output message to report on the new
feature flag.
- Add code to perform the actual feature check.
- Add code to include the feature status in ``config-host.h``
- Add code to print out the feature status in the configure summary
upon completion.
Taking the probe for SDL2_Image as an example, we have the following pieces
in configure::
# Initial variable state
sdl_image=auto
..snip..
# Configure flag processing
--disable-sdl-image) sdl_image=disabled
;;
--enable-sdl-image) sdl_image=enabled
;;
..snip..
# Help output feature message
sdl-image SDL Image support for icons
..snip..
# Meson invocation
-Dsdl_image=$sdl_image
In meson_options.txt::
option('sdl', type : 'feature', value : 'auto',
description: 'SDL Image support for icons')
In meson.build::
# Detect dependency
sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
method: 'pkg-config',
kwargs: static_kwargs)
# Create config-host.h (if applicable)
config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
# Summary
summary_info += {'SDL image support': sdl_image.found()}
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.
Helper functions Helper functions
---------------- ----------------
@ -335,6 +283,60 @@ new target, or enabling new devices or hardware for a particular
system/userspace emulation target system/userspace emulation target
Adding checks
-------------
New checks should be added to Meson. Compiler checks can be as simple as
the following::
config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
A more complex task such as adding a new dependency usually
comprises the following tasks:
- Add a Meson build option to meson_options.txt.
- Add code to perform the actual feature check.
- Add code to include the feature status in `config-host.h`
- Add code to print out the feature status in the configure summary
upon completion.
Taking the probe for SDL2_Image as an example, we have the following
in ``meson_options.txt``::
option('sdl_image', type : 'feature', value : 'auto',
description: 'SDL Image support for icons')
Unless the option was given a non-``auto`` value (on the configure
command line), the detection code must be performed only if the
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)
endif
This avoids warnings on static builds of user-mode emulators, for example.
Most of the libraries used by system-mode emulators are not available for
static linking.
The other supporting code is generally simple::
# Create config-host.h (if applicable)
config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
# Summary
summary_info += {'SDL image support': sdl_image.found()}
For the configure script to parse the new option, the
``scripts/meson-buildoptions.sh`` file must be up-to-date; ``make
update-buildoptions`` (or just `make`) will take care of updating it.
Support scripts Support scripts
--------------- ---------------

View File

@ -57,7 +57,7 @@ if build_docs
'qemu-nbd.8': (have_tools ? 'man8' : ''), 'qemu-nbd.8': (have_tools ? 'man8' : ''),
'qemu-pr-helper.8': (have_tools ? 'man8' : ''), 'qemu-pr-helper.8': (have_tools ? 'man8' : ''),
'qemu-storage-daemon.1': (have_tools ? 'man1' : ''), 'qemu-storage-daemon.1': (have_tools ? 'man1' : ''),
'qemu-trace-stap.1': (config_host.has_key('CONFIG_TRACE_SYSTEMTAP') ? 'man1' : ''), 'qemu-trace-stap.1': (stap.found() ? 'man1' : ''),
'virtfs-proxy-helper.1': (have_virtfs_proxy_helper ? 'man1' : ''), 'virtfs-proxy-helper.1': (have_virtfs_proxy_helper ? 'man1' : ''),
'virtiofsd.1': (have_virtiofsd ? 'man1' : ''), 'virtiofsd.1': (have_virtiofsd ? 'man1' : ''),
'qemu.1': 'man1', 'qemu.1': 'man1',

View File

@ -8,3 +8,6 @@ config MEM_DEVICE
config NVDIMM config NVDIMM
bool bool
select MEM_DEVICE select MEM_DEVICE
config SPARSE_MEM
bool

View File

@ -6,4 +6,4 @@ mem_ss.add(when: 'CONFIG_NVDIMM', if_true: files('nvdimm.c'))
softmmu_ss.add_all(when: 'CONFIG_MEM_DEVICE', if_true: mem_ss) softmmu_ss.add_all(when: 'CONFIG_MEM_DEVICE', if_true: mem_ss)
softmmu_ss.add(when: 'CONFIG_FUZZ', if_true: files('sparse-mem.c')) softmmu_ss.add(when: 'CONFIG_SPARSE_MEM', if_true: files('sparse-mem.c'))

View File

@ -111,16 +111,59 @@ foreach target : edk2_targets
endif endif
endforeach endforeach
dtrace = not_found
stap = not_found
if 'dtrace' in get_option('trace_backends')
dtrace = find_program('dtrace', required: true)
stap = find_program('stap', required: false)
if stap.found()
# Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
# visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
# instead. QEMU --enable-modules depends on this because the SystemTap
# 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'])
endif
endif
################## ##################
# Compiler flags # # Compiler flags #
################## ##################
# Specify linker-script with add_project_link_arguments so that it is not placed # Specify linker-script with add_project_link_arguments so that it is not placed
# within a linker --start-group/--end-group pair # within a linker --start-group/--end-group pair
if 'CONFIG_FUZZ' in config_host if get_option('fuzzing')
add_project_link_arguments(['-Wl,-T,', add_project_link_arguments(['-Wl,-T,',
(meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')], (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
native: false, language: ['c', 'cpp', 'objc'])
# Specify a filter to only instrument code that is directly related to
# virtual-devices.
configure_file(output: 'instrumentation-filter',
input: 'scripts/oss-fuzz/instrumentation-filter-template',
copy: true)
add_global_arguments(
cc.get_supported_arguments('-fsanitize-coverage-allowlist=instrumentation-filter'),
native: false, language: ['c', 'cpp', 'objc'])
if get_option('fuzzing_engine') == ''
# Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
# 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: ['c', 'cpp', 'objc'])
add_global_link_arguments('-fsanitize=fuzzer-no-link',
native: false, language: ['c', 'cpp', 'objc']) native: false, language: ['c', 'cpp', 'objc'])
# 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']
else
# LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
# the needed CFLAGS have already been provided
fuzz_exe_ldflags = get_option('fuzzing_engine').split()
endif
endif endif
add_global_arguments(config_host['QEMU_CFLAGS'].split(), add_global_arguments(config_host['QEMU_CFLAGS'].split(),
@ -163,6 +206,30 @@ endif
# Target-specific checks and dependencies # # Target-specific checks and dependencies #
########################################### ###########################################
if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
not cc.links('''
#include <stdint.h>
#include <sys/types.h>
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
''',
args: ['-Werror', '-fsanitize=fuzzer'])
error('Your compiler does not support -fsanitize=fuzzer')
endif
if 'ftrace' in get_option('trace_backends') and targetos != 'linux'
error('ftrace is supported only on Linux')
endif
if 'syslog' in get_option('trace_backends') and not cc.compiles('''
#include <syslog.h>
int main(void) {
openlog("qemu", LOG_PID, LOG_DAEMON);
syslog(LOG_INFO, "configure");
return 0;
}''')
error('syslog is not supported on this system')
endif
if targetos != 'linux' and get_option('mpath').enabled() if targetos != 'linux' and get_option('mpath').enabled()
error('Multipath is supported only on Linux') error('Multipath is supported only on Linux')
endif endif
@ -183,6 +250,7 @@ iokit = []
emulator_link_args = [] emulator_link_args = []
nvmm =not_found nvmm =not_found
hvf = not_found hvf = not_found
host_dsosuf = '.so'
if targetos == 'windows' if targetos == 'windows'
socket = cc.find_library('ws2_32') socket = cc.find_library('ws2_32')
winmm = cc.find_library('winmm') winmm = cc.find_library('winmm')
@ -191,9 +259,11 @@ if targetos == 'windows'
version_res = win.compile_resources('version.rc', version_res = win.compile_resources('version.rc',
depend_files: files('pc-bios/qemu-nsis.ico'), depend_files: files('pc-bios/qemu-nsis.ico'),
include_directories: include_directories('.')) include_directories: include_directories('.'))
host_dsosuf = '.dll'
elif targetos == 'darwin' elif targetos == 'darwin'
coref = dependency('appleframeworks', modules: 'CoreFoundation') coref = dependency('appleframeworks', modules: 'CoreFoundation')
iokit = dependency('appleframeworks', modules: 'IOKit', required: false) iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
host_dsosuf = '.dylib'
elif targetos == 'sunos' elif targetos == 'sunos'
socket = [cc.find_library('socket'), socket = [cc.find_library('socket'),
cc.find_library('nsl'), cc.find_library('nsl'),
@ -321,17 +391,23 @@ if 'CONFIG_GIO' in config_host
link_args: config_host['GIO_LIBS'].split()) link_args: config_host['GIO_LIBS'].split())
endif endif
lttng = not_found lttng = not_found
if 'CONFIG_TRACE_UST' in config_host if 'ust' in get_option('trace_backends')
lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split()) lttng = dependency('lttng-ust', required: true, method: 'pkg-config',
kwargs: static_kwargs)
endif endif
pixman = not_found pixman = not_found
if have_system or have_tools if have_system or have_tools
pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8', pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
method: 'pkg-config', kwargs: static_kwargs) method: 'pkg-config', kwargs: static_kwargs)
endif endif
libaio = cc.find_library('aio', required: false)
zlib = dependency('zlib', required: true, kwargs: static_kwargs) zlib = dependency('zlib', required: true, kwargs: static_kwargs)
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)
endif
linux_io_uring = not_found linux_io_uring = not_found
if not get_option('linux_io_uring').auto() or have_block if not get_option('linux_io_uring').auto() or have_block
linux_io_uring = dependency('liburing', required: get_option('linux_io_uring'), linux_io_uring = dependency('liburing', required: get_option('linux_io_uring'),
@ -424,35 +500,60 @@ else
xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'), xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
method: 'pkg-config', kwargs: static_kwargs) method: 'pkg-config', kwargs: static_kwargs)
endif endif
vde = not_found vde = not_found
if config_host.has_key('CONFIG_VDE') if not get_option('vde').auto() or have_system or have_tools
vde = declare_dependency(link_args: config_host['VDE_LIBS'].split()) vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
required: get_option('vde'),
kwargs: static_kwargs)
endif endif
if vde.found() and not cc.links('''
#include <libvdeplug.h>
int main(void)
{
struct vde_open_args a = {0, 0, 0};
char s[] = "";
vde_open(s, s, &a);
return 0;
}''', dependencies: vde)
vde = not_found
if get_option('cap_ng').enabled()
error('could not link libvdeplug')
else
warning('could not link libvdeplug, disabling')
endif
endif
pulse = not_found pulse = not_found
if 'CONFIG_LIBPULSE' in config_host if not get_option('pa').auto() or (targetos == 'linux' and have_system)
pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(), pulse = dependency('libpulse', required: get_option('pa'),
link_args: config_host['PULSE_LIBS'].split()) method: 'pkg-config', kwargs: static_kwargs)
endif endif
alsa = not_found alsa = not_found
if 'CONFIG_ALSA' in config_host if not get_option('alsa').auto() or (targetos == 'linux' and have_system)
alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(), alsa = dependency('alsa', required: get_option('alsa'),
link_args: config_host['ALSA_LIBS'].split()) method: 'pkg-config', kwargs: static_kwargs)
endif endif
jack = not_found jack = not_found
if 'CONFIG_LIBJACK' in config_host if not get_option('jack').auto() or have_system
jack = declare_dependency(link_args: config_host['JACK_LIBS'].split()) jack = dependency('jack', required: get_option('jack'),
method: 'pkg-config', kwargs: static_kwargs)
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)
endif endif
spice = not_found spice = not_found
spice_headers = not_found if not get_option('spice').auto() or have_system
spice_protocol = not_found spice = dependency('spice-server', version: '>=0.12.5',
if 'CONFIG_SPICE' in config_host required: get_option('spice'),
spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(), method: 'pkg-config', kwargs: static_kwargs)
link_args: config_host['SPICE_LIBS'].split())
spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
endif
if 'CONFIG_SPICE_PROTOCOL' in config_host
spice_protocol = declare_dependency(compile_args: config_host['SPICE_PROTOCOL_CFLAGS'].split())
endif endif
spice_headers = spice.partial_dependency(compile_args: true, includes: true)
rt = cc.find_library('rt', required: false) rt = cc.find_library('rt', required: false)
libdl = not_found libdl = not_found
if 'CONFIG_PLUGIN' in config_host if 'CONFIG_PLUGIN' in config_host
@ -801,16 +902,59 @@ if liblzfse.found() and not cc.links('''
endif endif
oss = not_found oss = not_found
if 'CONFIG_AUDIO_OSS' in config_host if not get_option('oss').auto() or have_system
oss = declare_dependency(link_args: config_host['OSS_LIBS'].split()) 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)
else
oss = declare_dependency()
endif
if not oss.found()
if get_option('oss').enabled()
error('OSS not found')
else
warning('OSS not found, disabling')
endif
endif
endif endif
dsound = not_found dsound = not_found
if 'CONFIG_AUDIO_DSOUND' in config_host if not get_option('dsound').auto() or (targetos == 'windows' and have_system)
dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split()) if cc.has_header('dsound.h')
dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
endif
if not dsound.found()
if get_option('dsound').enabled()
error('DirectSound not found')
else
warning('DirectSound not found, disabling')
endif
endif
endif endif
coreaudio = not_found coreaudio = not_found
if 'CONFIG_AUDIO_COREAUDIO' in config_host if not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split()) coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
required: get_option('coreaudio'))
if coreaudio.found() and not cc.links('''
#include <CoreAudio/CoreAudio.h>
int main(void)
{
return (int)AudioGetCurrentHostTime();
}''')
coreaudio = not_found
endif
if not coreaudio.found()
if get_option('coreaudio').enabled()
error('CoreAudio not found')
else
warning('CoreAudio not found, disabling')
endif
endif
endif endif
opengl = not_found opengl = not_found
@ -1156,6 +1300,49 @@ if libbpf.found() and not cc.links('''
endif endif
endif endif
#################
# config-host.h #
#################
audio_drivers_selected = []
if have_system
audio_drivers_available = {
'alsa': alsa.found(),
'coreaudio': coreaudio.found(),
'dsound': dsound.found(),
'jack': jack.found(),
'oss': oss.found(),
'pa': pulse.found(),
'sdl': sdl.found(),
}
foreach k, v: audio_drivers_available
config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
endforeach
# Default to native drivers first, OSS second, SDL third
audio_drivers_priority = \
[ 'pa', 'coreaudio', 'dsound', 'oss' ] + \
(targetos == 'linux' ? [] : [ 'sdl' ])
audio_drivers_default = []
foreach k: audio_drivers_priority
if audio_drivers_available[k]
audio_drivers_default += k
endif
endforeach
foreach k: get_option('audio_drv_list')
if k == 'default'
audio_drivers_selected += audio_drivers_default
elif not audio_drivers_available[k]
error('Audio driver "@0@" not available.'.format(k))
else
audio_drivers_selected += k
endif
endforeach
endif
config_host_data.set('CONFIG_AUDIO_DRIVERS',
'"' + '", "'.join(audio_drivers_selected) + '", ')
if get_option('cfi') if get_option('cfi')
cfi_flags=[] cfi_flags=[]
# Check for dependency on LTO # Check for dependency on LTO
@ -1199,10 +1386,6 @@ endif
have_host_block_device = (targetos != 'darwin' or have_host_block_device = (targetos != 'darwin' or
cc.has_header('IOKit/storage/IOMedia.h')) cc.has_header('IOKit/storage/IOMedia.h'))
#################
# config-host.h #
#################
have_virtfs = (targetos == 'linux' and have_virtfs = (targetos == 'linux' and
have_system and have_system and
libattr.found() and libattr.found() and
@ -1224,6 +1407,11 @@ elif get_option('virtfs').disabled()
have_virtfs = false have_virtfs = false
endif endif
foreach k : get_option('trace_backends')
config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
endforeach
config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir')) config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix')) config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir) config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
@ -1240,6 +1428,8 @@ config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_opti
config_host_data.set('CONFIG_ATTR', libattr.found()) config_host_data.set('CONFIG_ATTR', libattr.found())
config_host_data.set('CONFIG_BRLAPI', brlapi.found()) config_host_data.set('CONFIG_BRLAPI', brlapi.found())
config_host_data.set('CONFIG_COCOA', cocoa.found()) config_host_data.set('CONFIG_COCOA', cocoa.found())
config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
config_host_data.set('CONFIG_LIBUDEV', libudev.found()) config_host_data.set('CONFIG_LIBUDEV', libudev.found())
config_host_data.set('CONFIG_LZO', lzo.found()) config_host_data.set('CONFIG_LZO', lzo.found())
config_host_data.set('CONFIG_MPATH', mpathpersist.found()) config_host_data.set('CONFIG_MPATH', mpathpersist.found())
@ -1264,6 +1454,7 @@ config_host_data.set('CONFIG_EBPF', libbpf.found())
config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found()) config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
config_host_data.set('CONFIG_LIBISCSI', libiscsi.found()) config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
config_host_data.set('CONFIG_LIBNFS', libnfs.found()) config_host_data.set('CONFIG_LIBNFS', libnfs.found())
config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found()) config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
config_host_data.set('CONFIG_LIBPMEM', libpmem.found()) config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
config_host_data.set('CONFIG_RBD', rbd.found()) config_host_data.set('CONFIG_RBD', rbd.found())
@ -1272,6 +1463,7 @@ config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
config_host_data.set('CONFIG_SECCOMP', seccomp.found()) config_host_data.set('CONFIG_SECCOMP', seccomp.found())
config_host_data.set('CONFIG_SNAPPY', snappy.found()) config_host_data.set('CONFIG_SNAPPY', snappy.found())
config_host_data.set('CONFIG_USB_LIBUSB', libusb.found()) config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
config_host_data.set('CONFIG_VDE', vde.found())
config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server) config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
config_host_data.set('CONFIG_VNC', vnc.found()) config_host_data.set('CONFIG_VNC', vnc.found())
config_host_data.set('CONFIG_VNC_JPEG', jpeg.found()) config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
@ -1292,6 +1484,8 @@ config_host_data.set('CONFIG_STATX', has_statx)
config_host_data.set('CONFIG_ZSTD', zstd.found()) config_host_data.set('CONFIG_ZSTD', zstd.found())
config_host_data.set('CONFIG_FUSE', fuse.found()) config_host_data.set('CONFIG_FUSE', fuse.found())
config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found()) config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
config_host_data.set('CONFIG_SPICE', spice.found())
config_host_data.set('CONFIG_X11', x11.found()) config_host_data.set('CONFIG_X11', x11.found())
config_host_data.set('CONFIG_CFI', get_option('cfi')) config_host_data.set('CONFIG_CFI', get_option('cfi'))
config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version())) config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
@ -1299,7 +1493,9 @@ config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0]
config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1]) config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2]) config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device) config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
config_host_data.set('HOST_WORDS_BIGENDIAN', host_machine.endian() == 'big')
# has_header # has_header
config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h')) config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
@ -1354,6 +1550,8 @@ config_host_data.set('CONFIG_INOTIFY',
cc.has_header_symbol('sys/inotify.h', 'inotify_init')) cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
config_host_data.set('CONFIG_INOTIFY1', config_host_data.set('CONFIG_INOTIFY1',
cc.has_header_symbol('sys/inotify.h', 'inotify_init1')) cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
config_host_data.set('CONFIG_IOVEC',
cc.has_header_symbol('sys/uio.h', 'struct iovec'))
config_host_data.set('CONFIG_MACHINE_BSWAP_H', config_host_data.set('CONFIG_MACHINE_BSWAP_H',
cc.has_header_symbol('machine/bswap.h', 'bswap32', cc.has_header_symbol('machine/bswap.h', 'bswap32',
prefix: '''#include <sys/endian.h> prefix: '''#include <sys/endian.h>
@ -1419,6 +1617,29 @@ config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
#include <sys/mman.h> #include <sys/mman.h>
#include <stddef.h> #include <stddef.h>
int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }''')) int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links('''
#include <pthread.h>
static void *f(void *p) { return NULL; }
int main(void)
{
pthread_t thread;
pthread_create(&thread, 0, f, 0);
pthread_setname_np(thread, "QEMU");
return 0;
}''', dependencies: threads))
config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links('''
#include <pthread.h>
static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
int main(void)
{
pthread_t thread;
pthread_create(&thread, 0, f, 0);
return 0;
}''', dependencies: threads))
config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + ''' config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
#include <sys/signalfd.h> #include <sys/signalfd.h>
#include <stddef.h> #include <stddef.h>
@ -1436,6 +1657,40 @@ config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
return 0; return 0;
}''')) }'''))
config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
#include <sys/mman.h>
int main(int argc, char *argv[]) {
return mlockall(MCL_FUTURE);
}'''))
have_netmap = false
if not get_option('netmap').disabled() and have_system
have_netmap = cc.compiles('''
#include <inttypes.h>
#include <net/if.h>
#include <net/netmap.h>
#include <net/netmap_user.h>
#if (NETMAP_API < 11) || (NETMAP_API > 15)
#error
#endif
int main(void) { return 0; }''')
if not have_netmap and get_option('netmap').enabled()
error('Netmap headers not available')
endif
endif
config_host_data.set('CONFIG_NETMAP', have_netmap)
# Work around a system header bug with some kernel/XFS header
# versions where they both try to define 'struct fsxattr':
# xfs headers will not try to redefine structs from linux headers
# if this macro is set.
config_host_data.set('HAVE_FSXATTR', cc.links('''
#include <linux/fs.h>'
struct fsxattr foo;
int main(void) {
return 0;
}'''))
# Some versions of Mac OS X incorrectly define SIZE_MAX # Some versions of Mac OS X incorrectly define SIZE_MAX
config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles(''' config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
#include <stdint.h> #include <stdint.h>
@ -1444,10 +1699,52 @@ config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
return printf("%zu", SIZE_MAX); return printf("%zu", SIZE_MAX);
}''', args: ['-Werror'])) }''', args: ['-Werror']))
# See if 64-bit atomic operations are supported.
# Note that without __atomic builtins, we can only
# assume atomic loads/stores max at pointer size.
config_host_data.set('CONFIG_ATOMIC64', cc.links('''
#include <stdint.h>
int main(void)
{
uint64_t x = 0, y = 0;
y = __atomic_load_n(&x, __ATOMIC_RELAXED);
__atomic_store_n(&x, y, __ATOMIC_RELAXED);
__atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
__atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
__atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
return 0;
}'''))
ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST'] #include <sys/auxv.h>
strings = ['HOST_DSOSUF', 'CONFIG_IASL'] int main(void) {
return getauxval(AT_HWCAP) == 0;
}'''))
config_host_data.set('CONFIG_AF_VSOCK', cc.compiles(gnu_source_prefix + '''
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#if !defined(AF_VSOCK)
# error missing AF_VSOCK flag
#endif
#include <linux/vm_sockets.h>
int main(void) {
int sock, ret;
struct sockaddr_vm svm;
socklen_t len = sizeof(svm);
sock = socket(AF_VSOCK, SOCK_STREAM, 0);
ret = getpeername(sock, (struct sockaddr *)&svm, &len);
if ((ret == -1) && (errno == ENOTCONN)) {
return 0;
}
return -1;
}'''))
ignored = ['CONFIG_QEMU_INTERP_PREFIX', # actually per-target
'HAVE_GDB_BIN']
arrays = ['CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
strings = ['CONFIG_IASL']
foreach k, v: config_host foreach k, v: config_host
if ignored.contains(k) if ignored.contains(k)
# do nothing # do nothing
@ -1459,11 +1756,8 @@ foreach k, v: config_host
elif k == 'ARCH' elif k == 'ARCH'
config_host_data.set('HOST_' + v.to_upper(), 1) config_host_data.set('HOST_' + v.to_upper(), 1)
elif strings.contains(k) elif strings.contains(k)
if not k.startswith('CONFIG_')
k = 'CONFIG_' + k.to_upper()
endif
config_host_data.set_quoted(k, v) config_host_data.set_quoted(k, v)
elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_') elif k.startswith('CONFIG_')
config_host_data.set(k, v == 'y' ? 1 : v) config_host_data.set(k, v == 'y' ? 1 : v)
endif endif
endforeach endforeach
@ -1514,8 +1808,9 @@ endif
have_ivshmem = config_host_data.get('CONFIG_EVENTFD') have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
host_kconfig = \ host_kconfig = \
(get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \ ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \ (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
(have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \ (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \ ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
(x11.found() ? ['CONFIG_X11=y'] : []) + \ (x11.found() ? ['CONFIG_X11=y'] : []) + \
@ -1984,7 +2279,7 @@ qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
tracetool = [ tracetool = [
python, files('scripts/tracetool.py'), python, files('scripts/tracetool.py'),
'--backend=' + config_host['TRACE_BACKENDS'] '--backend=' + ','.join(get_option('trace_backends'))
] ]
tracetool_depends = files( tracetool_depends = files(
'scripts/tracetool/backend/log.py', 'scripts/tracetool/backend/log.py',
@ -2638,7 +2933,7 @@ foreach target : target_dirs
'dependencies': [] 'dependencies': []
}] }]
endif endif
if config_host.has_key('CONFIG_FUZZ') if get_option('fuzzing')
specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false) specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
execs += [{ execs += [{
'name': 'qemu-fuzz-' + target_name, 'name': 'qemu-fuzz-' + target_name,
@ -2701,7 +2996,7 @@ foreach target : target_dirs
emulators += {exe['name']: emulator} emulators += {exe['name']: emulator}
endif endif
if 'CONFIG_TRACE_SYSTEMTAP' in config_host if stap.found()
foreach stp: [ foreach stp: [
{'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false}, {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
{'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true}, {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
@ -2878,13 +3173,13 @@ summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
if config_host.has_key('CONFIG_MODULES') if config_host.has_key('CONFIG_MODULES')
summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')} summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
endif endif
summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')} summary_info += {'fuzzing support': get_option('fuzzing')}
if have_system if have_system
summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']} summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
endif endif
summary_info += {'Trace backends': config_host['TRACE_BACKENDS']} summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
if config_host['TRACE_BACKENDS'].split().contains('simple') if 'simple' in get_option('trace_backends')
summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'} summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
endif endif
summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')} summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')} summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
@ -3068,10 +3363,22 @@ if vnc.found()
summary_info += {'VNC JPEG support': jpeg} summary_info += {'VNC JPEG support': jpeg}
summary_info += {'VNC PNG support': png} summary_info += {'VNC PNG support': png}
endif endif
if targetos not in ['darwin', 'haiku', 'windows']
summary_info += {'OSS support': oss}
elif targetos == 'darwin'
summary_info += {'CoreAudio support': coreaudio}
elif targetos == 'windows'
summary_info += {'DirectSound support': dsound}
endif
if targetos == 'linux'
summary_info += {'ALSA support': alsa}
summary_info += {'PulseAudio support': pulse}
endif
summary_info += {'JACK support': jack}
summary_info += {'brlapi support': brlapi} summary_info += {'brlapi support': brlapi}
summary_info += {'vde support': config_host.has_key('CONFIG_VDE')} summary_info += {'vde support': vde}
summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')} summary_info += {'netmap support': have_netmap}
summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')} summary_info += {'Linux AIO support': libaio}
summary_info += {'Linux io_uring support': linux_io_uring} summary_info += {'Linux io_uring support': linux_io_uring}
summary_info += {'ATTR/XATTR support': libattr} summary_info += {'ATTR/XATTR support': libattr}
summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')} summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
@ -3079,8 +3386,10 @@ summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt} summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
summary_info += {'libcap-ng support': libcap_ng} summary_info += {'libcap-ng support': libcap_ng}
summary_info += {'bpf support': libbpf} summary_info += {'bpf support': libbpf}
# TODO: add back protocol and server version summary_info += {'spice protocol support': spice_protocol}
summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')} if spice_protocol.found()
summary_info += {' spice server support': spice}
endif
summary_info += {'rbd support': rbd} summary_info += {'rbd support': rbd}
summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')} summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
summary_info += {'smartcard support': cacard} summary_info += {'smartcard support': cacard}

View File

@ -1,3 +1,7 @@
# These options do not correspond to a --enable/--disable-* option
# on the configure script command line. If you add more, list them in
# scripts/meson-buildoptions.py's SKIP_OPTIONS constant too.
option('qemu_suffix', type : 'string', value: 'qemu', option('qemu_suffix', type : 'string', value: 'qemu',
description: 'Suffix for QEMU data/modules/config directories (can be empty)') description: 'Suffix for QEMU data/modules/config directories (can be empty)')
option('docdir', type : 'string', value : 'doc', option('docdir', type : 'string', value : 'doc',
@ -6,11 +10,24 @@ option('qemu_firmwarepath', type : 'string', value : '',
description: 'search PATH for firmware files') description: 'search PATH for firmware files')
option('sphinx_build', type : 'string', value : '', option('sphinx_build', type : 'string', value : '',
description: 'Use specified sphinx-build [$sphinx_build] for building document (default to be empty)') description: 'Use specified sphinx-build [$sphinx_build] for building document (default to be empty)')
option('default_devices', type : 'boolean', value : true, option('default_devices', type : 'boolean', value : true,
description: 'Include a default selection of devices in emulators') description: 'Include a default selection of devices in emulators')
option('audio_drv_list', type: 'array', value: ['default'],
choices: ['alsa', 'coreaudio', 'default', 'dsound', 'jack', 'oss', 'pa', 'sdl'],
description: 'Set audio driver list')
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')
# Everything else can be set via --enable/--disable-* option
# on the configure script command line. After adding an option
# here make sure to run "make update-buildoptions".
option('docs', type : 'feature', value : 'auto', option('docs', type : 'feature', value : 'auto',
description: 'Documentations build support') description: 'Documentations build support')
option('fuzzing', type : 'boolean', value: false,
description: 'build fuzzing targets')
option('gettext', type : 'feature', value : 'auto', option('gettext', type : 'feature', value : 'auto',
description: 'Localization of the GTK+ user interface') description: 'Localization of the GTK+ user interface')
option('install_blobs', type : 'boolean', value : true, option('install_blobs', type : 'boolean', value : true,
@ -94,6 +111,8 @@ option('libusb', type : 'feature', value : 'auto',
description: 'libusb support for USB passthrough') description: 'libusb support for USB passthrough')
option('libxml2', type : 'feature', value : 'auto', option('libxml2', type : 'feature', value : 'auto',
description: 'libxml2 support for Parallels image format') description: 'libxml2 support for Parallels image format')
option('linux_aio', type : 'feature', value : 'auto',
description: 'Linux AIO support')
option('linux_io_uring', type : 'feature', value : 'auto', option('linux_io_uring', type : 'feature', value : 'auto',
description: 'Linux io_uring support') description: 'Linux io_uring support')
option('lzfse', type : 'feature', value : 'auto', option('lzfse', type : 'feature', value : 'auto',
@ -114,10 +133,18 @@ option('smartcard', type : 'feature', value : 'auto',
description: 'CA smartcard emulation support') description: 'CA smartcard emulation support')
option('snappy', type : 'feature', value : 'auto', option('snappy', type : 'feature', value : 'auto',
description: 'snappy compression support') description: 'snappy compression support')
option('spice', type : 'feature', value : 'auto',
description: 'Spice server support')
option('spice_protocol', type : 'feature', value : 'auto',
description: 'Spice protocol support')
option('u2f', type : 'feature', value : 'auto', option('u2f', type : 'feature', value : 'auto',
description: 'U2F emulation support') description: 'U2F emulation support')
option('usb_redir', type : 'feature', value : 'auto', option('usb_redir', type : 'feature', value : 'auto',
description: 'libusbredir support') description: 'libusbredir support')
option('netmap', type : 'feature', value : 'auto',
description: 'netmap network backend support')
option('vde', type : 'feature', value : 'auto',
description: 'vde network backend support')
option('virglrenderer', type : 'feature', value : 'auto', option('virglrenderer', type : 'feature', value : 'auto',
description: 'virgl rendering support') description: 'virgl rendering support')
option('vnc', type : 'feature', value : 'auto', option('vnc', type : 'feature', value : 'auto',
@ -139,6 +166,23 @@ option('fuse', type: 'feature', value: 'auto',
option('fuse_lseek', type : 'feature', value : 'auto', option('fuse_lseek', type : 'feature', value : 'auto',
description: 'SEEK_HOLE/SEEK_DATA support for FUSE exports') description: 'SEEK_HOLE/SEEK_DATA support for FUSE exports')
option('trace_backends', type: 'array', value: ['log'],
choices: ['dtrace', 'ftrace', 'log', 'nop', 'simple', 'syslog', 'ust'],
description: 'Set available tracing backends')
option('alsa', type: 'feature', value: 'auto',
description: 'ALSA sound support')
option('coreaudio', type: 'feature', value: 'auto',
description: 'CoreAudio sound support')
option('dsound', type: 'feature', value: 'auto',
description: 'DirectSound sound support')
option('jack', type: 'feature', value: 'auto',
description: 'JACK sound support')
option('oss', type: 'feature', value: 'auto',
description: 'OSS sound support')
option('pa', type: 'feature', value: 'auto',
description: 'PulseAudio sound support')
option('vhost_user_blk_server', type: 'feature', value: 'auto', option('vhost_user_blk_server', type: 'feature', value: 'auto',
description: 'build vhost-user-blk server') description: 'build vhost-user-blk server')
option('virtfs', type: 'feature', value: 'auto', option('virtfs', type: 'feature', value: 'auto',

View File

@ -20,8 +20,10 @@ softmmu_ss.add(when: 'CONFIG_TCG', if_true: files('filter-replay.c'))
softmmu_ss.add(when: 'CONFIG_L2TPV3', if_true: files('l2tpv3.c')) softmmu_ss.add(when: 'CONFIG_L2TPV3', if_true: files('l2tpv3.c'))
softmmu_ss.add(when: slirp, if_true: files('slirp.c')) softmmu_ss.add(when: slirp, if_true: files('slirp.c'))
softmmu_ss.add(when: ['CONFIG_VDE', vde], if_true: files('vde.c')) softmmu_ss.add(when: vde, if_true: files('vde.c'))
softmmu_ss.add(when: 'CONFIG_NETMAP', if_true: files('netmap.c')) if have_netmap
softmmu_ss.add(files('netmap.c'))
endif
vhost_user_ss = ss.source_set() vhost_user_ss = ss.source_set()
vhost_user_ss.add(when: 'CONFIG_VIRTIO_NET', if_true: files('vhost-user.c'), if_false: files('vhost-user-stub.c')) vhost_user_ss.add(when: 'CONFIG_VIRTIO_NET', if_true: files('vhost-user.c'), if_false: files('vhost-user-stub.c'))
softmmu_ss.add_all(when: 'CONFIG_VHOST_NET_USER', if_true: vhost_user_ss) softmmu_ss.add_all(when: 'CONFIG_VHOST_NET_USER', if_true: vhost_user_ss)

172
scripts/meson-buildoptions.py Executable file
View File

@ -0,0 +1,172 @@
#! /usr/bin/env python3
# Generate configure command line options handling code, based on Meson's
# user build options introspection data
#
# Copyright (C) 2021 Red Hat, Inc.
#
# Author: Paolo Bonzini <pbonzini@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
import json
import textwrap
import shlex
import sys
SKIP_OPTIONS = {
"audio_drv_list",
"default_devices",
"docdir",
"fuzzing_engine",
"qemu_firmwarepath",
"qemu_suffix",
"sphinx_build",
"trace_file",
}
LINE_WIDTH = 76
# Convert the default value of an option to the string used in
# the help message
def value_to_help(value):
if isinstance(value, list):
return ",".join(value)
if isinstance(value, bool):
return "enabled" if value else "disabled"
return str(value)
def wrap(left, text, indent):
spaces = " " * indent
if len(left) >= indent:
yield left
left = spaces
else:
left = (left + spaces)[0:indent]
yield from textwrap.wrap(
text, width=LINE_WIDTH, initial_indent=left, subsequent_indent=spaces
)
def sh_print(line=""):
print(' printf "%s\\n"', shlex.quote(line))
def help_line(left, opt, indent, long):
right = f'{opt["description"]}'
if long:
value = value_to_help(opt["value"])
if value != "auto":
right += f" [{value}]"
if "choices" in opt and long:
choices = "/".join(sorted(opt["choices"]))
right += f" (choices: {choices})"
for x in wrap(" " + left, right, indent):
sh_print(x)
# Return whether the option (a dictionary) can be used with
# arguments. Booleans can never be used with arguments;
# combos allow an argument only if they accept other values
# than "auto", "enabled", and "disabled".
def allow_arg(opt):
if opt["type"] == "boolean":
return False
if opt["type"] != "combo":
return True
return not (set(opt["choices"]) <= {"auto", "disabled", "enabled"})
def load_options(json):
json = [
x
for x in json
if x["section"] == "user"
and ":" not in x["name"]
and x["name"] not in SKIP_OPTIONS
]
return sorted(json, key=lambda x: x["name"])
def print_help(options):
print("meson_options_help() {")
for opt in options:
key = opt["name"].replace("_", "-")
# The first section includes options that have an arguments,
# and booleans (i.e., only one of enable/disable makes sense)
if opt["type"] == "boolean":
left = f"--disable-{key}" if opt["value"] else f"--enable-{key}"
help_line(left, opt, 27, False)
elif allow_arg(opt):
if opt["type"] == "combo" and "enabled" in opt["choices"]:
left = f"--enable-{key}[=CHOICE]"
else:
left = f"--enable-{key}=CHOICE"
help_line(left, opt, 27, True)
sh_print()
sh_print("Optional features, enabled with --enable-FEATURE and")
sh_print("disabled with --disable-FEATURE, default is enabled if available")
sh_print("(unless built with --without-default-features):")
sh_print()
for opt in options:
key = opt["name"].replace("_", "-")
if opt["type"] != "boolean" and not allow_arg(opt):
help_line(key, opt, 18, False)
print("}")
def print_parse(options):
print("_meson_option_parse() {")
print(" case $1 in")
for opt in options:
key = opt["name"].replace("_", "-")
name = opt["name"]
if opt["type"] == "boolean":
print(f' --enable-{key}) printf "%s" -D{name}=true ;;')
print(f' --disable-{key}) printf "%s" -D{name}=false ;;')
else:
if opt["type"] == "combo" and "enabled" in opt["choices"]:
print(f' --enable-{key}) printf "%s" -D{name}=enabled ;;')
if opt["type"] == "combo" and "disabled" in opt["choices"]:
print(f' --disable-{key}) printf "%s" -D{name}=disabled ;;')
if allow_arg(opt):
print(f' --enable-{key}=*) quote_sh "-D{name}=$2" ;;')
print(" *) return 1 ;;")
print(" esac")
print("}")
def fixup_options(options):
# Meson <= 0.60 does not include the choices in array options, fix that up
for opt in options:
if opt["name"] == "trace_backends":
opt["choices"] = [
"dtrace",
"ftrace",
"log",
"nop",
"simple",
"syslog",
"ust",
]
options = load_options(json.load(sys.stdin))
fixup_options(options)
print("# This file is generated by meson-buildoptions.py, do not edit!")
print_help(options)
print_parse(options)

View File

@ -0,0 +1,270 @@
# This file is generated by meson-buildoptions.py, do not edit!
meson_options_help() {
printf "%s\n" ' --enable-capstone[=CHOICE]'
printf "%s\n" ' Whether and how to find the capstone library'
printf "%s\n" ' (choices: auto/disabled/enabled/internal/system)'
printf "%s\n" ' --enable-cfi Control-Flow Integrity (CFI)'
printf "%s\n" ' --enable-cfi-debug Verbose errors in case of CFI violation'
printf "%s\n" ' --enable-fdt[=CHOICE] Whether and how to find the libfdt library'
printf "%s\n" ' (choices: auto/disabled/enabled/internal/system)'
printf "%s\n" ' --enable-fuzzing build fuzzing targets'
printf "%s\n" ' --disable-install-blobs install provided firmware blobs'
printf "%s\n" ' --enable-malloc=CHOICE choose memory allocator to use [system] (choices:'
printf "%s\n" ' jemalloc/system/tcmalloc)'
printf "%s\n" ' --enable-slirp[=CHOICE] Whether and how to find the slirp library'
printf "%s\n" ' (choices: auto/disabled/enabled/internal/system)'
printf "%s\n" ' --enable-tcg-interpreter TCG with bytecode interpreter (experimental and'
printf "%s\n" ' slow)'
printf "%s\n" ' --enable-trace-backends=CHOICE'
printf "%s\n" ' Set available tracing backends [log] (choices:'
printf "%s\n" ' dtrace/ftrace/log/nop/simple/syslog/ust)'
printf "%s\n" ''
printf "%s\n" 'Optional features, enabled with --enable-FEATURE and'
printf "%s\n" 'disabled with --disable-FEATURE, default is enabled if available'
printf "%s\n" '(unless built with --without-default-features):'
printf "%s\n" ''
printf "%s\n" ' alsa ALSA sound support'
printf "%s\n" ' attr attr/xattr support'
printf "%s\n" ' auth-pam PAM access control'
printf "%s\n" ' bpf eBPF support'
printf "%s\n" ' brlapi brlapi character device driver'
printf "%s\n" ' bzip2 bzip2 support for DMG images'
printf "%s\n" ' cap-ng cap_ng support'
printf "%s\n" ' cocoa Cocoa user interface (macOS only)'
printf "%s\n" ' coreaudio CoreAudio sound support'
printf "%s\n" ' curl CURL block device driver'
printf "%s\n" ' curses curses UI'
printf "%s\n" ' docs Documentations build support'
printf "%s\n" ' dsound DirectSound sound support'
printf "%s\n" ' fuse FUSE block device export'
printf "%s\n" ' fuse-lseek SEEK_HOLE/SEEK_DATA support for FUSE exports'
printf "%s\n" ' gcrypt libgcrypt cryptography support'
printf "%s\n" ' gettext Localization of the GTK+ user interface'
printf "%s\n" ' glusterfs Glusterfs block device driver'
printf "%s\n" ' gnutls GNUTLS cryptography support'
printf "%s\n" ' gtk GTK+ user interface'
printf "%s\n" ' guest-agent-msi Build MSI package for the QEMU Guest Agent'
printf "%s\n" ' hax HAX acceleration support'
printf "%s\n" ' hvf HVF acceleration support'
printf "%s\n" ' iconv Font glyph conversion support'
printf "%s\n" ' jack JACK sound support'
printf "%s\n" ' kvm KVM acceleration support'
printf "%s\n" ' libdaxctl libdaxctl support'
printf "%s\n" ' libiscsi libiscsi userspace initiator'
printf "%s\n" ' libnfs libnfs block device driver'
printf "%s\n" ' libpmem libpmem support'
printf "%s\n" ' libudev Use libudev to enumerate host devices'
printf "%s\n" ' libusb libusb support for USB passthrough'
printf "%s\n" ' libxml2 libxml2 support for Parallels image format'
printf "%s\n" ' linux-aio Linux AIO support'
printf "%s\n" ' linux-io-uring Linux io_uring support'
printf "%s\n" ' lzfse lzfse support for DMG images'
printf "%s\n" ' lzo lzo compression support'
printf "%s\n" ' malloc-trim enable libc malloc_trim() for memory optimization'
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'
printf "%s\n" ' nettle nettle cryptography support'
printf "%s\n" ' nvmm NVMM acceleration support'
printf "%s\n" ' oss OSS sound support'
printf "%s\n" ' pa PulseAudio sound support'
printf "%s\n" ' rbd Ceph block device driver'
printf "%s\n" ' sdl SDL user interface'
printf "%s\n" ' sdl-image SDL Image support for icons'
printf "%s\n" ' seccomp seccomp support'
printf "%s\n" ' smartcard CA smartcard emulation support'
printf "%s\n" ' snappy snappy compression support'
printf "%s\n" ' sparse sparse checker'
printf "%s\n" ' spice Spice server support'
printf "%s\n" ' spice-protocol Spice protocol support'
printf "%s\n" ' tcg TCG support'
printf "%s\n" ' u2f U2F emulation support'
printf "%s\n" ' usb-redir libusbredir support'
printf "%s\n" ' vde vde network backend support'
printf "%s\n" ' vhost-user-blk-server'
printf "%s\n" ' build vhost-user-blk server'
printf "%s\n" ' virglrenderer virgl rendering support'
printf "%s\n" ' virtfs virtio-9p support'
printf "%s\n" ' virtiofsd build virtiofs daemon (virtiofsd)'
printf "%s\n" ' vnc VNC server'
printf "%s\n" ' vnc-jpeg JPEG lossy compression for VNC server'
printf "%s\n" ' vnc-png PNG compression for VNC server'
printf "%s\n" ' vnc-sasl SASL authentication for VNC server'
printf "%s\n" ' vte vte support for the gtk UI'
printf "%s\n" ' whpx WHPX acceleration support'
printf "%s\n" ' xen Xen backend support'
printf "%s\n" ' xen-pci-passthrough'
printf "%s\n" ' Xen PCI passthrough support'
printf "%s\n" ' xkbcommon xkbcommon support'
printf "%s\n" ' zstd zstd compression support'
}
_meson_option_parse() {
case $1 in
--enable-alsa) printf "%s" -Dalsa=enabled ;;
--disable-alsa) printf "%s" -Dalsa=disabled ;;
--enable-attr) printf "%s" -Dattr=enabled ;;
--disable-attr) printf "%s" -Dattr=disabled ;;
--enable-auth-pam) printf "%s" -Dauth_pam=enabled ;;
--disable-auth-pam) printf "%s" -Dauth_pam=disabled ;;
--enable-bpf) printf "%s" -Dbpf=enabled ;;
--disable-bpf) printf "%s" -Dbpf=disabled ;;
--enable-brlapi) printf "%s" -Dbrlapi=enabled ;;
--disable-brlapi) printf "%s" -Dbrlapi=disabled ;;
--enable-bzip2) printf "%s" -Dbzip2=enabled ;;
--disable-bzip2) printf "%s" -Dbzip2=disabled ;;
--enable-cap-ng) printf "%s" -Dcap_ng=enabled ;;
--disable-cap-ng) printf "%s" -Dcap_ng=disabled ;;
--enable-capstone) printf "%s" -Dcapstone=enabled ;;
--disable-capstone) printf "%s" -Dcapstone=disabled ;;
--enable-capstone=*) quote_sh "-Dcapstone=$2" ;;
--enable-cfi) printf "%s" -Dcfi=true ;;
--disable-cfi) printf "%s" -Dcfi=false ;;
--enable-cfi-debug) printf "%s" -Dcfi_debug=true ;;
--disable-cfi-debug) printf "%s" -Dcfi_debug=false ;;
--enable-cocoa) printf "%s" -Dcocoa=enabled ;;
--disable-cocoa) printf "%s" -Dcocoa=disabled ;;
--enable-coreaudio) printf "%s" -Dcoreaudio=enabled ;;
--disable-coreaudio) printf "%s" -Dcoreaudio=disabled ;;
--enable-curl) printf "%s" -Dcurl=enabled ;;
--disable-curl) printf "%s" -Dcurl=disabled ;;
--enable-curses) printf "%s" -Dcurses=enabled ;;
--disable-curses) printf "%s" -Dcurses=disabled ;;
--enable-docs) printf "%s" -Ddocs=enabled ;;
--disable-docs) printf "%s" -Ddocs=disabled ;;
--enable-dsound) printf "%s" -Ddsound=enabled ;;
--disable-dsound) printf "%s" -Ddsound=disabled ;;
--enable-fdt) printf "%s" -Dfdt=enabled ;;
--disable-fdt) printf "%s" -Dfdt=disabled ;;
--enable-fdt=*) quote_sh "-Dfdt=$2" ;;
--enable-fuse) printf "%s" -Dfuse=enabled ;;
--disable-fuse) printf "%s" -Dfuse=disabled ;;
--enable-fuse-lseek) printf "%s" -Dfuse_lseek=enabled ;;
--disable-fuse-lseek) printf "%s" -Dfuse_lseek=disabled ;;
--enable-fuzzing) printf "%s" -Dfuzzing=true ;;
--disable-fuzzing) printf "%s" -Dfuzzing=false ;;
--enable-gcrypt) printf "%s" -Dgcrypt=enabled ;;
--disable-gcrypt) printf "%s" -Dgcrypt=disabled ;;
--enable-gettext) printf "%s" -Dgettext=enabled ;;
--disable-gettext) printf "%s" -Dgettext=disabled ;;
--enable-glusterfs) printf "%s" -Dglusterfs=enabled ;;
--disable-glusterfs) printf "%s" -Dglusterfs=disabled ;;
--enable-gnutls) printf "%s" -Dgnutls=enabled ;;
--disable-gnutls) printf "%s" -Dgnutls=disabled ;;
--enable-gtk) printf "%s" -Dgtk=enabled ;;
--disable-gtk) printf "%s" -Dgtk=disabled ;;
--enable-guest-agent-msi) printf "%s" -Dguest_agent_msi=enabled ;;
--disable-guest-agent-msi) printf "%s" -Dguest_agent_msi=disabled ;;
--enable-hax) printf "%s" -Dhax=enabled ;;
--disable-hax) printf "%s" -Dhax=disabled ;;
--enable-hvf) printf "%s" -Dhvf=enabled ;;
--disable-hvf) printf "%s" -Dhvf=disabled ;;
--enable-iconv) printf "%s" -Diconv=enabled ;;
--disable-iconv) printf "%s" -Diconv=disabled ;;
--enable-install-blobs) printf "%s" -Dinstall_blobs=true ;;
--disable-install-blobs) printf "%s" -Dinstall_blobs=false ;;
--enable-jack) printf "%s" -Djack=enabled ;;
--disable-jack) printf "%s" -Djack=disabled ;;
--enable-kvm) printf "%s" -Dkvm=enabled ;;
--disable-kvm) printf "%s" -Dkvm=disabled ;;
--enable-libdaxctl) printf "%s" -Dlibdaxctl=enabled ;;
--disable-libdaxctl) printf "%s" -Dlibdaxctl=disabled ;;
--enable-libiscsi) printf "%s" -Dlibiscsi=enabled ;;
--disable-libiscsi) printf "%s" -Dlibiscsi=disabled ;;
--enable-libnfs) printf "%s" -Dlibnfs=enabled ;;
--disable-libnfs) printf "%s" -Dlibnfs=disabled ;;
--enable-libpmem) printf "%s" -Dlibpmem=enabled ;;
--disable-libpmem) printf "%s" -Dlibpmem=disabled ;;
--enable-libudev) printf "%s" -Dlibudev=enabled ;;
--disable-libudev) printf "%s" -Dlibudev=disabled ;;
--enable-libusb) printf "%s" -Dlibusb=enabled ;;
--disable-libusb) printf "%s" -Dlibusb=disabled ;;
--enable-libxml2) printf "%s" -Dlibxml2=enabled ;;
--disable-libxml2) printf "%s" -Dlibxml2=disabled ;;
--enable-linux-aio) printf "%s" -Dlinux_aio=enabled ;;
--disable-linux-aio) printf "%s" -Dlinux_aio=disabled ;;
--enable-linux-io-uring) printf "%s" -Dlinux_io_uring=enabled ;;
--disable-linux-io-uring) printf "%s" -Dlinux_io_uring=disabled ;;
--enable-lzfse) printf "%s" -Dlzfse=enabled ;;
--disable-lzfse) printf "%s" -Dlzfse=disabled ;;
--enable-lzo) printf "%s" -Dlzo=enabled ;;
--disable-lzo) printf "%s" -Dlzo=disabled ;;
--enable-malloc=*) quote_sh "-Dmalloc=$2" ;;
--enable-malloc-trim) printf "%s" -Dmalloc_trim=enabled ;;
--disable-malloc-trim) printf "%s" -Dmalloc_trim=disabled ;;
--enable-mpath) printf "%s" -Dmpath=enabled ;;
--disable-mpath) printf "%s" -Dmpath=disabled ;;
--enable-multiprocess) printf "%s" -Dmultiprocess=enabled ;;
--disable-multiprocess) printf "%s" -Dmultiprocess=disabled ;;
--enable-netmap) printf "%s" -Dnetmap=enabled ;;
--disable-netmap) printf "%s" -Dnetmap=disabled ;;
--enable-nettle) printf "%s" -Dnettle=enabled ;;
--disable-nettle) printf "%s" -Dnettle=disabled ;;
--enable-nvmm) printf "%s" -Dnvmm=enabled ;;
--disable-nvmm) printf "%s" -Dnvmm=disabled ;;
--enable-oss) printf "%s" -Doss=enabled ;;
--disable-oss) printf "%s" -Doss=disabled ;;
--enable-pa) printf "%s" -Dpa=enabled ;;
--disable-pa) printf "%s" -Dpa=disabled ;;
--enable-rbd) printf "%s" -Drbd=enabled ;;
--disable-rbd) printf "%s" -Drbd=disabled ;;
--enable-sdl) printf "%s" -Dsdl=enabled ;;
--disable-sdl) printf "%s" -Dsdl=disabled ;;
--enable-sdl-image) printf "%s" -Dsdl_image=enabled ;;
--disable-sdl-image) printf "%s" -Dsdl_image=disabled ;;
--enable-seccomp) printf "%s" -Dseccomp=enabled ;;
--disable-seccomp) printf "%s" -Dseccomp=disabled ;;
--enable-slirp) printf "%s" -Dslirp=enabled ;;
--disable-slirp) printf "%s" -Dslirp=disabled ;;
--enable-slirp=*) quote_sh "-Dslirp=$2" ;;
--enable-smartcard) printf "%s" -Dsmartcard=enabled ;;
--disable-smartcard) printf "%s" -Dsmartcard=disabled ;;
--enable-snappy) printf "%s" -Dsnappy=enabled ;;
--disable-snappy) printf "%s" -Dsnappy=disabled ;;
--enable-sparse) printf "%s" -Dsparse=enabled ;;
--disable-sparse) printf "%s" -Dsparse=disabled ;;
--enable-spice) printf "%s" -Dspice=enabled ;;
--disable-spice) printf "%s" -Dspice=disabled ;;
--enable-spice-protocol) printf "%s" -Dspice_protocol=enabled ;;
--disable-spice-protocol) printf "%s" -Dspice_protocol=disabled ;;
--enable-tcg) printf "%s" -Dtcg=enabled ;;
--disable-tcg) printf "%s" -Dtcg=disabled ;;
--enable-tcg-interpreter) printf "%s" -Dtcg_interpreter=true ;;
--disable-tcg-interpreter) printf "%s" -Dtcg_interpreter=false ;;
--enable-trace-backends=*) quote_sh "-Dtrace_backends=$2" ;;
--enable-u2f) printf "%s" -Du2f=enabled ;;
--disable-u2f) printf "%s" -Du2f=disabled ;;
--enable-usb-redir) printf "%s" -Dusb_redir=enabled ;;
--disable-usb-redir) printf "%s" -Dusb_redir=disabled ;;
--enable-vde) printf "%s" -Dvde=enabled ;;
--disable-vde) printf "%s" -Dvde=disabled ;;
--enable-vhost-user-blk-server) printf "%s" -Dvhost_user_blk_server=enabled ;;
--disable-vhost-user-blk-server) printf "%s" -Dvhost_user_blk_server=disabled ;;
--enable-virglrenderer) printf "%s" -Dvirglrenderer=enabled ;;
--disable-virglrenderer) printf "%s" -Dvirglrenderer=disabled ;;
--enable-virtfs) printf "%s" -Dvirtfs=enabled ;;
--disable-virtfs) printf "%s" -Dvirtfs=disabled ;;
--enable-virtiofsd) printf "%s" -Dvirtiofsd=enabled ;;
--disable-virtiofsd) printf "%s" -Dvirtiofsd=disabled ;;
--enable-vnc) printf "%s" -Dvnc=enabled ;;
--disable-vnc) printf "%s" -Dvnc=disabled ;;
--enable-vnc-jpeg) printf "%s" -Dvnc_jpeg=enabled ;;
--disable-vnc-jpeg) printf "%s" -Dvnc_jpeg=disabled ;;
--enable-vnc-png) printf "%s" -Dvnc_png=enabled ;;
--disable-vnc-png) printf "%s" -Dvnc_png=disabled ;;
--enable-vnc-sasl) printf "%s" -Dvnc_sasl=enabled ;;
--disable-vnc-sasl) printf "%s" -Dvnc_sasl=disabled ;;
--enable-vte) printf "%s" -Dvte=enabled ;;
--disable-vte) printf "%s" -Dvte=disabled ;;
--enable-whpx) printf "%s" -Dwhpx=enabled ;;
--disable-whpx) printf "%s" -Dwhpx=disabled ;;
--enable-xen) printf "%s" -Dxen=enabled ;;
--disable-xen) printf "%s" -Dxen=disabled ;;
--enable-xen-pci-passthrough) printf "%s" -Dxen_pci_passthrough=enabled ;;
--disable-xen-pci-passthrough) printf "%s" -Dxen_pci_passthrough=disabled ;;
--enable-xkbcommon) printf "%s" -Dxkbcommon=enabled ;;
--disable-xkbcommon) printf "%s" -Dxkbcommon=disabled ;;
--enable-zstd) printf "%s" -Dzstd=enabled ;;
--disable-zstd) printf "%s" -Dzstd=disabled ;;
*) return 1 ;;
esac
}

View File

@ -1,3 +1,3 @@
if 'CONFIG_TRACE_SYSTEMTAP' in config_host if stap.found()
install_data('qemu-trace-stap', install_dir: get_option('bindir')) install_data('qemu-trace-stap', install_dir: get_option('bindir'))
endif endif

View File

@ -20,7 +20,9 @@ endif
stub_ss.add(files('iothread-lock.c')) stub_ss.add(files('iothread-lock.c'))
stub_ss.add(files('isa-bus.c')) stub_ss.add(files('isa-bus.c'))
stub_ss.add(files('is-daemonized.c')) stub_ss.add(files('is-daemonized.c'))
stub_ss.add(when: 'CONFIG_LINUX_AIO', if_true: files('linux-aio.c')) if libaio.found()
stub_ss.add(files('linux-aio.c'))
endif
stub_ss.add(files('migr-blocker.c')) stub_ss.add(files('migr-blocker.c'))
stub_ss.add(files('module-opts.c')) stub_ss.add(files('module-opts.c'))
stub_ss.add(files('monitor.c')) stub_ss.add(files('monitor.c'))

View File

@ -1,3 +1,7 @@
if not get_option('fuzzing')
subdir_done()
endif
specific_fuzz_ss.add(files('fuzz.c', 'fork_fuzz.c', 'qos_fuzz.c', specific_fuzz_ss.add(files('fuzz.c', 'fork_fuzz.c', 'qos_fuzz.c',
'qtest_wrappers.c'), qos) 'qtest_wrappers.c'), qos)
@ -9,7 +13,7 @@ specific_fuzz_ss.add(when: 'CONFIG_VIRTIO_BLK', if_true: files('virtio_blk_fuzz.
specific_fuzz_ss.add(files('generic_fuzz.c')) specific_fuzz_ss.add(files('generic_fuzz.c'))
fork_fuzz = declare_dependency( fork_fuzz = declare_dependency(
link_args: config_host['FUZZ_EXE_LDFLAGS'].split() + link_args: fuzz_exe_ldflags +
['-Wl,-wrap,qtest_inb', ['-Wl,-wrap,qtest_inb',
'-Wl,-wrap,qtest_inw', '-Wl,-wrap,qtest_inw',
'-Wl,-wrap,qtest_inl', '-Wl,-wrap,qtest_inl',

View File

@ -2,7 +2,6 @@
specific_ss.add(files('control-target.c')) specific_ss.add(files('control-target.c'))
trace_events_files = [] trace_events_files = []
dtrace = find_program('dtrace', required: 'CONFIG_TRACE_DTRACE' in config_host)
foreach dir : [ '.' ] + trace_events_subdirs foreach dir : [ '.' ] + trace_events_subdirs
trace_events_file = meson.project_source_root() / dir / 'trace-events' trace_events_file = meson.project_source_root() / dir / 'trace-events'
trace_events_files += [ trace_events_file ] trace_events_files += [ trace_events_file ]
@ -21,7 +20,7 @@ foreach dir : [ '.' ] + trace_events_subdirs
input: trace_events_file, input: trace_events_file,
command: [ tracetool, group, '--format=c', '@INPUT@', '@OUTPUT@' ], command: [ tracetool, group, '--format=c', '@INPUT@', '@OUTPUT@' ],
depend_files: tracetool_depends) depend_files: tracetool_depends)
if 'CONFIG_TRACE_UST' in config_host if 'ust' in get_option('trace_backends')
trace_ust_h = custom_target(fmt.format('trace-ust', 'h'), trace_ust_h = custom_target(fmt.format('trace-ust', 'h'),
output: fmt.format('trace-ust', 'h'), output: fmt.format('trace-ust', 'h'),
input: trace_events_file, input: trace_events_file,
@ -31,7 +30,7 @@ foreach dir : [ '.' ] + trace_events_subdirs
genh += trace_ust_h genh += trace_ust_h
endif endif
trace_ss.add(trace_h, trace_c) trace_ss.add(trace_h, trace_c)
if 'CONFIG_TRACE_DTRACE' in config_host if 'dtrace' in get_option('trace_backends')
trace_dtrace = custom_target(fmt.format('trace-dtrace', 'dtrace'), trace_dtrace = custom_target(fmt.format('trace-dtrace', 'dtrace'),
output: fmt.format('trace-dtrace', 'dtrace'), output: fmt.format('trace-dtrace', 'dtrace'),
input: trace_events_file, input: trace_events_file,
@ -76,7 +75,7 @@ foreach d : [
specific_ss.add(when: 'CONFIG_TCG', if_true: gen) specific_ss.add(when: 'CONFIG_TCG', if_true: gen)
endforeach endforeach
if 'CONFIG_TRACE_UST' in config_host if 'ust' in get_option('trace_backends')
trace_ust_all_h = custom_target('trace-ust-all.h', trace_ust_all_h = custom_target('trace-ust-all.h',
output: 'trace-ust-all.h', output: 'trace-ust-all.h',
input: trace_events_files, input: trace_events_files,
@ -91,7 +90,11 @@ if 'CONFIG_TRACE_UST' in config_host
genh += trace_ust_all_h genh += trace_ust_all_h
endif endif
trace_ss.add(when: 'CONFIG_TRACE_SIMPLE', if_true: files('simple.c')) if 'simple' in get_option('trace_backends')
trace_ss.add(when: 'CONFIG_TRACE_FTRACE', if_true: files('ftrace.c')) trace_ss.add(files('simple.c'))
endif
if 'ftrace' in get_option('trace_backends')
trace_ss.add(files('ftrace.c'))
endif
trace_ss.add(files('control.c')) trace_ss.add(files('control.c'))
trace_ss.add(files('qmp.c')) trace_ss.add(files('qmp.c'))

View File

@ -364,7 +364,7 @@ void st_set_trace_file(const char *file)
if (!file) { if (!file) {
/* Type cast needed for Windows where getpid() returns an int. */ /* Type cast needed for Windows where getpid() returns an int. */
trace_file_name = g_strdup_printf(CONFIG_TRACE_FILE, (pid_t)getpid()); trace_file_name = g_strdup_printf(CONFIG_TRACE_FILE "-" FMT_pid, (pid_t)getpid());
} else { } else {
trace_file_name = g_strdup_printf("%s", file); trace_file_name = g_strdup_printf("%s", file);
} }

View File

@ -89,7 +89,7 @@ if sdl.found()
ui_modules += {'sdl' : sdl_ss} ui_modules += {'sdl' : sdl_ss}
endif endif
if config_host.has_key('CONFIG_SPICE') if spice.found()
spice_core_ss = ss.source_set() spice_core_ss = ss.source_set()
spice_core_ss.add(spice, pixman, files( spice_core_ss.add(spice, pixman, files(
'spice-core.c', 'spice-core.c',
@ -99,7 +99,7 @@ if config_host.has_key('CONFIG_SPICE')
ui_modules += {'spice-core' : spice_core_ss} ui_modules += {'spice-core' : spice_core_ss}
endif endif
if config_host.has_key('CONFIG_SPICE') and config_host.has_key('CONFIG_GIO') if spice.found() and config_host.has_key('CONFIG_GIO')
spice_ss = ss.source_set() spice_ss = ss.source_set()
spice_ss.add(spice, gio, pixman, files('spice-app.c')) spice_ss.add(spice, gio, pixman, files('spice-app.c'))
ui_modules += {'spice-app': spice_ss} ui_modules += {'spice-app': spice_ss}

View File

@ -1,5 +1,7 @@
util_ss.add(files('osdep.c', 'cutils.c', 'unicode.c', 'qemu-timer-common.c')) util_ss.add(files('osdep.c', 'cutils.c', 'unicode.c', 'qemu-timer-common.c'))
util_ss.add(when: 'CONFIG_ATOMIC64', if_false: files('atomic64.c')) if not config_host_data.get('CONFIG_ATOMIC64')
util_ss.add(files('atomic64.c'))
endif
util_ss.add(when: 'CONFIG_POSIX', if_true: files('aio-posix.c')) util_ss.add(when: 'CONFIG_POSIX', if_true: files('aio-posix.c'))
util_ss.add(when: 'CONFIG_POSIX', if_true: files('fdmon-poll.c')) util_ss.add(when: 'CONFIG_POSIX', if_true: files('fdmon-poll.c'))
if config_host_data.get('CONFIG_EPOLL_CREATE1') if config_host_data.get('CONFIG_EPOLL_CREATE1')

View File

@ -23,7 +23,8 @@ void qemu_thread_naming(bool enable)
{ {
name_threads = enable; name_threads = enable;
#ifndef CONFIG_THREAD_SETNAME_BYTHREAD #if !defined CONFIG_PTHREAD_SETNAME_NP_W_TID && \
!defined CONFIG_PTHREAD_SETNAME_NP_WO_TID
/* This is a debugging option, not fatal */ /* This is a debugging option, not fatal */
if (enable) { if (enable) {
fprintf(stderr, "qemu: thread naming not supported on this host\n"); fprintf(stderr, "qemu: thread naming not supported on this host\n");
@ -522,7 +523,6 @@ static void *qemu_thread_start(void *args)
void *arg = qemu_thread_args->arg; void *arg = qemu_thread_args->arg;
void *r; void *r;
#ifdef CONFIG_THREAD_SETNAME_BYTHREAD
/* Attempt to set the threads name; note that this is for debug, so /* Attempt to set the threads name; note that this is for debug, so
* we're not going to fail if we can't set it. * we're not going to fail if we can't set it.
*/ */
@ -533,7 +533,6 @@ static void *qemu_thread_start(void *args)
pthread_setname_np(qemu_thread_args->name); pthread_setname_np(qemu_thread_args->name);
# endif # endif
} }
#endif
QEMU_TSAN_ANNOTATE_THREAD_NAME(qemu_thread_args->name); QEMU_TSAN_ANNOTATE_THREAD_NAME(qemu_thread_args->name);
g_free(qemu_thread_args->name); g_free(qemu_thread_args->name);
g_free(qemu_thread_args); g_free(qemu_thread_args);