From e781190cda3d8b4e17ac0a6985570a485e164d89 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 09:31:56 -0400 Subject: [PATCH 01/45] qemu-iotests: move check-block back to Makefiles check-block has its own test harness, unlike every other test. If we capture its output, as is in general nicer to do without V=1, there will be no sign of progress. So for lack of a better option just move the invocation of the test back to Makefile rules. As a side effect, this will also fix "make check" in --disable-tools builds, as they were trying to run qemu-iotests without having made qemu-img before. Signed-off-by: Paolo Bonzini --- meson.build | 1 - tests/Makefile.include | 15 ++++++++++++--- tests/qemu-iotests/meson.build | 4 ---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/meson.build b/meson.build index 04e070bb3b..f010e2da17 100644 --- a/meson.build +++ b/meson.build @@ -1102,7 +1102,6 @@ if have_tools dependencies: [block, qemuutil], install: true) qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'), dependencies: [block, qemuutil], install: true) - qemu_block_tools += [qemu_img, qemu_io, qemu_nbd] subdir('storage-daemon') subdir('contrib/rdmacm-mux') diff --git a/tests/Makefile.include b/tests/Makefile.include index 497f1f21ff..5c05e84a9a 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -470,7 +470,6 @@ check-tcg: $(RUN_TCG_TARGET_RULES) .PHONY: clean-tcg clean-tcg: $(CLEAN_TCG_TARGET_RULES) - # Python venv for running tests .PHONY: check-venv check-acceptance @@ -525,8 +524,18 @@ check-acceptance: check-venv $(TESTS_RESULTS_DIR) get-vm-images # Consolidated targets .PHONY: check-block check-unit check check-clean get-vm-images -check-block: -check-build: build-unit +check: + +ifeq ($(CONFIG_TOOLS)$(CONFIG_POSIX),yy) +QEMU_IOTESTS_HELPERS-$(CONFIG_LINUX) = tests/qemu-iotests/socket_scm_helper$(EXESUF) +check: check-block +check-block: $(SRC_PATH)/tests/check-block.sh qemu-img$(EXESUF) \ + qemu-io$(EXESUF) qemu-nbd$(EXESUF) $(QEMU_IOTESTS_HELPERS-y) \ + $(patsubst %-softmmu,qemu-system-%,$(filter %-softmmu,$(TARGET_DIRS))) + @$< +endif + +check-build: build-unit $(QEMU_IOTESTS_HELPERS-y) check-clean: rm -rf $(check-unit-y) tests/*.o tests/*/*.o $(QEMU_IOTESTS_HELPERS-y) diff --git a/tests/qemu-iotests/meson.build b/tests/qemu-iotests/meson.build index 3de09fb8fa..60470936b4 100644 --- a/tests/qemu-iotests/meson.build +++ b/tests/qemu-iotests/meson.build @@ -4,7 +4,3 @@ if 'CONFIG_LINUX' in config_host else socket_scm_helper = [] endif -test('qemu-iotests', sh, args: [files('../check-block.sh')], - depends: [qemu_block_tools, emulators, socket_scm_helper], - suite: 'block', timeout: 10000) - From 555b27a75072d2298a5c37f81df41036b780e181 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 09:58:48 -0400 Subject: [PATCH 02/45] mtest2make: split environment from test command Pass the environment and test command in separate macro arguments, so that we will be able to insert a test driver in the next patch. Signed-off-by: Paolo Bonzini --- scripts/mtest2make.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/scripts/mtest2make.py b/scripts/mtest2make.py index d7a51bf97e..f4ee4d3994 100644 --- a/scripts/mtest2make.py +++ b/scripts/mtest2make.py @@ -19,16 +19,16 @@ class Suite(object): print(''' SPEED = quick -# $1 = test command, $2 = test name -.test-human-tap = $1 < /dev/null | ./scripts/tap-driver.pl --test-name="$2" $(if $(V),,--show-failures-only) -.test-human-exitcode = $1 < /dev/null -.test-tap-tap = $1 < /dev/null | sed "s/^[a-z][a-z]* [0-9]*/& $2/" || true -.test-tap-exitcode = printf "%s\\n" 1..1 "`$1 < /dev/null > /dev/null || echo "not "`ok 1 $2" -.test.print = echo $(if $(V),'$1','Running test $2') >&3 +# $1 = environment, $2 = test command, $3 = test name +.test-human-tap = $1 $2 < /dev/null | ./scripts/tap-driver.pl --test-name="$3" $(if $(V),,--show-failures-only) +.test-human-exitcode = $1 $2 < /dev/null +.test-tap-tap = $1 $2 < /dev/null | sed "s/^[a-z][a-z]* [0-9]*/& $3/" || true +.test-tap-exitcode = printf "%s\\n" 1..1 "`$1 $2 < /dev/null > /dev/null || echo "not "`ok 1 $3" +.test.print = echo $(if $(V),'$1 $2','Running test $3') >&3 .test.env = MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} # $1 = test name, $2 = test target (human or tap) -.test.run = $(call .test.print,$(.test.cmd.$1),$(.test.name.$1)) && $(call .test-$2-$(.test.driver.$1),$(.test.cmd.$1),$(.test.name.$1)) +.test.run = $(call .test.print,$(.test.env.$1),$(.test.cmd.$1),$(.test.name.$1)) && $(call .test-$2-$(.test.driver.$1),$(.test.env.$1),$(.test.cmd.$1),$(.test.name.$1)) define .test.human_k @exec 3>&1; rc=0; $(foreach TEST, $1, $(call .test.run,$(TEST),human) || rc=$$?;) \\ @@ -65,7 +65,7 @@ for test in json.load(sys.stdin): test['cmd'][0] = executable else: test['cmd'][0] = executable - cmd = '$(.test.env) %s %s' % (env, ' '.join((shlex.quote(x) for x in test['cmd']))) + cmd = ' '.join((shlex.quote(x) for x in test['cmd'])) if test['workdir'] is not None: cmd = '(cd %s && %s)' % (shlex.quote(test['workdir']), cmd) driver = test['protocol'] if 'protocol' in test else 'exitcode' @@ -73,6 +73,7 @@ for test in json.load(sys.stdin): i += 1 print('.test.name.%d := %s' % (i, test['name'])) print('.test.driver.%d := %s' % (i, driver)) + print('.test.env.%d := $(.test.env) %s' % (i, env)) print('.test.cmd.%d := %s' % (i, cmd)) test_suites = test['suite'] or ['default'] From 42d729e12c9a03e1140d681a5fdeceb10c4fa548 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 09:58:48 -0400 Subject: [PATCH 03/45] mtest2make: split working directory from test command Pass the working directory and test command in separate macro arguments, so that we will be able to insert a test driver in the next patch. Signed-off-by: Paolo Bonzini --- scripts/mtest2make.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/mtest2make.py b/scripts/mtest2make.py index f4ee4d3994..c709b37f28 100644 --- a/scripts/mtest2make.py +++ b/scripts/mtest2make.py @@ -19,16 +19,16 @@ class Suite(object): print(''' SPEED = quick -# $1 = environment, $2 = test command, $3 = test name -.test-human-tap = $1 $2 < /dev/null | ./scripts/tap-driver.pl --test-name="$3" $(if $(V),,--show-failures-only) -.test-human-exitcode = $1 $2 < /dev/null -.test-tap-tap = $1 $2 < /dev/null | sed "s/^[a-z][a-z]* [0-9]*/& $3/" || true -.test-tap-exitcode = printf "%s\\n" 1..1 "`$1 $2 < /dev/null > /dev/null || echo "not "`ok 1 $3" +# $1 = environment, $2 = test command, $3 = test name, $4 = dir +.test-human-tap = $1 $(if $4,(cd $4 && $2),$2) < /dev/null | ./scripts/tap-driver.pl --test-name="$3" $(if $(V),,--show-failures-only) +.test-human-exitcode = $1 $(if $4,(cd $4 && $2),$2) < /dev/null +.test-tap-tap = $1 $(if $4,(cd $4 && $2),$2) < /dev/null | sed "s/^[a-z][a-z]* [0-9]*/& $3/" || true +.test-tap-exitcode = printf "%s\\n" 1..1 "`$1 $(if $4,(cd $4 && $2),$2) < /dev/null > /dev/null || echo "not "`ok 1 $3" .test.print = echo $(if $(V),'$1 $2','Running test $3') >&3 .test.env = MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} # $1 = test name, $2 = test target (human or tap) -.test.run = $(call .test.print,$(.test.env.$1),$(.test.cmd.$1),$(.test.name.$1)) && $(call .test-$2-$(.test.driver.$1),$(.test.env.$1),$(.test.cmd.$1),$(.test.name.$1)) +.test.run = $(call .test.print,$(.test.env.$1),$(.test.cmd.$1),$(.test.name.$1)) && $(call .test-$2-$(.test.driver.$1),$(.test.env.$1),$(.test.cmd.$1),$(.test.name.$1),$(.test.dir.$1)) define .test.human_k @exec 3>&1; rc=0; $(foreach TEST, $1, $(call .test.run,$(TEST),human) || rc=$$?;) \\ @@ -66,11 +66,11 @@ for test in json.load(sys.stdin): else: test['cmd'][0] = executable cmd = ' '.join((shlex.quote(x) for x in test['cmd'])) - if test['workdir'] is not None: - cmd = '(cd %s && %s)' % (shlex.quote(test['workdir']), cmd) driver = test['protocol'] if 'protocol' in test else 'exitcode' i += 1 + if test['workdir'] is not None: + print('.test.dir.%d := %s' % (i, shlex.quote(test['workdir']))) print('.test.name.%d := %s' % (i, test['name'])) print('.test.driver.%d := %s' % (i, driver)) print('.test.env.%d := $(.test.env) %s' % (i, env)) From d322e84eef850d1e16bca81ac9b6811f13a8d7a7 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 09:14:41 -0400 Subject: [PATCH 04/45] mtest2make: hide output of successful tests The softfloat tests are quite noisy; before the Meson conversion they buffered the output in a file and emitted the output only if the test failed. Tweak mtest2make.py so that the courtesy is extended to all non-TAP tests. Signed-off-by: Paolo Bonzini --- scripts/mtest2make.py | 2 +- scripts/test-driver.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 scripts/test-driver.py diff --git a/scripts/mtest2make.py b/scripts/mtest2make.py index c709b37f28..27425080cf 100644 --- a/scripts/mtest2make.py +++ b/scripts/mtest2make.py @@ -21,7 +21,7 @@ SPEED = quick # $1 = environment, $2 = test command, $3 = test name, $4 = dir .test-human-tap = $1 $(if $4,(cd $4 && $2),$2) < /dev/null | ./scripts/tap-driver.pl --test-name="$3" $(if $(V),,--show-failures-only) -.test-human-exitcode = $1 $(if $4,(cd $4 && $2),$2) < /dev/null +.test-human-exitcode = $1 $(PYTHON) scripts/test-driver.py $(if $4,-C$4) $(if $(V),--verbose) -- $2 < /dev/null .test-tap-tap = $1 $(if $4,(cd $4 && $2),$2) < /dev/null | sed "s/^[a-z][a-z]* [0-9]*/& $3/" || true .test-tap-exitcode = printf "%s\\n" 1..1 "`$1 $(if $4,(cd $4 && $2),$2) < /dev/null > /dev/null || echo "not "`ok 1 $3" .test.print = echo $(if $(V),'$1 $2','Running test $3') >&3 diff --git a/scripts/test-driver.py b/scripts/test-driver.py new file mode 100644 index 0000000000..eef74b29a8 --- /dev/null +++ b/scripts/test-driver.py @@ -0,0 +1,35 @@ +#! /usr/bin/env python3 + +# Wrapper for tests that hides the output if they succeed. +# Used by "make check" +# +# Copyright (C) 2020 Red Hat, Inc. +# +# Author: Paolo Bonzini + +import subprocess +import sys +import os +import argparse + +parser = argparse.ArgumentParser(description='Test driver for QEMU') +parser.add_argument('-C', metavar='DIR', dest='dir', default='.', + help='change to DIR before doing anything else') +parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', + help='be more verbose') +parser.add_argument('test_args', nargs=argparse.REMAINDER) + +args = parser.parse_args() +os.chdir(args.dir) + +test_args = args.test_args +if test_args[0] == '--': + test_args = test_args[1:] + +if args.verbose: + result = subprocess.run(test_args, stdout=None, stderr=None) +else: + result = subprocess.run(test_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + if result.returncode: + sys.stdout.buffer.write(result.stdout) +sys.exit(result.returncode) From 40d9b74eafc9db5d19b92e32932ba915e6e2e664 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 2 Sep 2020 07:19:43 -0400 Subject: [PATCH 05/45] mtest2make: unify tests that appear in multiple suites Whenever a test appears in multiple suites, the rules generated by mtest2make are currently running it twice. Instead, after this patch we generate a phony target for each test and we have a generic "run-tests" target depend on all the tests that were chosen on the command line. Tests that appear in multiple suites will be added to the prerequisites just once. This has other advantages: it removes the handling of -k and it increases parallelism. Signed-off-by: Paolo Bonzini --- scripts/mtest2make.py | 74 ++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/scripts/mtest2make.py b/scripts/mtest2make.py index 27425080cf..af6dd0d3b1 100644 --- a/scripts/mtest2make.py +++ b/scripts/mtest2make.py @@ -24,33 +24,20 @@ SPEED = quick .test-human-exitcode = $1 $(PYTHON) scripts/test-driver.py $(if $4,-C$4) $(if $(V),--verbose) -- $2 < /dev/null .test-tap-tap = $1 $(if $4,(cd $4 && $2),$2) < /dev/null | sed "s/^[a-z][a-z]* [0-9]*/& $3/" || true .test-tap-exitcode = printf "%s\\n" 1..1 "`$1 $(if $4,(cd $4 && $2),$2) < /dev/null > /dev/null || echo "not "`ok 1 $3" -.test.print = echo $(if $(V),'$1 $2','Running test $3') >&3 +.test.human-print = echo $(if $(V),'$1 $2','Running test $3') && .test.env = MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} # $1 = test name, $2 = test target (human or tap) -.test.run = $(call .test.print,$(.test.env.$1),$(.test.cmd.$1),$(.test.name.$1)) && $(call .test-$2-$(.test.driver.$1),$(.test.env.$1),$(.test.cmd.$1),$(.test.name.$1),$(.test.dir.$1)) +.test.run = $(call .test.$2-print,$(.test.env.$1),$(.test.cmd.$1),$(.test.name.$1)) $(call .test-$2-$(.test.driver.$1),$(.test.env.$1),$(.test.cmd.$1),$(.test.name.$1),$(.test.dir.$1)) -define .test.human_k - @exec 3>&1; rc=0; $(foreach TEST, $1, $(call .test.run,$(TEST),human) || rc=$$?;) \\ - exit $$rc -endef -define .test.human_no_k - $(foreach TEST, $1, @exec 3>&1; $(call .test.run,$(TEST),human) -) -endef -.test.human = \\ - $(if $(findstring k, $(MAKEFLAGS)), $(.test.human_k), $(.test.human_no_k)) - -define .test.tap - @exec 3>&1; { $(foreach TEST, $1, $(call .test.run,$(TEST),tap); ) } \\ - | ./scripts/tap-merge.pl | tee "$@" \\ - | ./scripts/tap-driver.pl $(if $(V),, --show-failures-only) -endef +.test.output-format = human ''') -suites = defaultdict(Suite) +introspect = json.load(sys.stdin) i = 0 -for test in json.load(sys.stdin): + +def process_tests(test, suites): + global i env = ' '.join(('%s=%s' % (shlex.quote(k), shlex.quote(v)) for k, v in test['env'].items())) executable = test['cmd'][0] @@ -75,6 +62,9 @@ for test in json.load(sys.stdin): print('.test.driver.%d := %s' % (i, driver)) print('.test.env.%d := $(.test.env) %s' % (i, env)) print('.test.cmd.%d := %s' % (i, cmd)) + print('.PHONY: run-test-%d' % (i,)) + print('run-test-%d: all' % (i,)) + print('\t@$(call .test.run,%d,$(.test.output-format))' % (i,)) test_suites = test['suite'] or ['default'] is_slow = any(s.endswith('-slow') for s in test_suites) @@ -89,22 +79,34 @@ for test in json.load(sys.stdin): suites[s].tests.append(i) suites[s].executables.add(executable) -print('.PHONY: check check-report.tap') -print('check:') -print('check-report.tap:') -print('\t@cat $^ | scripts/tap-merge.pl >$@') -for name, suite in suites.items(): +def emit_prolog(suites, prefix): + all_tap = ' '.join(('%s-report-%s.tap' % (prefix, k) for k in suites.keys())) + print('.PHONY: %s %s-report.tap %s' % (prefix, prefix, all_tap)) + print('%s: run-tests' % (prefix,)) + print('%s-report.tap %s: %s-report%%.tap: all' % (prefix, all_tap, prefix)) + print('''\t$(MAKE) .test.output-format=tap --quiet -Otarget V=1 %s$* | ./scripts/tap-merge.pl | tee "$@" \\ + | ./scripts/tap-driver.pl $(if $(V),, --show-failures-only)''' % (prefix, )) + +def emit_suite(name, suite, prefix): executables = ' '.join(suite.executables) slow_test_numbers = ' '.join((str(x) for x in suite.slow_tests)) test_numbers = ' '.join((str(x) for x in suite.tests)) - print('.test.suite-quick.%s := %s' % (name, test_numbers)) - print('.test.suite-slow.%s := $(.test.suite-quick.%s) %s' % (name, name, slow_test_numbers)) - print('check-build: %s' % executables) - print('.PHONY: check-%s' % name) - print('.PHONY: check-report-%s.tap' % name) - print('check: check-%s' % name) - print('check-%s: all %s' % (name, executables)) - print('\t$(call .test.human, $(.test.suite-$(SPEED).%s))' % (name, )) - print('check-report.tap: check-report-%s.tap' % name) - print('check-report-%s.tap: %s' % (name, executables)) - print('\t$(call .test.tap, $(.test.suite-$(SPEED).%s))' % (name, )) + target = '%s-%s' % (prefix, name) + print('.test.quick.%s := %s' % (target, test_numbers)) + print('.test.slow.%s := $(.test.quick.%s) %s' % (target, target, slow_test_numbers)) + print('%s-build: %s' % (prefix, executables)) + print('.PHONY: %s' % (target, )) + print('.PHONY: %s-report-%s.tap' % (prefix, name)) + print('%s: run-tests' % (target, )) + print('ifneq ($(filter %s %s, $(MAKECMDGOALS)),)' % (target, prefix)) + print('.tests += $(.test.$(SPEED).%s)' % (target, )) + print('endif') + +testsuites = defaultdict(Suite) +for test in introspect: + process_tests(test, testsuites) +emit_prolog(testsuites, 'check') +for name, suite in testsuites.items(): + emit_suite(name, suite, 'check') + +print('run-tests: $(patsubst %, run-test-%, $(.tests))') From 3e0e519026841977c1c00b067af52faa0311133c Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 12:48:00 -0400 Subject: [PATCH 06/45] meson: remove b_lundef option Meson automatically adds "-undefined dynamic_lookup" to shared_module build targets; b_lundef is only needed for executables. Therefore, we can remove this option. Signed-off-by: Paolo Bonzini --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index f010e2da17..c0ba8cd603 100644 --- a/meson.build +++ b/meson.build @@ -1,6 +1,6 @@ project('qemu', ['c'], meson_version: '>=0.55.0', default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', - 'b_lundef=false','b_colorout=auto'], + 'b_colorout=auto'], version: run_command('head', meson.source_root() / 'VERSION').stdout().strip()) not_found = dependency('', required: false) From 58683d07d2590b934cc2688d2b054bfbb7708518 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 2 Sep 2020 07:57:30 -0400 Subject: [PATCH 07/45] configure: do not include absolute paths in -I and -L paths On msys2, paths such as -L/e/path/to/qemu are not recognized by the linker. Fortunately we do not need absolute paths at all in a non-recursive build system. Tested-by: Mark Cave-Ayland Signed-off-by: Paolo Bonzini --- configure | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/configure b/configure index 166193cef9..d8f3bf7bfd 100755 --- a/configure +++ b/configure @@ -944,7 +944,7 @@ Linux) linux="yes" linux_user="yes" kvm="yes" - QEMU_INCLUDES="-isystem ${source_path}/linux-headers -I$PWD/linux-headers $QEMU_INCLUDES" + QEMU_INCLUDES="-isystem ${source_path}/linux-headers -Ilinux-headers $QEMU_INCLUDES" libudev="yes" ;; esac @@ -4266,7 +4266,7 @@ EOF symlink "$source_path/dtc/Makefile" "dtc/Makefile" fi fdt_cflags="-I${source_path}/dtc/libfdt" - fdt_ldflags="-L$PWD/dtc/libfdt" + fdt_ldflags="-Ldtc/libfdt" fdt_libs="$fdt_libs" elif test "$fdt" = "yes" ; then # Not a git build & no libfdt found, prompt for system install @@ -5257,7 +5257,7 @@ case "$capstone" in else LIBCAPSTONE=libcapstone.a fi - capstone_libs="-L$PWD/capstone -lcapstone" + capstone_libs="-Lcapstone -lcapstone" capstone_cflags="-I${source_path}/capstone/include" ;; @@ -6257,8 +6257,8 @@ case "$slirp" in git_submodules="${git_submodules} slirp" fi mkdir -p slirp - slirp_cflags="-I${source_path}/slirp/src -I$PWD/slirp/src" - slirp_libs="-L$PWD/slirp -lslirp" + slirp_cflags="-I${source_path}/slirp/src -Islirp/src" + slirp_libs="-Lslirp -lslirp" if test "$mingw32" = "yes" ; then slirp_libs="$slirp_libs -lws2_32 -liphlpapi" fi From e817851479f80622c70566740ac3cf020eb99f27 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 08:06:28 -0400 Subject: [PATCH 08/45] configure: include cross sdl2-config in meson cross file Signed-off-by: Paolo Bonzini --- configure | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configure b/configure index d8f3bf7bfd..4d0724af31 100755 --- a/configure +++ b/configure @@ -8168,6 +8168,9 @@ echo "ar = $(meson_quote $ar)" >> $cross echo "nm = $(meson_quote $nm)" >> $cross echo "pkgconfig = $(meson_quote $pkg_config_exe)" >> $cross echo "ranlib = $(meson_quote $ranlib)" >> $cross +if has $sdl2_config; then + echo "sdl2-config = $(meson_quote $sdl2_config)" >> $cross +fi echo "strip = $(meson_quote $strip)" >> $cross echo "windres = $(meson_quote $windres)" >> $cross if test -n "$cross_prefix"; then From 8d60f377409bf3570bad4cc27a7fc6b2ca5818f0 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 07:13:16 -0400 Subject: [PATCH 09/45] ninjatool: use constant names for stamp files Numbering files according to rules causes confusion, because CUSTOM_COMMAND3.stamp from a previous build might represent completely different targets after Makefile.ninja is regenerated. As a result, the new targets are not rebuilt and compilation fails. Use the targets to build a SHA1 hash; the chances for collision are one in 2^24 even with a 12-character prefix of the hash. Signed-off-by: Paolo Bonzini --- scripts/ninjatool.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/ninjatool.py b/scripts/ninjatool.py index ba6bd9a2a6..627a1cab45 100755 --- a/scripts/ninjatool.py +++ b/scripts/ninjatool.py @@ -34,6 +34,7 @@ import os import re import json import argparse +import hashlib import shutil @@ -51,6 +52,9 @@ else: normpath = os.path.normpath +def sha1_text(text): + return hashlib.sha1(text.encode()).hexdigest() + # ---- lexer and parser ---- PATH_RE = r"[^$\s:|]+|\$[$ :]|\$[a-zA-Z0-9_-]+|\$\{[a-zA-Z0-9_.-]+\}" @@ -767,7 +771,6 @@ class Ninja2Make(NinjaParserEventsWithVars): self.build_vars = defaultdict(lambda: dict()) self.rule_targets = defaultdict(lambda: list()) self.stamp_targets = defaultdict(lambda: list()) - self.num_stamp = defaultdict(lambda: 0) self.all_outs = set() self.all_ins = set() self.all_phony = set() @@ -903,8 +906,7 @@ class Ninja2Make(NinjaParserEventsWithVars): if len(out) == 1: stamp = out[0] + '.stamp' else: - stamp = '%s%d.stamp' %(rule, self.num_stamp[rule]) - self.num_stamp[rule] += 1 + stamp = '%s@%s.stamp' % (rule, sha1_text(targets)[0:11]) self.print('%s: %s; @:' % (targets, stamp)) self.print('%s: %s | %s; ${ninja-command-restat}' % (stamp, inputs, orderonly)) self.rule_targets[rule].append(stamp) From c138156ba55cd7e1b8b45a0e49f62f97d92a9e64 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 2 Sep 2020 06:30:40 -0400 Subject: [PATCH 10/45] meson: fix libqos linking Add genh to the sources to avoid race conditions between QAPI file generation and libqos compilation. Make the name_suffix .fa for consistency with other link_whole static libraries and to work around a Meson issue where lots of linker flags are placed between -Wl,--start-group and -Wl,--end-group and this breaks the fork-fuzz.ld linker script. Reported-by: Claudio Fontana Reported-by: Alexander Bulekov Signed-off-by: Paolo Bonzini --- tests/qtest/libqos/meson.build | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/qtest/libqos/meson.build b/tests/qtest/libqos/meson.build index 19931b9248..1cddf5bdaa 100644 --- a/tests/qtest/libqos/meson.build +++ b/tests/qtest/libqos/meson.build @@ -1,5 +1,4 @@ -libqos = static_library('qos', - files('../libqtest.c', +libqos_srcs = files('../libqtest.c', 'qgraph.c', 'qos_external.c', 'pci.c', @@ -52,6 +51,10 @@ libqos = static_library('qos', 'arm-xilinx-zynq-a9-machine.c', 'ppc64_pseries-machine.c', 'x86_64_pc-machine.c', -), build_by_default: false) +) + +libqos = static_library('qos', libqos_srcs + genh, + name_suffix: 'fa', + build_by_default: false) qos = declare_dependency(link_whole: libqos) From 37e2777670dcf25f65929a871f246c6c012d8b03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 28 Aug 2020 15:07:19 +0400 Subject: [PATCH 11/45] meson: build qapi tests library MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - builds QAPI builtins types/visitor to fix a linking issue with unresolved symbols in the static library. - work around a meson limitation on generated file output directories. Signed-off-by: Marc-André Lureau Message-Id: <20200828110734.1638685-2-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- tests/Makefile.include | 79 +-------------------------------------- tests/include/meson.build | 16 ++++++++ tests/meson.build | 45 ++++++++++++++++++++++ 3 files changed, 62 insertions(+), 78 deletions(-) create mode 100644 tests/include/meson.build diff --git a/tests/Makefile.include b/tests/Makefile.include index 5c05e84a9a..21adf106c1 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -34,23 +34,6 @@ endif ifneq ($(wildcard config-host.mak),) export SRC_PATH -# TODO don't duplicate $(SRC_PATH)/Makefile's qapi-py here -qapi-py = $(SRC_PATH)/scripts/qapi/__init__.py \ -$(SRC_PATH)/scripts/qapi/commands.py \ -$(SRC_PATH)/scripts/qapi/common.py \ -$(SRC_PATH)/scripts/qapi/doc.py \ -$(SRC_PATH)/scripts/qapi/error.py \ -$(SRC_PATH)/scripts/qapi/events.py \ -$(SRC_PATH)/scripts/qapi/expr.py \ -$(SRC_PATH)/scripts/qapi/gen.py \ -$(SRC_PATH)/scripts/qapi/introspect.py \ -$(SRC_PATH)/scripts/qapi/parser.py \ -$(SRC_PATH)/scripts/qapi/schema.py \ -$(SRC_PATH)/scripts/qapi/source.py \ -$(SRC_PATH)/scripts/qapi/types.py \ -$(SRC_PATH)/scripts/qapi/visit.py \ -$(SRC_PATH)/scripts/qapi-gen.py - # Get the list of all supported sysemu targets SYSEMU_TARGET_LIST := $(subst -softmmu.mak,,$(notdir \ $(wildcard $(SRC_PATH)/default-configs/*-softmmu.mak))) @@ -162,36 +145,13 @@ check-unit-y += tests/test-uuid$(EXESUF) check-unit-y += tests/ptimer-test$(EXESUF) check-unit-y += tests/test-qapi-util$(EXESUF) -generated-files-y += tests/test-qapi-types.h -generated-files-y += tests/include/test-qapi-types-sub-module.h -generated-files-y += tests/test-qapi-types-sub-sub-module.h -generated-files-y += tests/test-qapi-visit.h -generated-files-y += tests/include/test-qapi-visit-sub-module.h -generated-files-y += tests/test-qapi-visit-sub-sub-module.h -generated-files-y += tests/test-qapi-commands.h -generated-files-y += tests/test-qapi-init-commands.h -generated-files-y += tests/include/test-qapi-commands-sub-module.h -generated-files-y += tests/test-qapi-commands-sub-sub-module.h -generated-files-y += tests/test-qapi-emit-events.h -generated-files-y += tests/test-qapi-events.h -generated-files-y += tests/include/test-qapi-events-sub-module.h -generated-files-y += tests/test-qapi-events-sub-sub-module.h -generated-files-y += tests/test-qapi-introspect.h - QEMU_CFLAGS += -I$(SRC_PATH)/tests -I$(SRC_PATH)/tests/qtest # Deps that are common to various different sets of tests below test-util-obj-y = libqemuutil.a test-qom-obj-y = $(qom-obj-y) $(test-util-obj-y) -test-qapi-obj-y = tests/test-qapi-types.o \ - tests/include/test-qapi-types-sub-module.o \ - tests/test-qapi-types-sub-sub-module.o \ - tests/test-qapi-visit.o \ - tests/include/test-qapi-visit-sub-module.o \ - tests/test-qapi-visit-sub-sub-module.o \ - tests/test-qapi-introspect.o \ - $(test-qom-obj-y) +test-qapi-obj-y = $(test-qom-obj-y) tests/libtestqapi.a benchmark-crypto-obj-$(CONFIG_BLOCK) = $(authz-obj-y) $(crypto-obj-y) $(test-qom-obj-y) test-crypto-obj-$(CONFIG_BLOCK) = $(authz-obj-y) $(crypto-obj-y) $(test-qom-obj-y) test-io-obj-$(CONFIG_BLOCK) = $(io-obj-y) $(test-crypto-obj-y) @@ -262,42 +222,6 @@ tests/test-logging$(EXESUF): tests/test-logging.o $(test-util-obj-y) tests/test-replication$(EXESUF): tests/test-replication.o $(test-util-obj-y) \ $(test-block-obj-y) -tests/test-qapi-types.c tests/test-qapi-types.h \ -tests/include/test-qapi-types-sub-module.c \ -tests/include/test-qapi-types-sub-module.h \ -tests/test-qapi-types-sub-sub-module.c \ -tests/test-qapi-types-sub-sub-module.h \ -tests/test-qapi-visit.c tests/test-qapi-visit.h \ -tests/include/test-qapi-visit-sub-module.c \ -tests/include/test-qapi-visit-sub-module.h \ -tests/test-qapi-visit-sub-sub-module.c \ -tests/test-qapi-visit-sub-sub-module.h \ -tests/test-qapi-commands.h tests/test-qapi-commands.c \ -tests/include/test-qapi-commands-sub-module.h \ -tests/include/test-qapi-commands-sub-module.c \ -tests/test-qapi-commands-sub-sub-module.h \ -tests/test-qapi-commands-sub-sub-module.c \ -tests/test-qapi-emit-events.c tests/test-qapi-emit-events.h \ -tests/test-qapi-events.c tests/test-qapi-events.h \ -tests/test-qapi-init-commands.c \ -tests/test-qapi-init-commands.h \ -tests/include/test-qapi-events-sub-module.c \ -tests/include/test-qapi-events-sub-module.h \ -tests/test-qapi-events-sub-sub-module.c \ -tests/test-qapi-events-sub-sub-module.h \ -tests/test-qapi-introspect.c tests/test-qapi-introspect.h: \ -tests/test-qapi-gen-timestamp ; -tests/test-qapi-gen-timestamp: \ - $(SRC_PATH)/tests/qapi-schema/qapi-schema-test.json \ - $(SRC_PATH)/tests/qapi-schema/include/sub-module.json \ - $(SRC_PATH)/tests/qapi-schema/sub-sub-module.json \ - $(qapi-py) - $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-gen.py \ - -o tests -p "test-" $<, \ - "GEN","$(@:%-timestamp=%)") - @rm -f tests/test-qapi-doc.texi - @>$@ - tests/test-string-output-visitor$(EXESUF): tests/test-string-output-visitor.o $(test-qapi-obj-y) tests/test-string-input-visitor$(EXESUF): tests/test-string-input-visitor.o $(test-qapi-obj-y) tests/test-qmp-event$(EXESUF): tests/test-qmp-event.o $(test-qapi-obj-y) tests/test-qapi-emit-events.o tests/test-qapi-events.o @@ -539,7 +463,6 @@ check-build: build-unit $(QEMU_IOTESTS_HELPERS-y) check-clean: rm -rf $(check-unit-y) tests/*.o tests/*/*.o $(QEMU_IOTESTS_HELPERS-y) - rm -f tests/test-qapi-gen-timestamp rm -rf $(TESTS_VENV_DIR) $(TESTS_RESULTS_DIR) check: check-unit diff --git a/tests/include/meson.build b/tests/include/meson.build new file mode 100644 index 0000000000..fea3a6342f --- /dev/null +++ b/tests/include/meson.build @@ -0,0 +1,16 @@ +# an extra target to workaround meson limitation on output files location +test_qapi_outputs_extra = [ + 'test-qapi-commands-sub-module.c', + 'test-qapi-commands-sub-module.h', + 'test-qapi-events-sub-module.c', + 'test-qapi-events-sub-module.h', + 'test-qapi-types-sub-module.c', + 'test-qapi-types-sub-module.h', + 'test-qapi-visit-sub-module.c', + 'test-qapi-visit-sub-module.h', +] + +test_qapi_outputs_extra = custom_target('QAPI test (include)', + output: test_qapi_outputs_extra, + input: test_qapi_files, + command: 'true') diff --git a/tests/meson.build b/tests/meson.build index fe2c6d8e6b..ab09a8d845 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -1,3 +1,48 @@ +test_qapi_outputs = [ + 'qapi-builtin-types.c', + 'qapi-builtin-types.h', + 'qapi-builtin-visit.c', + 'qapi-builtin-visit.h', + 'test-qapi-commands-sub-sub-module.c', + 'test-qapi-commands-sub-sub-module.h', + 'test-qapi-commands.c', + 'test-qapi-commands.h', + 'test-qapi-emit-events.c', + 'test-qapi-emit-events.h', + 'test-qapi-events-sub-sub-module.c', + 'test-qapi-events-sub-sub-module.h', + 'test-qapi-events.c', + 'test-qapi-events.h', + 'test-qapi-init-commands.c', + 'test-qapi-init-commands.h', + 'test-qapi-introspect.c', + 'test-qapi-introspect.h', + 'test-qapi-types-sub-sub-module.c', + 'test-qapi-types-sub-sub-module.h', + 'test-qapi-types.c', + 'test-qapi-types.h', + 'test-qapi-visit-sub-sub-module.c', + 'test-qapi-visit-sub-sub-module.h', + 'test-qapi-visit.c', + 'test-qapi-visit.h', +] + +test_qapi_files = custom_target('Test QAPI files', + output: test_qapi_outputs, + input: files('qapi-schema/qapi-schema-test.json', + 'qapi-schema/include/sub-module.json', + 'qapi-schema/sub-sub-module.json'), + command: [ qapi_gen, '-o', meson.current_build_dir(), + '-b', '-p', 'test-', '@INPUT0@' ], + depend_files: qapi_gen_depends) + +# meson doesn't like generated output in other directories +# perhaps change qapi_gen to replace / with _, like Meson itself does? +subdir('include') + +libtestqapi = static_library('testqapi', sources: [test_qapi_files, test_qapi_outputs_extra]) +testqapi = declare_dependency(link_with: libtestqapi) + if have_system and 'CONFIG_POSIX' in config_host subdir('qemu-iotests') endif From 8ce0a45fa24b2dbb7d9e33eecad13a6fde962dbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 28 Aug 2020 15:07:20 +0400 Subject: [PATCH 12/45] meson: declare tasn1 dependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau Message-Id: <20200828110734.1638685-3-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- meson.build | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/meson.build b/meson.build index c0ba8cd603..1ac4266d1f 100644 --- a/meson.build +++ b/meson.build @@ -410,6 +410,11 @@ libdaxctl = not_found if 'CONFIG_LIBDAXCTL' in config_host libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split()) endif +tasn1 = not_found +if 'CONFIG_TASN1' in config_host + tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(), + link_args: config_host['TASN1_LIBS'].split()) +endif # Create config-host.h From 9866a33cbb7046891dec3dcc9ca2015828673afe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 28 Aug 2020 15:07:21 +0400 Subject: [PATCH 13/45] meson: declare keyutils dependency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rename the variable to be more explicit. A further clean-up patch will move the actual to dependency check to meson entirely. Signed-off-by: Marc-André Lureau Message-Id: <20200828110734.1638685-4-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- configure | 2 +- meson.build | 4 ++++ tests/Makefile.include | 2 +- tests/test-crypto-secret.c | 10 +++++----- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/configure b/configure index 4d0724af31..8c9bbfad51 100755 --- a/configure +++ b/configure @@ -7523,7 +7523,7 @@ fi if test "$secret_keyring" = "yes" ; then echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak if test "$have_keyutils" = "yes" ; then - echo "CONFIG_TEST_SECRET_KEYRING=y" >> $config_host_mak + echo "CONFIG_KEYUTILS=y" >> $config_host_mak fi fi diff --git a/meson.build b/meson.build index 1ac4266d1f..d3cf531297 100644 --- a/meson.build +++ b/meson.build @@ -415,6 +415,10 @@ if 'CONFIG_TASN1' in config_host tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(), link_args: config_host['TASN1_LIBS'].split()) endif +keyutils = not_found +if 'CONFIG_KEYUTILS' in config_host + keyutils = declare_dependency(link_args: '-lkeyutils') +endif # Create config-host.h diff --git a/tests/Makefile.include b/tests/Makefile.include index 21adf106c1..468d8b86c6 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -246,7 +246,7 @@ tests/benchmark-crypto-cipher$(EXESUF): tests/benchmark-crypto-cipher.o $(test-c tests/test-crypto-secret$(EXESUF): tests/test-crypto-secret.o $(test-crypto-obj-y) tests/test-crypto-xts$(EXESUF): tests/test-crypto-xts.o $(test-crypto-obj-y) -ifeq ($(CONFIG_TEST_SECRET_KEYRING),y) +ifeq ($(CONFIG_KEYUTILS),y) tests/test-crypto-secret.o-libs := -lkeyutils endif diff --git a/tests/test-crypto-secret.c b/tests/test-crypto-secret.c index 603a093f10..9d06176663 100644 --- a/tests/test-crypto-secret.c +++ b/tests/test-crypto-secret.c @@ -24,7 +24,7 @@ #include "crypto/secret.h" #include "qapi/error.h" #include "qemu/module.h" -#ifdef CONFIG_TEST_SECRET_KEYRING +#ifdef CONFIG_KEYUTILS #include "crypto/secret_keyring.h" #include #endif @@ -128,7 +128,7 @@ static void test_secret_indirect_emptyfile(void) g_free(fname); } -#ifdef CONFIG_TEST_SECRET_KEYRING +#ifdef CONFIG_KEYUTILS #define DESCRIPTION "qemu_test_secret" #define PAYLOAD "Test Payload" @@ -268,7 +268,7 @@ static void test_secret_keyring_bad_key_access_right(void) keyctl_unlink(key, KEY_SPEC_PROCESS_KEYRING); } -#endif /* CONFIG_TEST_SECRET_KEYRING */ +#endif /* CONFIG_KEYUTILS */ static void test_secret_noconv_base64_good(void) { @@ -571,7 +571,7 @@ int main(int argc, char **argv) g_test_add_func("/crypto/secret/indirect/emptyfile", test_secret_indirect_emptyfile); -#ifdef CONFIG_TEST_SECRET_KEYRING +#ifdef CONFIG_KEYUTILS g_test_add_func("/crypto/secret/keyring/good", test_secret_keyring_good); g_test_add_func("/crypto/secret/keyring/revoked_key", @@ -582,7 +582,7 @@ int main(int argc, char **argv) test_secret_keyring_bad_serial_key); g_test_add_func("/crypto/secret/keyring/bad_key_access_right", test_secret_keyring_bad_key_access_right); -#endif /* CONFIG_TEST_SECRET_KEYRING */ +#endif /* CONFIG_KEYUTILS */ g_test_add_func("/crypto/secret/noconv/base64/good", test_secret_noconv_base64_good); From a9726a900d163d3e6d9551715ba00eec5b347413 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 28 Aug 2020 15:07:22 +0400 Subject: [PATCH 14/45] meson: convert qht-bench MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is required by test-qht-par unit test. Signed-off-by: Marc-André Lureau Message-Id: <20200828110734.1638685-5-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- tests/Makefile.include | 1 - tests/meson.build | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/Makefile.include b/tests/Makefile.include index 468d8b86c6..490a923384 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -199,7 +199,6 @@ tests/test-rcu-slist$(EXESUF): tests/test-rcu-slist.o $(test-util-obj-y) tests/test-qdist$(EXESUF): tests/test-qdist.o $(test-util-obj-y) tests/test-qht$(EXESUF): tests/test-qht.o $(test-util-obj-y) tests/test-qht-par$(EXESUF): tests/test-qht-par.o tests/qht-bench$(EXESUF) $(test-util-obj-y) -tests/qht-bench$(EXESUF): tests/qht-bench.o $(test-util-obj-y) tests/test-bufferiszero$(EXESUF): tests/test-bufferiszero.o $(test-util-obj-y) tests/atomic_add-bench$(EXESUF): tests/atomic_add-bench.o $(test-util-obj-y) tests/atomic64-bench$(EXESUF): tests/atomic64-bench.o $(test-util-obj-y) diff --git a/tests/meson.build b/tests/meson.build index ab09a8d845..3aeae23d54 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -1,3 +1,7 @@ +qht_bench = executable('qht-bench', + sources: files('qht-bench.c'), + dependencies: [qemuutil]) + test_qapi_outputs = [ 'qapi-builtin-types.c', 'qapi-builtin-types.h', From 279588d4deea2694ebe9ceb29dfdc5c08a7c4e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Mon, 3 Aug 2020 09:05:54 +0200 Subject: [PATCH 15/45] meson: convert the unit tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau Message-Id: <20200828110734.1638685-7-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- tests/Makefile.include | 254 +---------------------------------------- tests/meson.build | 171 ++++++++++++++++++++++++++- tests/test-qga.c | 2 +- 3 files changed, 174 insertions(+), 253 deletions(-) diff --git a/tests/Makefile.include b/tests/Makefile.include index 490a923384..ce0a9fd780 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -38,254 +38,20 @@ export SRC_PATH SYSEMU_TARGET_LIST := $(subst -softmmu.mak,,$(notdir \ $(wildcard $(SRC_PATH)/default-configs/*-softmmu.mak))) -check-unit-y += tests/check-qdict$(EXESUF) -check-unit-y += tests/check-block-qdict$(EXESUF) -check-unit-y += tests/check-qnum$(EXESUF) -check-unit-y += tests/check-qstring$(EXESUF) -check-unit-y += tests/check-qlist$(EXESUF) -check-unit-y += tests/check-qnull$(EXESUF) -check-unit-y += tests/check-qobject$(EXESUF) -check-unit-y += tests/check-qjson$(EXESUF) -check-unit-y += tests/check-qlit$(EXESUF) -check-unit-y += tests/test-qobject-output-visitor$(EXESUF) -check-unit-y += tests/test-clone-visitor$(EXESUF) -check-unit-y += tests/test-qobject-input-visitor$(EXESUF) -check-unit-$(CONFIG_SOFTMMU) += tests/test-qmp-cmds$(EXESUF) -check-unit-y += tests/test-string-input-visitor$(EXESUF) -check-unit-y += tests/test-string-output-visitor$(EXESUF) -check-unit-y += tests/test-qmp-event$(EXESUF) -check-unit-y += tests/test-opts-visitor$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-coroutine$(EXESUF) -check-unit-y += tests/test-visitor-serialization$(EXESUF) -check-unit-$(CONFIG_SOFTMMU) += tests/test-iov$(EXESUF) -check-unit-y += tests/test-bitmap$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-aio$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-aio-multithread$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-throttle$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-thread-pool$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-hbitmap$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-bdrv-drain$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-bdrv-graph-mod$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-blockjob$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-blockjob-txn$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-block-backend$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-block-iothread$(EXESUF) -ifeq ($(CONFIG_POSIX),y) -check-unit-$(CONFIG_BLOCK) += tests/test-image-locking$(EXESUF) -endif -check-unit-y += tests/test-x86-cpuid$(EXESUF) -# all code tested by test-x86-cpuid is inside topology.h -ifeq ($(CONFIG_SOFTMMU),y) -check-unit-y += tests/test-xbzrle$(EXESUF) -check-unit-$(CONFIG_POSIX) += tests/test-vmstate$(EXESUF) -endif -check-unit-y += tests/test-cutils$(EXESUF) -check-unit-y += tests/test-shift128$(EXESUF) -check-unit-y += tests/test-mul64$(EXESUF) -check-unit-y += tests/test-int128$(EXESUF) -# all code tested by test-int128 is inside int128.h -check-unit-y += tests/rcutorture$(EXESUF) -check-unit-y += tests/test-rcu-list$(EXESUF) -check-unit-y += tests/test-rcu-simpleq$(EXESUF) -check-unit-y += tests/test-rcu-tailq$(EXESUF) -check-unit-y += tests/test-rcu-slist$(EXESUF) -check-unit-y += tests/test-qdist$(EXESUF) -check-unit-y += tests/test-qht$(EXESUF) -check-unit-y += tests/test-qht-par$(EXESUF) -check-unit-y += tests/test-bitops$(EXESUF) -check-unit-y += tests/test-bitcnt$(EXESUF) -check-unit-y += tests/test-qgraph$(EXESUF) -check-unit-y += tests/check-qom-interface$(EXESUF) -check-unit-y += tests/check-qom-proplist$(EXESUF) -check-unit-y += tests/test-qemu-opts$(EXESUF) -check-unit-y += tests/test-keyval$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-write-threshold$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-crypto-hash$(EXESUF) check-speed-$(CONFIG_BLOCK) += tests/benchmark-crypto-hash$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-crypto-hmac$(EXESUF) check-speed-$(CONFIG_BLOCK) += tests/benchmark-crypto-hmac$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-crypto-cipher$(EXESUF) check-speed-$(CONFIG_BLOCK) += tests/benchmark-crypto-cipher$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-crypto-secret$(EXESUF) -check-unit-$(call land,$(CONFIG_BLOCK),$(CONFIG_GNUTLS)) += tests/test-crypto-tlscredsx509$(EXESUF) -check-unit-$(call land,$(CONFIG_BLOCK),$(CONFIG_GNUTLS)) += tests/test-crypto-tlssession$(EXESUF) -ifndef CONFIG_TSAN -# Some tests: test-char, test-qdev-global-props, and test-qga, -# are not runnable under TSan due to a known issue. -# https://github.com/google/sanitizers/issues/1116 -check-unit-$(CONFIG_SOFTMMU) += tests/test-char$(EXESUF) -check-unit-$(CONFIG_SOFTMMU) += tests/test-qdev-global-props$(EXESUF) -ifeq ($(CONFIG_GUEST_AGENT),y) -check-unit-$(call land,$(CONFIG_LINUX),$(CONFIG_VIRTIO_SERIAL)) += tests/test-qga$(EXESUF) -endif -endif -check-unit-$(CONFIG_SOFTMMU) += tests/test-timed-average$(EXESUF) -check-unit-$(call land,$(CONFIG_SOFTMMU),$(CONFIG_INOTIFY1)) += tests/test-util-filemonitor$(EXESUF) -check-unit-$(CONFIG_SOFTMMU) += tests/test-util-sockets$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-authz-simple$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-authz-list$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-authz-listfile$(EXESUF) -check-unit-$(call land,$(CONFIG_BLOCK),$(CONFIG_AUTH_PAM)) += tests/test-authz-pam$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-io-task$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-io-channel-socket$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-io-channel-file$(EXESUF) -check-unit-$(call land,$(CONFIG_BLOCK),$(CONFIG_GNUTLS)) += tests/test-io-channel-tls$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-io-channel-command$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-io-channel-buffer$(EXESUF) -check-unit-$(CONFIG_SOFTMMU) += tests/test-base64$(EXESUF) -check-unit-$(call land,$(CONFIG_BLOCK),$(if $(CONFIG_NETTLE),y,$(CONFIG_GCRYPT))) += tests/test-crypto-pbkdf$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-crypto-ivgen$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-crypto-afsplit$(EXESUF) -check-unit-$(call land,$(CONFIG_BLOCK),$(CONFIG_QEMU_PRIVATE_XTS)) += tests/test-crypto-xts$(EXESUF) -check-unit-$(CONFIG_BLOCK) += tests/test-crypto-block$(EXESUF) -check-unit-y += tests/test-logging$(EXESUF) -check-unit-$(call land,$(CONFIG_BLOCK),$(CONFIG_REPLICATION)) += tests/test-replication$(EXESUF) -check-unit-$(CONFIG_SOFTMMU) += tests/test-bufferiszero$(EXESUF) -check-unit-y += tests/test-uuid$(EXESUF) -check-unit-y += tests/ptimer-test$(EXESUF) -check-unit-y += tests/test-qapi-util$(EXESUF) QEMU_CFLAGS += -I$(SRC_PATH)/tests -I$(SRC_PATH)/tests/qtest - # Deps that are common to various different sets of tests below test-util-obj-y = libqemuutil.a -test-qom-obj-y = $(qom-obj-y) $(test-util-obj-y) -test-qapi-obj-y = $(test-qom-obj-y) tests/libtestqapi.a -benchmark-crypto-obj-$(CONFIG_BLOCK) = $(authz-obj-y) $(crypto-obj-y) $(test-qom-obj-y) -test-crypto-obj-$(CONFIG_BLOCK) = $(authz-obj-y) $(crypto-obj-y) $(test-qom-obj-y) -test-io-obj-$(CONFIG_BLOCK) = $(io-obj-y) $(test-crypto-obj-y) -test-authz-obj-$(CONFIG_BLOCK) = $(test-qom-obj-y) $(authz-obj-y) -test-block-obj-$(CONFIG_BLOCK) = $(block-obj-y) $(test-io-obj-y) tests/iothread.o - -tests/check-qnum$(EXESUF): tests/check-qnum.o $(test-util-obj-y) -tests/check-qstring$(EXESUF): tests/check-qstring.o $(test-util-obj-y) -tests/check-qdict$(EXESUF): tests/check-qdict.o $(test-util-obj-y) -tests/check-block-qdict$(EXESUF): tests/check-block-qdict.o $(test-util-obj-y) -tests/check-qlist$(EXESUF): tests/check-qlist.o $(test-util-obj-y) -tests/check-qnull$(EXESUF): tests/check-qnull.o $(test-util-obj-y) -tests/check-qobject$(EXESUF): tests/check-qobject.o $(test-util-obj-y) -tests/check-qjson$(EXESUF): tests/check-qjson.o $(test-util-obj-y) -tests/check-qlit$(EXESUF): tests/check-qlit.o $(test-util-obj-y) -tests/check-qom-interface$(EXESUF): tests/check-qom-interface.o $(test-qom-obj-y) -tests/check-qom-proplist$(EXESUF): tests/check-qom-proplist.o $(test-qom-obj-y) - -tests/test-char$(EXESUF): tests/test-char.o $(test-util-obj-y) $(test-io-obj-y) $(chardev-obj-y) tests/socket-helpers.o -tests/test-coroutine$(EXESUF): tests/test-coroutine.o $(test-block-obj-y) -tests/test-aio$(EXESUF): tests/test-aio.o $(test-block-obj-y) -tests/test-aio-multithread$(EXESUF): tests/test-aio-multithread.o $(test-block-obj-y) -tests/test-throttle$(EXESUF): tests/test-throttle.o $(test-block-obj-y) -tests/test-bdrv-drain$(EXESUF): tests/test-bdrv-drain.o $(test-block-obj-y) $(test-util-obj-y) -tests/test-bdrv-graph-mod$(EXESUF): tests/test-bdrv-graph-mod.o $(test-block-obj-y) $(test-util-obj-y) -tests/test-blockjob$(EXESUF): tests/test-blockjob.o $(test-block-obj-y) $(test-util-obj-y) -tests/test-blockjob-txn$(EXESUF): tests/test-blockjob-txn.o $(test-block-obj-y) $(test-util-obj-y) -tests/test-block-backend$(EXESUF): tests/test-block-backend.o $(test-block-obj-y) $(test-util-obj-y) -tests/test-block-iothread$(EXESUF): tests/test-block-iothread.o $(test-block-obj-y) $(test-util-obj-y) -tests/test-image-locking$(EXESUF): tests/test-image-locking.o $(test-block-obj-y) $(test-util-obj-y) -tests/test-thread-pool$(EXESUF): tests/test-thread-pool.o $(test-block-obj-y) -tests/test-iov$(EXESUF): tests/test-iov.o $(test-util-obj-y) -tests/test-hbitmap$(EXESUF): tests/test-hbitmap.o $(test-util-obj-y) $(test-crypto-obj-y) -tests/test-bitmap$(EXESUF): tests/test-bitmap.o $(test-util-obj-y) -tests/test-x86-cpuid$(EXESUF): tests/test-x86-cpuid.o -tests/test-xbzrle$(EXESUF): tests/test-xbzrle.o migration/libmigration.fa $(test-util-obj-y) \ - $(test-io-obj-y) -tests/test-cutils$(EXESUF): tests/test-cutils.o util/cutils.o $(test-util-obj-y) -tests/test-int128$(EXESUF): tests/test-int128.o -tests/rcutorture$(EXESUF): tests/rcutorture.o $(test-util-obj-y) -tests/test-rcu-list$(EXESUF): tests/test-rcu-list.o $(test-util-obj-y) -tests/test-rcu-simpleq$(EXESUF): tests/test-rcu-simpleq.o $(test-util-obj-y) -tests/test-rcu-tailq$(EXESUF): tests/test-rcu-tailq.o $(test-util-obj-y) -tests/test-rcu-slist$(EXESUF): tests/test-rcu-slist.o $(test-util-obj-y) -tests/test-qdist$(EXESUF): tests/test-qdist.o $(test-util-obj-y) -tests/test-qht$(EXESUF): tests/test-qht.o $(test-util-obj-y) -tests/test-qht-par$(EXESUF): tests/test-qht-par.o tests/qht-bench$(EXESUF) $(test-util-obj-y) -tests/test-bufferiszero$(EXESUF): tests/test-bufferiszero.o $(test-util-obj-y) tests/atomic_add-bench$(EXESUF): tests/atomic_add-bench.o $(test-util-obj-y) tests/atomic64-bench$(EXESUF): tests/atomic64-bench.o $(test-util-obj-y) -tests/test-qdev-global-props$(EXESUF): tests/test-qdev-global-props.o hw/core/libhwcore.fa \ - $(test-qapi-obj-y) -tests/test-vmstate$(EXESUF): tests/test-vmstate.o migration/libmigration.fa \ - $(test-io-obj-y) -tests/test-timed-average$(EXESUF): tests/test-timed-average.o $(test-util-obj-y) -tests/test-base64$(EXESUF): tests/test-base64.o $(test-util-obj-y) -tests/ptimer-test$(EXESUF): tests/ptimer-test.o tests/ptimer-test-stubs.o hw/core/ptimer.o -tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o $(test-util-obj-y) -tests/test-keyval$(EXESUF): tests/test-keyval.o $(test-util-obj-y) $(test-qapi-obj-y) -tests/test-write-threshold$(EXESUF): tests/test-write-threshold.o $(test-block-obj-y) -tests/test-uuid$(EXESUF): tests/test-uuid.o $(test-util-obj-y) -tests/test-qapi-util$(EXESUF): tests/test-qapi-util.o $(test-util-obj-y) - -tests/test-logging$(EXESUF): tests/test-logging.o $(test-util-obj-y) - -tests/test-replication$(EXESUF): tests/test-replication.o $(test-util-obj-y) \ - $(test-block-obj-y) - -tests/test-string-output-visitor$(EXESUF): tests/test-string-output-visitor.o $(test-qapi-obj-y) -tests/test-string-input-visitor$(EXESUF): tests/test-string-input-visitor.o $(test-qapi-obj-y) -tests/test-qmp-event$(EXESUF): tests/test-qmp-event.o $(test-qapi-obj-y) tests/test-qapi-emit-events.o tests/test-qapi-events.o -tests/test-qobject-output-visitor$(EXESUF): tests/test-qobject-output-visitor.o $(test-qapi-obj-y) -tests/test-clone-visitor$(EXESUF): tests/test-clone-visitor.o $(test-qapi-obj-y) -tests/test-qobject-input-visitor$(EXESUF): tests/test-qobject-input-visitor.o $(test-qapi-obj-y) -tests/test-qmp-cmds$(EXESUF): tests/test-qmp-cmds.o tests/test-qapi-commands.o tests/test-qapi-init-commands.o $(test-qapi-obj-y) -tests/test-visitor-serialization$(EXESUF): tests/test-visitor-serialization.o $(test-qapi-obj-y) -tests/test-opts-visitor$(EXESUF): tests/test-opts-visitor.o $(test-qapi-obj-y) - -tests/test-shift128$(EXESUF): tests/test-shift128.o $(test-util-obj-y) -tests/test-mul64$(EXESUF): tests/test-mul64.o $(test-util-obj-y) -tests/test-bitops$(EXESUF): tests/test-bitops.o $(test-util-obj-y) -tests/test-bitcnt$(EXESUF): tests/test-bitcnt.o $(test-util-obj-y) -tests/test-qgraph$(EXESUF): tests/test-qgraph.o tests/qtest/libqos/qgraph.o $(test-util-obj-y) -tests/test-crypto-hash$(EXESUF): tests/test-crypto-hash.o $(test-crypto-obj-y) tests/benchmark-crypto-hash$(EXESUF): tests/benchmark-crypto-hash.o $(test-crypto-obj-y) -tests/test-crypto-hmac$(EXESUF): tests/test-crypto-hmac.o $(test-crypto-obj-y) tests/benchmark-crypto-hmac$(EXESUF): tests/benchmark-crypto-hmac.o $(test-crypto-obj-y) -tests/test-crypto-cipher$(EXESUF): tests/test-crypto-cipher.o $(test-crypto-obj-y) tests/benchmark-crypto-cipher$(EXESUF): tests/benchmark-crypto-cipher.o $(test-crypto-obj-y) -tests/test-crypto-secret$(EXESUF): tests/test-crypto-secret.o $(test-crypto-obj-y) -tests/test-crypto-xts$(EXESUF): tests/test-crypto-xts.o $(test-crypto-obj-y) - -ifeq ($(CONFIG_KEYUTILS),y) -tests/test-crypto-secret.o-libs := -lkeyutils -endif - -tests/crypto-tls-x509-helpers.o-cflags := $(TASN1_CFLAGS) -tests/crypto-tls-x509-helpers.o-libs := $(TASN1_LIBS) -tests/pkix_asn1_tab.o-cflags := $(TASN1_CFLAGS) - -tests/test-crypto-tlscredsx509.o-cflags := $(TASN1_CFLAGS) -tests/test-crypto-tlscredsx509$(EXESUF): tests/test-crypto-tlscredsx509.o \ - tests/crypto-tls-x509-helpers.o tests/pkix_asn1_tab.o $(test-crypto-obj-y) - -tests/test-crypto-tlssession.o-cflags := $(TASN1_CFLAGS) -tests/test-crypto-tlssession$(EXESUF): tests/test-crypto-tlssession.o \ - tests/crypto-tls-x509-helpers.o tests/pkix_asn1_tab.o \ - tests/crypto-tls-psk-helpers.o \ - $(test-crypto-obj-y) -tests/test-util-filemonitor$(EXESUF): tests/test-util-filemonitor.o \ - $(test-util-obj-y) -tests/test-util-sockets$(EXESUF): tests/test-util-sockets.o \ - tests/socket-helpers.o $(test-util-obj-y) -tests/test-authz-simple$(EXESUF): tests/test-authz-simple.o $(test-authz-obj-y) -tests/test-authz-list$(EXESUF): tests/test-authz-list.o $(test-authz-obj-y) -tests/test-authz-listfile$(EXESUF): tests/test-authz-listfile.o $(test-authz-obj-y) -tests/test-authz-pam$(EXESUF): tests/test-authz-pam.o $(test-authz-obj-y) -tests/test-io-task$(EXESUF): tests/test-io-task.o $(test-io-obj-y) -tests/test-io-channel-socket$(EXESUF): tests/test-io-channel-socket.o \ - tests/io-channel-helpers.o tests/socket-helpers.o $(test-io-obj-y) -tests/test-io-channel-file$(EXESUF): tests/test-io-channel-file.o \ - tests/io-channel-helpers.o $(test-io-obj-y) -tests/test-io-channel-tls$(EXESUF): tests/test-io-channel-tls.o \ - tests/crypto-tls-x509-helpers.o tests/pkix_asn1_tab.o \ - tests/io-channel-helpers.o $(test-io-obj-y) -tests/test-io-channel-command$(EXESUF): tests/test-io-channel-command.o \ - tests/io-channel-helpers.o $(test-io-obj-y) -tests/test-io-channel-buffer$(EXESUF): tests/test-io-channel-buffer.o \ - tests/io-channel-helpers.o $(test-io-obj-y) -tests/test-crypto-pbkdf$(EXESUF): tests/test-crypto-pbkdf.o $(test-crypto-obj-y) -tests/test-crypto-ivgen$(EXESUF): tests/test-crypto-ivgen.o $(test-crypto-obj-y) -tests/test-crypto-afsplit$(EXESUF): tests/test-crypto-afsplit.o $(test-crypto-obj-y) -tests/test-crypto-block$(EXESUF): tests/test-crypto-block.o $(test-crypto-obj-y) tests/migration/stress$(EXESUF): tests/migration/stress.o $(call quiet-command, $(LINKPROG) -static -O3 $(PTHREAD_LIB) -o $@ $< ,"LINK","$(TARGET_DIR)$@") @@ -299,8 +65,6 @@ tests/migration/initrd-stress.img: tests/migration/stress$(EXESUF) rm $(INITRD_WORK_DIR)/init rmdir $(INITRD_WORK_DIR) -tests/test-qga$(EXESUF): qga/qemu-ga$(EXESUF) -tests/test-qga$(EXESUF): tests/test-qga.o tests/qtest/libqtest.o $(test-util-obj-y) tests/vhost-user-bridge$(EXESUF): tests/vhost-user-bridge.o $(test-util-obj-y) libvhost-user.a tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_helper.o @@ -341,19 +105,9 @@ define do_test_tap "TAP","$@") endef -build-unit: $(check-unit-y) - -check-unit: $(check-unit-y) - $(call do_test_human, $^) - check-speed: $(check-speed-y) $(call do_test_human, $^) -# gtester tests with TAP output - -check-report-unit.tap: $(check-unit-y) - $(call do_test_tap,$^) - # Per guest TCG tests BUILD_TCG_TARGET_RULES=$(patsubst %,build-tcg-tests-%, $(TARGET_DIRS)) @@ -446,7 +200,7 @@ check-acceptance: check-venv $(TESTS_RESULTS_DIR) get-vm-images # Consolidated targets -.PHONY: check-block check-unit check check-clean get-vm-images +.PHONY: check-block check check-clean get-vm-images check: ifeq ($(CONFIG_TOOLS)$(CONFIG_POSIX),yy) @@ -458,14 +212,12 @@ check-block: $(SRC_PATH)/tests/check-block.sh qemu-img$(EXESUF) \ @$< endif -check-build: build-unit $(QEMU_IOTESTS_HELPERS-y) +check-build: $(QEMU_IOTESTS_HELPERS-y) check-clean: - rm -rf $(check-unit-y) tests/*.o tests/*/*.o $(QEMU_IOTESTS_HELPERS-y) + rm -rf tests/*.o tests/*/*.o $(QEMU_IOTESTS_HELPERS-y) rm -rf $(TESTS_VENV_DIR) $(TESTS_RESULTS_DIR) -check: check-unit - clean: check-clean # Build the help program automatically diff --git a/tests/meson.build b/tests/meson.build index 3aeae23d54..34a5054514 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -1,5 +1,7 @@ +py3 = import('python').find_installation() + qht_bench = executable('qht-bench', - sources: files('qht-bench.c'), + sources: 'qht-bench.c', dependencies: [qemuutil]) test_qapi_outputs = [ @@ -47,6 +49,173 @@ subdir('include') libtestqapi = static_library('testqapi', sources: [test_qapi_files, test_qapi_outputs_extra]) testqapi = declare_dependency(link_with: libtestqapi) +testblock = declare_dependency(dependencies: [block], sources: 'iothread.c') + +tests = { + 'check-block-qdict': [], + 'check-qdict': [], + 'check-qnum': [], + 'check-qstring': [], + 'check-qlist': [], + 'check-qnull': [], + 'check-qobject': [], + 'check-qjson': [], + 'check-qlit': [], + 'test-qobject-output-visitor': [testqapi], + 'test-clone-visitor': [testqapi], + 'test-qobject-input-visitor': [testqapi], + 'test-string-input-visitor': [testqapi], + 'test-string-output-visitor': [testqapi], + 'test-qmp-event': [testqapi], + 'test-opts-visitor': [testqapi], + 'test-visitor-serialization': [testqapi], + 'test-bitmap': [], + # all code tested by test-x86-cpuid is inside topology.h + 'test-x86-cpuid': [], + 'test-cutils': [], + 'test-shift128': [], + 'test-mul64': [], + # all code tested by test-int128 is inside int128.h + 'test-int128': [], + 'rcutorture': [], + 'test-rcu-list': [], + 'test-rcu-simpleq': [], + 'test-rcu-tailq': [], + 'test-rcu-slist': [], + 'test-qdist': [], + 'test-qht': [], + 'test-bitops': [], + 'test-bitcnt': [], + 'test-qgraph': ['qtest/libqos/qgraph.c'], + 'check-qom-interface': [qom], + 'check-qom-proplist': [qom], + 'test-qemu-opts': [], + 'test-keyval': [testqapi], + 'test-logging': [], + 'test-uuid': [], + 'ptimer-test': ['ptimer-test-stubs.c', meson.source_root() / 'hw/core/ptimer.c'], + 'test-qapi-util': [], +} + +test_deps = { + 'test-qht-par': qht_bench, +} + +if have_block + tests += { + 'test-coroutine': [testblock], + 'test-aio': [testblock], + 'test-aio-multithread': [testblock], + 'test-throttle': [testblock], + 'test-thread-pool': [testblock], + 'test-hbitmap': [testblock], + 'test-bdrv-drain': [testblock], + 'test-bdrv-graph-mod': [testblock], + 'test-blockjob': [testblock], + 'test-blockjob-txn': [testblock], + 'test-block-backend': [testblock], + 'test-block-iothread': [testblock], + 'test-write-threshold': [testblock], + 'test-crypto-hash': [crypto], + 'test-crypto-hmac': [crypto], + 'test-crypto-cipher': [crypto], + 'test-crypto-secret': [crypto, keyutils], + 'test-authz-simple': [authz], + 'test-authz-list': [authz], + 'test-authz-listfile': [authz], + 'test-io-task': [testblock], + 'test-io-channel-socket': ['socket-helpers.c', 'io-channel-helpers.c', io], + 'test-io-channel-file': ['io-channel-helpers.c', io], + 'test-io-channel-command': ['io-channel-helpers.c', io], + 'test-io-channel-buffer': ['io-channel-helpers.c', io], + 'test-crypto-ivgen': [io], + 'test-crypto-afsplit': [io], + 'test-crypto-block': [io], + } + if 'CONFIG_GNUTLS' in config_host and \ + 'CONFIG_TASN1' in config_host + tests += { + 'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', + tasn1, crypto], + 'test-crypto-tlssession': ['crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', 'crypto-tls-psk-helpers.c', + tasn1, crypto], + 'test-io-channel-tls': ['io-channel-helpers.c', 'crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', + tasn1, io, crypto]} + endif + if 'CONFIG_AUTH_PAM' in config_host + tests += {'test-authz-pam': [authz]} + endif + if 'CONFIG_QEMU_PRIVATE_XTS' in config_host + tests += {'test-crypto-xts': [crypto, io]} + endif + if 'CONFIG_POSIX' in config_host + tests += {'test-image-locking': [testblock]} + endif + if 'CONFIG_REPLICATION' in config_host + tests += {'test-replication': [testblock]} + endif + if 'CONFIG_NETTLE' in config_host or 'CONFIG_GCRYPT' in config_host + tests += {'test-crypto-pbkdf': [io]} + endif +endif + +if have_system + tests += { + 'test-iov': [], + 'test-qmp-cmds': [testqapi], + 'test-xbzrle': [migration], + 'test-timed-average': [], + 'test-util-sockets': ['socket-helpers.c'], + 'test-base64': [], + 'test-bufferiszero': [], + 'test-vmstate': [migration, io] + } + if 'CONFIG_INOTIFY1' in config_host + tests += {'test-util-filemonitor': []} + endif + + # Some tests: test-char, test-qdev-global-props, and test-qga, + # are not runnable under TSan due to a known issue. + # https://github.com/google/sanitizers/issues/1116 + if 'CONFIG_TSAN' not in config_host + tests += { + 'test-char': ['socket-helpers.c', qom, io, chardev], + 'test-qdev-global-props': [qom, hwcore, testqapi] + } + endif +endif + +if 'CONFIG_TSAN' not in config_host and \ + 'CONFIG_GUEST_AGENT' in config_host and \ + 'CONFIG_LINUX' in config_host + tests += {'test-qga': ['qtest/libqtest.c']} + test_deps += {'test-qga': qga} +endif + +test_env = environment() +test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) +test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + +foreach test_name, extra: tests + src = [test_name + '.c'] + deps = [qemuutil] + if extra.length() > 0 + # use a sourceset to quickly separate sources and deps + test_ss = ss.source_set() + test_ss.add(extra) + src += test_ss.all_sources() + deps += test_ss.all_dependencies() + endif + exe = executable(test_name, src, dependencies: deps) + + test(test_name, exe, + depends: test_deps.get(test_name, []), + env: test_env, + args: ['--tap', '-k'], + protocol: 'tap', + suite: ['unit']) +endforeach + if have_system and 'CONFIG_POSIX' in config_host subdir('qemu-iotests') endif diff --git a/tests/test-qga.c b/tests/test-qga.c index 65d7992edc..c1b173b3cb 100644 --- a/tests/test-qga.c +++ b/tests/test-qga.c @@ -4,7 +4,7 @@ #include #include -#include "libqos/libqtest.h" +#include "qtest/libqos/libqtest.h" #include "qapi/qmp/qdict.h" #include "qapi/qmp/qlist.h" From af04e89dd97a8098fe5643f6e9a28fa4233f21cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 28 Aug 2020 15:07:25 +0400 Subject: [PATCH 16/45] meson: move keyutils dependency check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since there is not minimum version specified, and it's a test-only dependency, it's fair to depend on a version that ships with a .pc I suppose. Signed-off-by: Marc-André Lureau Message-Id: <20200828110734.1638685-8-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- configure | 25 ------------------------- meson.build | 7 +++---- 2 files changed, 3 insertions(+), 29 deletions(-) diff --git a/configure b/configure index 8c9bbfad51..1471b35d96 100755 --- a/configure +++ b/configure @@ -6312,28 +6312,6 @@ but not implemented on your system" fi fi -########################################## -# check for usable keyutils.h - -if test "$linux" = "yes" ; then - - have_keyutils=no - cat > $TMPC << EOF -#include -#include -#include -#include -#include -int main(void) { - return request_key("user", NULL, NULL, 0); -} -EOF - if compile_prog "" "-lkeyutils"; then - have_keyutils=yes - fi -fi - - ########################################## # End of CC checks # After here, no more $cc or $ld runs @@ -7522,9 +7500,6 @@ fi if test "$secret_keyring" = "yes" ; then echo "CONFIG_SECRET_KEYRING=y" >> $config_host_mak - if test "$have_keyutils" = "yes" ; then - echo "CONFIG_KEYUTILS=y" >> $config_host_mak - fi fi if test "$tcg_interpreter" = "yes"; then diff --git a/meson.build b/meson.build index d3cf531297..f7cd2b6f73 100644 --- a/meson.build +++ b/meson.build @@ -415,10 +415,8 @@ if 'CONFIG_TASN1' in config_host tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(), link_args: config_host['TASN1_LIBS'].split()) endif -keyutils = not_found -if 'CONFIG_KEYUTILS' in config_host - keyutils = declare_dependency(link_args: '-lkeyutils') -endif +keyutils = dependency('libkeyutils', required: false, + method: 'pkg-config', static: enable_static) # Create config-host.h @@ -429,6 +427,7 @@ config_host_data.set('CONFIG_VNC_JPEG', jpeg.found()) config_host_data.set('CONFIG_VNC_PNG', png.found()) config_host_data.set('CONFIG_VNC_SASL', sasl.found()) config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found()) +config_host_data.set('CONFIG_KEYUTILS', keyutils.found()) config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version())) config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0]) config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1]) From fb5c5786972626db202c5eb9c7bb86579145b9a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 28 Aug 2020 15:07:26 +0400 Subject: [PATCH 17/45] meson: remove old socket_scm_helper rule MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It was covered already in commit d3ca592b3c10 ("meson: convert check-block") Signed-off-by: Marc-André Lureau Message-Id: <20200828110734.1638685-9-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- tests/Makefile.include | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Makefile.include b/tests/Makefile.include index ce0a9fd780..b68911833f 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -66,7 +66,6 @@ tests/migration/initrd-stress.img: tests/migration/stress$(EXESUF) rmdir $(INITRD_WORK_DIR) tests/vhost-user-bridge$(EXESUF): tests/vhost-user-bridge.o $(test-util-obj-y) libvhost-user.a -tests/qemu-iotests/socket_scm_helper$(EXESUF): tests/qemu-iotests/socket_scm_helper.o SPEED = quick From 89d4dc8f8fdd6fa2688741c780bc060ac9d2b516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 28 Aug 2020 15:07:27 +0400 Subject: [PATCH 18/45] meson: convert vhost-user-bridge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau Message-Id: <20200828110734.1638685-10-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- tests/Makefile.include | 2 -- tests/meson.build | 9 +++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/Makefile.include b/tests/Makefile.include index b68911833f..04ffda66a5 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -65,8 +65,6 @@ tests/migration/initrd-stress.img: tests/migration/stress$(EXESUF) rm $(INITRD_WORK_DIR)/init rmdir $(INITRD_WORK_DIR) -tests/vhost-user-bridge$(EXESUF): tests/vhost-user-bridge.o $(test-util-obj-y) libvhost-user.a - SPEED = quick # gtester tests, possibly with verbose output diff --git a/tests/meson.build b/tests/meson.build index 34a5054514..f35dc85ca2 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -216,6 +216,15 @@ foreach test_name, extra: tests suite: ['unit']) endforeach + +if have_tools and 'CONFIG_VHOST_USER' in config_host + executable('vhost-user-bridge', + sources: files('vhost-user-bridge.c'), + link_with: [libvhost_user], + dependencies: [qemuutil], + build_by_default: false) +endif + if have_system and 'CONFIG_POSIX' in config_host subdir('qemu-iotests') endif From a52f4a7a5799341c250d4a27c220e53bad3f6b28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 28 Aug 2020 15:07:28 +0400 Subject: [PATCH 19/45] meson: convert atomic*-bench MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau Message-Id: <20200828110734.1638685-11-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- tests/Makefile.include | 5 ----- tests/meson.build | 10 ++++++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/Makefile.include b/tests/Makefile.include index 04ffda66a5..0388a0e4fd 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -44,11 +44,6 @@ check-speed-$(CONFIG_BLOCK) += tests/benchmark-crypto-cipher$(EXESUF) QEMU_CFLAGS += -I$(SRC_PATH)/tests -I$(SRC_PATH)/tests/qtest -# Deps that are common to various different sets of tests below -test-util-obj-y = libqemuutil.a -tests/atomic_add-bench$(EXESUF): tests/atomic_add-bench.o $(test-util-obj-y) -tests/atomic64-bench$(EXESUF): tests/atomic64-bench.o $(test-util-obj-y) - tests/benchmark-crypto-hash$(EXESUF): tests/benchmark-crypto-hash.o $(test-crypto-obj-y) tests/benchmark-crypto-hmac$(EXESUF): tests/benchmark-crypto-hmac.o $(test-crypto-obj-y) tests/benchmark-crypto-cipher$(EXESUF): tests/benchmark-crypto-cipher.o $(test-crypto-obj-y) diff --git a/tests/meson.build b/tests/meson.build index f35dc85ca2..3a3066b292 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -4,6 +4,16 @@ qht_bench = executable('qht-bench', sources: 'qht-bench.c', dependencies: [qemuutil]) +executable('atomic_add-bench', + sources: files('atomic_add-bench.c'), + dependencies: [qemuutil], + build_by_default: false) + +executable('atomic64-bench', + sources: files('atomic64-bench.c'), + dependencies: [qemuutil], + build_by_default: false) + test_qapi_outputs = [ 'qapi-builtin-types.c', 'qapi-builtin-types.h', From 24441f912e67233d9c52ce6b459ed75de2484525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 28 Aug 2020 15:07:30 +0400 Subject: [PATCH 20/45] tests: do not print benchmark output to stdout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As this makes the TAP output invalid. Use g_test_message(). Signed-off-by: Marc-André Lureau Reviewed-by: Philippe Mathieu-Daudé Message-Id: <20200828110734.1638685-13-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- tests/benchmark-crypto-cipher.c | 8 ++++---- tests/benchmark-crypto-hash.c | 2 +- tests/benchmark-crypto-hmac.c | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/benchmark-crypto-cipher.c b/tests/benchmark-crypto-cipher.c index 53032334ec..1936aa4ae0 100644 --- a/tests/benchmark-crypto-cipher.c +++ b/tests/benchmark-crypto-cipher.c @@ -70,8 +70,8 @@ static void test_cipher_speed(size_t chunk_size, } g_test_timer_elapsed(); - g_print("Enc chunk %zu bytes ", chunk_size); - g_print("%.2f MB/sec ", (double)total / MiB / g_test_timer_last()); + g_test_message("Enc chunk %zu bytes ", chunk_size); + g_test_message("%.2f MB/sec ", (double)total / MiB / g_test_timer_last()); g_test_timer_start(); remain = total; @@ -85,8 +85,8 @@ static void test_cipher_speed(size_t chunk_size, } g_test_timer_elapsed(); - g_print("Dec chunk %zu bytes ", chunk_size); - g_print("%.2f MB/sec ", (double)total / MiB / g_test_timer_last()); + g_test_message("Dec chunk %zu bytes ", chunk_size); + g_test_message("%.2f MB/sec ", (double)total / MiB / g_test_timer_last()); qcrypto_cipher_free(cipher); g_free(plaintext); diff --git a/tests/benchmark-crypto-hash.c b/tests/benchmark-crypto-hash.c index d16837d00a..598111e75a 100644 --- a/tests/benchmark-crypto-hash.c +++ b/tests/benchmark-crypto-hash.c @@ -48,7 +48,7 @@ static void test_hash_speed(const void *opaque) } g_test_timer_elapsed(); - g_print("%.2f MB/sec ", (double)total / MiB / g_test_timer_last()); + g_test_message("%.2f MB/sec ", (double)total / MiB / g_test_timer_last()); g_free(out); g_free(in); diff --git a/tests/benchmark-crypto-hmac.c b/tests/benchmark-crypto-hmac.c index f1dfa240cb..f9fa22df95 100644 --- a/tests/benchmark-crypto-hmac.c +++ b/tests/benchmark-crypto-hmac.c @@ -55,10 +55,10 @@ static void test_hmac_speed(const void *opaque) } while (g_test_timer_elapsed() < 5.0); total /= MiB; - g_print("hmac(sha256): "); - g_print("Testing chunk_size %zu bytes ", chunk_size); - g_print("done: %.2f MB in %.2f secs: ", total, g_test_timer_last()); - g_print("%.2f MB/sec\n", total / g_test_timer_last()); + g_test_message("hmac(sha256): "); + g_test_message("Testing chunk_size %zu bytes ", chunk_size); + g_test_message("done: %.2f MB in %.2f secs: ", total, g_test_timer_last()); + g_test_message("%.2f MB/sec\n", total / g_test_timer_last()); g_free(out); g_free(in); From 9ed7247a5969cf101ac3d22995ae06730b7da3ea Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 2 Sep 2020 07:25:19 -0400 Subject: [PATCH 21/45] meson: convert the speed tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use meson benchmark() for them, adjust mtest2make.py for that. A new target "make bench" can be used to run all benchmarks. Signed-off-by: Marc-André Lureau Message-Id: <20200828110734.1638685-14-marcandre.lureau@redhat.com> [Rewrite mtest2make part. - Paolo] Signed-off-by: Paolo Bonzini --- Makefile | 3 ++- scripts/mtest2make.py | 9 ++++++++- tests/Makefile.include | 15 ++++----------- tests/meson.build | 15 +++++++++++++++ 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index ed354c43b0..d4d6a67d96 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,7 @@ ${ninja-targets-c_COMPILER} ${ninja-targets-cpp_COMPILER}: .var.command += -MP # reread (and MESON won't be empty anymore). ifneq ($(MESON),) Makefile.mtest: build.ninja scripts/mtest2make.py - $(MESON) introspect --tests | $(PYTHON) scripts/mtest2make.py > $@ + $(MESON) introspect --tests --benchmarks | $(PYTHON) scripts/mtest2make.py > $@ -include Makefile.mtest endif @@ -283,6 +283,7 @@ help: @echo '' @echo 'Test targets:' $(call print-help,check,Run all tests (check-help for details)) + $(call print-help,bench,Run all benchmarks) $(call print-help,docker,Help about targets running tests inside containers) $(call print-help,vm-help,Help about targets running tests inside VM) @echo '' diff --git a/scripts/mtest2make.py b/scripts/mtest2make.py index af6dd0d3b1..9cbb2e374d 100644 --- a/scripts/mtest2make.py +++ b/scripts/mtest2make.py @@ -103,10 +103,17 @@ def emit_suite(name, suite, prefix): print('endif') testsuites = defaultdict(Suite) -for test in introspect: +for test in introspect['tests']: process_tests(test, testsuites) emit_prolog(testsuites, 'check') for name, suite in testsuites.items(): emit_suite(name, suite, 'check') +benchsuites = defaultdict(Suite) +for test in introspect['benchmarks']: + process_tests(test, benchsuites) +emit_prolog(benchsuites, 'bench') +for name, suite in benchsuites.items(): + emit_suite(name, suite, 'bench') + print('run-tests: $(patsubst %, run-test-%, $(.tests))') diff --git a/tests/Makefile.include b/tests/Makefile.include index 0388a0e4fd..fe22ccfcc6 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -38,16 +38,8 @@ export SRC_PATH SYSEMU_TARGET_LIST := $(subst -softmmu.mak,,$(notdir \ $(wildcard $(SRC_PATH)/default-configs/*-softmmu.mak))) -check-speed-$(CONFIG_BLOCK) += tests/benchmark-crypto-hash$(EXESUF) -check-speed-$(CONFIG_BLOCK) += tests/benchmark-crypto-hmac$(EXESUF) -check-speed-$(CONFIG_BLOCK) += tests/benchmark-crypto-cipher$(EXESUF) - QEMU_CFLAGS += -I$(SRC_PATH)/tests -I$(SRC_PATH)/tests/qtest -tests/benchmark-crypto-hash$(EXESUF): tests/benchmark-crypto-hash.o $(test-crypto-obj-y) -tests/benchmark-crypto-hmac$(EXESUF): tests/benchmark-crypto-hmac.o $(test-crypto-obj-y) -tests/benchmark-crypto-cipher$(EXESUF): tests/benchmark-crypto-cipher.o $(test-crypto-obj-y) - tests/migration/stress$(EXESUF): tests/migration/stress.o $(call quiet-command, $(LINKPROG) -static -O3 $(PTHREAD_LIB) -o $@ $< ,"LINK","$(TARGET_DIR)$@") @@ -97,9 +89,6 @@ define do_test_tap "TAP","$@") endef -check-speed: $(check-speed-y) - $(call do_test_human, $^) - # Per guest TCG tests BUILD_TCG_TARGET_RULES=$(patsubst %,build-tcg-tests-%, $(TARGET_DIRS)) @@ -212,6 +201,10 @@ check-clean: clean: check-clean +# For backwards compatibility + +check-speed: bench-speed + # Build the help program automatically -include $(wildcard tests/*.d) diff --git a/tests/meson.build b/tests/meson.build index 3a3066b292..94e34f72a8 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -111,6 +111,8 @@ test_deps = { 'test-qht-par': qht_bench, } +benchs = {} + if have_block tests += { 'test-coroutine': [testblock], @@ -167,6 +169,11 @@ if have_block if 'CONFIG_NETTLE' in config_host or 'CONFIG_GCRYPT' in config_host tests += {'test-crypto-pbkdf': [io]} endif + benchs += { + 'benchmark-crypto-hash': [crypto], + 'benchmark-crypto-hmac': [crypto], + 'benchmark-crypto-cipher': [crypto], + } endif if have_system @@ -226,6 +233,14 @@ foreach test_name, extra: tests suite: ['unit']) endforeach +foreach bench_name, deps: benchs + exe = executable(bench_name, bench_name + '.c', + dependencies: [qemuutil] + deps) + benchmark(bench_name, exe, + args: ['--tap', '-k'], + protocol: 'tap', + suite: ['speed']) +endforeach if have_tools and 'CONFIG_VHOST_USER' in config_host executable('vhost-user-bridge', From c4c4aacb24747429a1ecaa03bef1ceddb736c368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 28 Aug 2020 15:07:32 +0400 Subject: [PATCH 22/45] tests/migration/stress: remove unused exit_success MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau Message-Id: <20200828110734.1638685-15-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- tests/migration/stress.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/tests/migration/stress.c b/tests/migration/stress.c index a062ef6b55..05d85051e3 100644 --- a/tests/migration/stress.c +++ b/tests/migration/stress.c @@ -47,19 +47,6 @@ static __attribute__((noreturn)) void exit_failure(void) } } -static __attribute__((noreturn)) void exit_success(void) -{ - if (getpid() == 1) { - sync(); - reboot(RB_POWER_OFF); - fprintf(stderr, "%s (%05d): ERROR: cannot reboot: %s\n", - argv0, gettid(), strerror(errno)); - abort(); - } else { - exit(0); - } -} - static int get_command_arg_str(const char *name, char **val) { From 3909def82a699e4d628c07df948b4dd2656610ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 28 Aug 2020 15:07:33 +0400 Subject: [PATCH 23/45] meson: fix migration/stress compilation with glibc>=2.30 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gettid() was introduced with glibc 2.30. Signed-off-by: Marc-André Lureau Message-Id: <20200828110734.1638685-16-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- meson.build | 3 +++ tests/migration/stress.c | 2 ++ 2 files changed, 5 insertions(+) diff --git a/meson.build b/meson.build index f7cd2b6f73..3b73731bab 100644 --- a/meson.build +++ b/meson.build @@ -418,6 +418,8 @@ endif keyutils = dependency('libkeyutils', required: false, method: 'pkg-config', static: enable_static) +has_gettid = cc.has_function('gettid') + # Create config-host.h config_host_data.set('CONFIG_SDL', sdl.found()) @@ -428,6 +430,7 @@ config_host_data.set('CONFIG_VNC_PNG', png.found()) config_host_data.set('CONFIG_VNC_SASL', sasl.found()) config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found()) config_host_data.set('CONFIG_KEYUTILS', keyutils.found()) +config_host_data.set('CONFIG_GETTID', has_gettid) config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version())) config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0]) config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1]) diff --git a/tests/migration/stress.c b/tests/migration/stress.c index 05d85051e3..0c72a420be 100644 --- a/tests/migration/stress.c +++ b/tests/migration/stress.c @@ -29,10 +29,12 @@ const char *argv0; #define PAGE_SIZE 4096 +#ifndef CONFIG_GETTID static int gettid(void) { return syscall(SYS_gettid); } +#endif static __attribute__((noreturn)) void exit_failure(void) { From 4fbcdcd74237549d2d30facf670bf0006bcf5ea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 28 Aug 2020 15:07:34 +0400 Subject: [PATCH 24/45] meson: convert migration/initrd-stress MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau Message-Id: <20200828110734.1638685-17-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini --- tests/Makefile.include | 14 -------------- tests/meson.build | 1 + tests/migration/initrd-stress.sh | 10 ++++++++++ tests/migration/meson.build | 14 ++++++++++++++ 4 files changed, 25 insertions(+), 14 deletions(-) create mode 100755 tests/migration/initrd-stress.sh create mode 100644 tests/migration/meson.build diff --git a/tests/Makefile.include b/tests/Makefile.include index fe22ccfcc6..1592a647f4 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -38,20 +38,6 @@ export SRC_PATH SYSEMU_TARGET_LIST := $(subst -softmmu.mak,,$(notdir \ $(wildcard $(SRC_PATH)/default-configs/*-softmmu.mak))) -QEMU_CFLAGS += -I$(SRC_PATH)/tests -I$(SRC_PATH)/tests/qtest - -tests/migration/stress$(EXESUF): tests/migration/stress.o - $(call quiet-command, $(LINKPROG) -static -O3 $(PTHREAD_LIB) -o $@ $< ,"LINK","$(TARGET_DIR)$@") - -INITRD_WORK_DIR=tests/migration/initrd - -tests/migration/initrd-stress.img: tests/migration/stress$(EXESUF) - mkdir -p $(INITRD_WORK_DIR) - cp $< $(INITRD_WORK_DIR)/init - (cd $(INITRD_WORK_DIR) && (find | cpio --quiet -o -H newc | gzip -9)) > $@ - rm $(INITRD_WORK_DIR)/init - rmdir $(INITRD_WORK_DIR) - SPEED = quick # gtester tests, possibly with verbose output diff --git a/tests/meson.build b/tests/meson.build index 94e34f72a8..998e4c48f9 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -268,3 +268,4 @@ endif subdir('qapi-schema') subdir('qtest') +subdir('migration') diff --git a/tests/migration/initrd-stress.sh b/tests/migration/initrd-stress.sh new file mode 100755 index 0000000000..0f20ac29a6 --- /dev/null +++ b/tests/migration/initrd-stress.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +INITRD="$1" +STRESS="$2" + +INITRD_DIR=$(mktemp -d -p '' "initrd-stress.XXXXXX") +trap 'rm -rf $INITRD_DIR' EXIT + +cp "$STRESS" "$INITRD_DIR/init" +(cd "$INITRD_DIR" && (find | cpio --quiet -o -H newc | gzip -9)) > "$INITRD" diff --git a/tests/migration/meson.build b/tests/migration/meson.build new file mode 100644 index 0000000000..f215ee7d3a --- /dev/null +++ b/tests/migration/meson.build @@ -0,0 +1,14 @@ +stress = executable( + 'stress', + files('stress.c'), + dependencies: [glib], + link_args: ['-static'], + build_by_default: false, +) + +custom_target( + 'initrd-stress.img', + output: 'initrd-stress.img', + input: stress, + command: [find_program('initrd-stress.sh'), '@OUTPUT@', '@INPUT@'] +) From 0f4d8894df5c1f0d54b50331e36e8894757d9f7e Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 03:23:47 -0400 Subject: [PATCH 25/45] configure: remove dead code for in-tree builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The $pwd_is_source_path variable is never "y", since configure re-executes itself from a build directory. Remove code that will never run. Reviewed-by: Daniel P. Berrangé Signed-off-by: Paolo Bonzini --- configure | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/configure b/configure index 1471b35d96..cd17f3d65d 100755 --- a/configure +++ b/configure @@ -665,14 +665,6 @@ QEMU_INCLUDES="$QEMU_INCLUDES -iquote ${source_path}/disas/libvixl" CFLAGS="-std=gnu99 -Wall" -# running configure in the source tree? -# we know that's the case if configure is there. -if test -f "./configure"; then - pwd_is_source_path="y" -else - pwd_is_source_path="n" -fi - check_define() { cat > $TMPC < Date: Tue, 1 Sep 2020 05:32:23 -0400 Subject: [PATCH 26/45] meson: compute config_all_devices directly There is no need anymore to produce config-all-devices.mak, compute the resulting dictionary directly instead of going through grepy.sh. Signed-off-by: Paolo Bonzini --- .gitignore | 1 - meson.build | 14 ++------------ scripts/grepy.sh | 3 --- 3 files changed, 2 insertions(+), 16 deletions(-) delete mode 100755 scripts/grepy.sh diff --git a/.gitignore b/.gitignore index 4ccb9ed975..f3fbd87ce4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ /build/ /.doctrees /config-devices.* -/config-all-devices.* /config-all-disas.* /config-host.* /config-target.* diff --git a/meson.build b/meson.build index 3b73731bab..a6df2695a8 100644 --- a/meson.build +++ b/meson.build @@ -460,6 +460,7 @@ endforeach genh += configure_file(output: 'config-host.h', configuration: config_host_data) minikconf = find_program('scripts/minikconf.py') +config_all_devices = {} config_devices_mak_list = [] config_devices_h = {} config_target_h = {} @@ -528,11 +529,11 @@ foreach target : target_dirs config_devices_h += {target: configure_file(output: target + '-config-devices.h', configuration: config_devices_data)} config_target += config_devices + config_all_devices += config_devices endif config_target_mak += {target: config_target} endforeach -grepy = find_program('scripts/grepy.sh') # This configuration is used to build files that are shared by # multiple binaries, and then extracted out of the "common" # static_library target. @@ -542,17 +543,6 @@ grepy = find_program('scripts/grepy.sh') # targets that are not built for this compilation. The CONFIG_ALL # pseudo symbol replaces it. -if have_system - config_all_devices_mak = configure_file( - output: 'config-all-devices.mak', - input: config_devices_mak_list, - capture: true, - command: [grepy, '@INPUT@'], - ) - config_all_devices = keyval.load(config_all_devices_mak) -else - config_all_devices = {} -endif config_all = config_all_devices config_all += config_host config_all += config_all_disas diff --git a/scripts/grepy.sh b/scripts/grepy.sh deleted file mode 100755 index aee46ddc8d..0000000000 --- a/scripts/grepy.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -grep -h '=y$' "$@" | sort -u From 296bf3d12bee9483d5e7270520088e8974a789f5 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 05:31:46 -0400 Subject: [PATCH 27/45] Makefile: remove dead variables and includes Makefile.objs, the .d files and various CONFIG_* symbols are not used anymore by the Make side of the build; they are only processed by Meson. We can delete them. Signed-off-by: Paolo Bonzini --- Makefile | 20 -------------------- Makefile.objs | 34 ---------------------------------- tests/Makefile.include | 40 ---------------------------------------- 3 files changed, 94 deletions(-) delete mode 100644 Makefile.objs diff --git a/Makefile b/Makefile index d4d6a67d96..9bdf5fc072 100644 --- a/Makefile +++ b/Makefile @@ -80,13 +80,6 @@ seems to have been used for an in-tree build. You can fix this by running \ endif endif -CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y) -CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y) -CONFIG_XEN := $(CONFIG_XEN_BACKEND) -CONFIG_ALL=y --include config-all-devices.mak --include config-all-disas.mak - config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/pc-bios $(SRC_PATH)/VERSION @echo $@ is out-of-date, running configure @if test -f meson-private/coredata.dat; then \ @@ -117,9 +110,6 @@ build.ninja: config-host.mak include $(SRC_PATH)/rules.mak -# lor is defined in rules.mak -CONFIG_BLOCK := $(call lor,$(CONFIG_SOFTMMU),$(CONFIG_TOOLS)) - generated-files-y += .git-submodule-status # Don't try to regenerate Makefile or configure @@ -132,14 +122,8 @@ configure: ; $(call set-vpath, $(SRC_PATH)) -LIBS+=-lz $(LIBS_TOOLS) - SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory --quiet) BUILD_DIR=$(BUILD_DIR) -ifneq ($(wildcard config-host.mak),) -include $(SRC_PATH)/Makefile.objs -endif - include $(SRC_PATH)/tests/Makefile.include all: recurse-all @@ -256,10 +240,6 @@ Makefile: $(generated-files-y) endif endif -# Include automatically generated dependency files -# Dependencies in Makefile.objs files come from our recursive subdir rules --include $(wildcard *.d tests/*.d) - include $(SRC_PATH)/tests/docker/Makefile.include include $(SRC_PATH)/tests/vm/Makefile.include diff --git a/Makefile.objs b/Makefile.objs deleted file mode 100644 index c351b59641..0000000000 --- a/Makefile.objs +++ /dev/null @@ -1,34 +0,0 @@ -####################################################################### -# Common libraries for tools and emulators -qom-obj-y = qom/libqom.fa - -####################################################################### -# code used by both qemu system emulation and qemu-img - -ifeq ($(call lor,$(CONFIG_SOFTMMU),$(CONFIG_TOOLS)),y) - -authz-obj-y = authz/libauthz.fa -authz/libauthz.fa-libs = $(if $(CONFIG_AUTH_PAM),-lpam) - -block-obj-y += libblock.fa - -libblock.fa-libs = $(ZSTD_LIBS) -libblock.fa-libs += $(LIBNFS_LIBS) -libblock.fa-libs += $(LIBISCSI_LIBS) -libblock.fa-libs += $(CURL_LIBS) -libblock.fa-libs += $(RBD_LIBS) -libblock.fa-libs += $(GLUSTERFS_LIBS) -libblock.fa-libs += $(VXHS_LIBS) -libblock.fa-libs += $(LIBSSH_LIBS) -libblock.fa-libs += $(BZIP2_LIBS) -libblock.fa-libs += $(LZFSE_LIBS) -libblock.fa-libs += $(if $(CONFIG_LINUX_AIO),-laio) -libblock.fa-libs += $(LIBXML2_LIBS) - -chardev-obj-y = chardev/libchardev.fa - -crypto-obj-y = crypto/libcrypto.fa - -io-obj-y = io/libio.fa - -endif # CONFIG_SOFTMMU or CONFIG_TOOLS diff --git a/tests/Makefile.include b/tests/Makefile.include index 1592a647f4..f93e611220 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -40,41 +40,6 @@ SYSEMU_TARGET_LIST := $(subst -softmmu.mak,,$(notdir \ SPEED = quick -# gtester tests, possibly with verbose output -# do_test_tap runs all tests, even if some of them fail, while do_test_human -# stops at the first failure unless -k is given on the command line - -define do_test_human_k - $(quiet-@)rc=0; $(foreach COMMAND, $1, \ - $(call quiet-command-run, \ - export MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} $2; \ - $(COMMAND) -m=$(SPEED) -k --tap < /dev/null \ - | ./scripts/tap-driver.pl --test-name="$(notdir $(COMMAND))" $(if $(V),, --show-failures-only) \ - || rc=$$?;, "TEST", "$@: $(COMMAND)")) exit $$rc -endef -define do_test_human_no_k - $(foreach COMMAND, $1, \ - $(call quiet-command, \ - MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} $2 \ - $(COMMAND) -m=$(SPEED) -k --tap < /dev/null \ - | ./scripts/tap-driver.pl --test-name="$(notdir $(COMMAND))" $(if $(V),, --show-failures-only), \ - "TEST", "$@: $(COMMAND)") -) -endef -do_test_human = \ - $(if $(findstring k, $(MAKEFLAGS)), $(do_test_human_k), $(do_test_human_no_k)) - -define do_test_tap - $(call quiet-command, \ - { export MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} $2; \ - $(foreach COMMAND, $1, \ - $(COMMAND) -m=$(SPEED) -k --tap < /dev/null \ - | sed "s/^\(not \)\?ok [0-9]* /&$(notdir $(COMMAND)) /" || true; ) } \ - | ./scripts/tap-merge.pl | tee "$@" \ - | ./scripts/tap-driver.pl $(if $(V),, --show-failures-only), \ - "TAP","$@") -endef - # Per guest TCG tests BUILD_TCG_TARGET_RULES=$(patsubst %,build-tcg-tests-%, $(TARGET_DIRS)) @@ -182,7 +147,6 @@ endif check-build: $(QEMU_IOTESTS_HELPERS-y) check-clean: - rm -rf tests/*.o tests/*/*.o $(QEMU_IOTESTS_HELPERS-y) rm -rf $(TESTS_VENV_DIR) $(TESTS_RESULTS_DIR) clean: check-clean @@ -191,8 +155,4 @@ clean: check-clean check-speed: bench-speed -# Build the help program automatically - --include $(wildcard tests/*.d) - endif From 660f79309303d696531ffb394719dfab3e0c42c0 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 12:10:05 -0400 Subject: [PATCH 28/45] Makefile: inline the relevant parts of rules.mak Most of rules.mak is not used anymore, just inline what's needed. Signed-off-by: Paolo Bonzini --- Makefile | 38 ++++---- docs/devel/build-system.rst | 4 - rules.mak | 158 ---------------------------------- tests/docker/Makefile.include | 4 + tests/tcg/Makefile.qemu | 2 - 5 files changed, 26 insertions(+), 180 deletions(-) delete mode 100644 rules.mak diff --git a/Makefile b/Makefile index 9bdf5fc072..678e76d6f2 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,20 @@ BUILD_DIR=$(CURDIR) # Before including a proper config-host.mak, assume we are in the source tree SRC_PATH=. +# Don't use implicit rules or variables +# we have explicit rules for everything +MAKEFLAGS += -rR + +# Usage: $(call quiet-command,command and args,"NAME","args to print") +# This will run "command and args", and either: +# if V=1 just print the whole command and args +# otherwise print the 'quiet' output in the format " NAME args to print" +# NAME should be a short name of the command, 7 letters or fewer. +# If called with only a single argument, will print nothing in quiet mode. +quiet-command-run = $(if $(V),,$(if $2,printf " %-7s %s\n" $2 $3 && ))$1 +quiet-@ = $(if $(V),,@) +quiet-command = $(quiet-@)$(call quiet-command-run,$1,$2,$3) + UNCHECKED_GOALS := %clean TAGS cscope ctags dist \ help check-help print-% \ docker docker-% vm-help vm-test vm-build-% @@ -68,6 +82,7 @@ Makefile.mtest: build.ninja scripts/mtest2make.py -include Makefile.mtest endif +Makefile: .git-submodule-status .git-submodule-status: git-submodule-update config-host.mak # Check that we're not trying to do an out-of-tree build from @@ -108,10 +123,6 @@ ninja-clean:: ninja-distclean:: build.ninja: config-host.mak -include $(SRC_PATH)/rules.mak - -generated-files-y += .git-submodule-status - # Don't try to regenerate Makefile or configure # We don't generate any of them Makefile: ; @@ -120,9 +131,7 @@ configure: ; .PHONY: all clean cscope distclean install \ recurse-all dist msi FORCE -$(call set-vpath, $(SRC_PATH)) - -SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory --quiet) BUILD_DIR=$(BUILD_DIR) +SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory --quiet) include $(SRC_PATH)/tests/Makefile.include @@ -189,7 +198,6 @@ clean: recurse-clean ninja-clean clean-ctlist -exec rm {} + rm -f TAGS cscope.* *.pod *~ */*~ rm -f fsdev/*.pod scsi/*.pod - rm -f $(foreach f,$(generated-files-y),$(f) $(f)-timestamp) VERSION = $(shell cat $(SRC_PATH)/VERSION) @@ -232,14 +240,6 @@ cscope: # Needed by "meson install" export DESTDIR -# Add a dependency on the generated files, so that they are always -# rebuilt before other object files -ifneq ($(wildcard config-host.mak),) -ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail)) -Makefile: $(generated-files-y) -endif -endif - include $(SRC_PATH)/tests/docker/Makefile.include include $(SRC_PATH)/tests/vm/Makefile.include @@ -280,3 +280,9 @@ endif endif $(call print-help,$(MAKE) [targets],(quiet build, default)) $(call print-help,$(MAKE) V=1 [targets],(verbose build)) + +# will delete the target of a rule if commands exit with a nonzero exit status +.DELETE_ON_ERROR: + +print-%: + @echo '$*=$($*)' diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst index 0c09fb9a54..55f0576c07 100644 --- a/docs/devel/build-system.rst +++ b/docs/devel/build-system.rst @@ -401,10 +401,6 @@ number of dynamically created files listed later. executables. Build rules for various subdirectories are included in other meson.build files spread throughout the QEMU source tree. -`rules.mak` - This file provides the generic helper rules for invoking build tools, in - particular the compiler and linker. - `tests/Makefile.include` Rules for building the unit tests. This file is included directly by the top level Makefile, so anything defined in this file will influence the diff --git a/rules.mak b/rules.mak deleted file mode 100644 index c66c8218f0..0000000000 --- a/rules.mak +++ /dev/null @@ -1,158 +0,0 @@ - -# These are used when we want to do substitutions without confusing Make -NULL := -SPACE := $(NULL) # -COMMA := , - -# Don't use implicit rules or variables -# we have explicit rules for everything -MAKEFLAGS += -rR - -# Files with this suffixes are final, don't try to generate them -# using implicit rules -%/trace-events: -%.hx: -%.py: -%.objs: -%.d: -%.h: -%.c: -%.cc: -%.cpp: -%.m: -%.mak: - -# Flags for dependency generation -QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(@D)/$(*F).d - -# Compiler searches the source file dir first, but in vpath builds -# we need to make it search the build dir too, before any other -# explicit search paths. There are two search locations in the build -# dir, one absolute and the other relative to the compiler working -# directory. These are the same for target-independent files, but -# different for target-dependent ones. -QEMU_LOCAL_INCLUDES = -iquote $(BUILD_DIR) -iquote $(BUILD_DIR)/$(@D) -iquote $(@D) - -WL := -Wl, -ifdef CONFIG_DARWIN -whole-archive = $(WL)-force_load,$1 -else -whole-archive = $(WL)--whole-archive $1 $(WL)--no-whole-archive -endif - -extract-libs = $(strip $(foreach o,$1,$($o-libs))) - -%.o: %.c - @mkdir -p $(dir $@) - $(call quiet-command,$(CC) $(QEMU_LOCAL_INCLUDES) $(QEMU_INCLUDES) \ - $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) \ - -c -o $@ $<,"CC","$(TARGET_DIR)$@") - -# If we have a CXX we might have some C++ objects, in which case we -# must link with the C++ compiler, not the plain C compiler. -LINKPROG = $(or $(CXX),$(CC)) - -LINK = $(call quiet-command, $(LINKPROG) $(CFLAGS) $(QEMU_LDFLAGS) -o $@ \ - $(filter-out %.a %.fa,$1) \ - $(foreach l,$(filter %.fa,$1),$(call whole-archive,$l)) \ - $(filter %.a,$1) \ - $(call extract-libs,$1) $(LIBS),"LINK","$(TARGET_DIR)$@") - -%.o: %.S - $(call quiet-command,$(CCAS) $(QEMU_LOCAL_INCLUDES) $(QEMU_INCLUDES) \ - $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) \ - -c -o $@ $<,"CCAS","$(TARGET_DIR)$@") - -%.o: %.cc - $(call quiet-command,$(CXX) $(QEMU_LOCAL_INCLUDES) $(QEMU_INCLUDES) \ - $(QEMU_CXXFLAGS) $(QEMU_DGFLAGS) $(CXXFLAGS) $($@-cflags) \ - -c -o $@ $<,"CXX","$(TARGET_DIR)$@") - -%.o: %.cpp - $(call quiet-command,$(CXX) $(QEMU_LOCAL_INCLUDES) $(QEMU_INCLUDES) \ - $(QEMU_CXXFLAGS) $(QEMU_DGFLAGS) $(CXXFLAGS) $($@-cflags) \ - -c -o $@ $<,"CXX","$(TARGET_DIR)$@") - -%.o: %.m - $(call quiet-command,$(OBJCC) $(QEMU_LOCAL_INCLUDES) $(QEMU_INCLUDES) \ - $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) $($@-cflags) \ - -c -o $@ $<,"OBJC","$(TARGET_DIR)$@") - -%.o: %.dtrace - $(call quiet-command,dtrace -o $@ -G -s $<,"GEN","$(TARGET_DIR)$@") - -.PHONY: modules -modules: - -%$(EXESUF): %.o - $(call LINK,$(filter %.o %.a %.fa, $^)) - -%.a: - $(call quiet-command,rm -f $@ && $(AR) rcs $@ $^,"AR","$(TARGET_DIR)$@") - -# Usage: $(call quiet-command,command and args,"NAME","args to print") -# This will run "command and args", and either: -# if V=1 just print the whole command and args -# otherwise print the 'quiet' output in the format " NAME args to print" -# NAME should be a short name of the command, 7 letters or fewer. -# If called with only a single argument, will print nothing in quiet mode. -quiet-command-run = $(if $(V),,$(if $2,printf " %-7s %s\n" $2 $3 && ))$1 -quiet-@ = $(if $(V),,@) -quiet-command = $(quiet-@)$(call quiet-command-run,$1,$2,$3) - -# cc-option -# Usage: CFLAGS+=$(call cc-option, -falign-functions=0, -malign-functions=0) - -cc-option = $(if $(shell $(CC) $1 $2 -S -o /dev/null -xc /dev/null \ - >/dev/null 2>&1 && echo OK), $2, $3) -cc-c-option = $(if $(shell $(CC) $1 $2 -c -o /dev/null -xc /dev/null \ - >/dev/null 2>&1 && echo OK), $2, $3) - -VPATH_SUFFIXES = %.c %.h %.S %.cc %.cpp %.m %.mak %.texi %.sh %.rc Kconfig% %.json.in -set-vpath = $(if $1,$(foreach PATTERN,$(VPATH_SUFFIXES),$(eval vpath $(PATTERN) $1))) - -# install-prog list, dir -define install-prog - $(INSTALL_DIR) "$2" - $(INSTALL_PROG) $1 "$2" - $(if $(STRIP),$(STRIP) $(foreach T,$1,"$2/$(notdir $T)"),) -endef - -# Logical functions (for operating on y/n values like CONFIG_FOO vars) -# Inputs to these must be either "y" (true) or "n" or "" (both false) -# Output is always either "y" or "n". -# Usage: $(call land,$(CONFIG_FOO),$(CONFIG_BAR)) -# Logical NOT -lnot = $(if $(subst n,,$1),n,y) -# Logical AND -land = $(if $(findstring yy,$1$2),y,n) -# Logical OR -lor = $(if $(findstring y,$1$2),y,n) -# Logical XOR (note that this is the inverse of leqv) -lxor = $(if $(filter $(call lnot,$1),$(call lnot,$2)),n,y) -# Logical equivalence (note that leqv "","n" is true) -leqv = $(if $(filter $(call lnot,$1),$(call lnot,$2)),y,n) -# Logical if: like make's $(if) but with an leqv-like test -lif = $(if $(subst n,,$1),$2,$3) - -# String testing functions: inputs to these can be any string; -# the output is always either "y" or "n". Leading and trailing whitespace -# is ignored when comparing strings. -# String equality -eq = $(if $(subst $2,,$1)$(subst $1,,$2),n,y) -# String inequality -ne = $(if $(subst $2,,$1)$(subst $1,,$2),y,n) -# Emptiness/non-emptiness tests: -isempty = $(if $1,n,y) -notempty = $(if $1,y,n) - -.PHONY: clean-timestamp -clean-timestamp: - rm -f *.timestamp -clean: clean-timestamp - -# will delete the target of a rule if commands exit with a nonzero exit status -.DELETE_ON_ERROR: - -print-%: - @echo '$*=$($*)' diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include index 9119dff97d..3daabaa2fd 100644 --- a/tests/docker/Makefile.include +++ b/tests/docker/Makefile.include @@ -2,6 +2,10 @@ .PHONY: docker docker-test docker-clean docker-image docker-qemu-src +NULL := +SPACE := $(NULL) # +COMMA := , + HOST_ARCH = $(if $(ARCH),$(ARCH),$(shell uname -m)) DOCKER_SUFFIX := .docker diff --git a/tests/tcg/Makefile.qemu b/tests/tcg/Makefile.qemu index f8ad4c47be..0332bad10f 100644 --- a/tests/tcg/Makefile.qemu +++ b/tests/tcg/Makefile.qemu @@ -8,8 +8,6 @@ # to do it for us. # -include $(SRC_PATH)/rules.mak - # The configure script fills in extra information about # useful docker images or alternative compiler flags. From ca0fc78431fb313cba7c23a38ad7af092a73e06a Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 06:04:28 -0400 Subject: [PATCH 29/45] configure: move disassembler configuration to meson Signed-off-by: Paolo Bonzini --- .gitignore | 1 - configure | 89 ----------------------------------------------- disas/meson.build | 4 +-- meson.build | 45 +++++++++++++++++++++++- 4 files changed, 45 insertions(+), 94 deletions(-) diff --git a/.gitignore b/.gitignore index f3fbd87ce4..b6fdd34ddf 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ /build/ /.doctrees /config-devices.* -/config-all-disas.* /config-host.* /config-target.* /config.status diff --git a/configure b/configure index cd17f3d65d..b439b78a9b 100755 --- a/configure +++ b/configure @@ -6612,8 +6612,6 @@ QEMU_LDFLAGS="$fdt_ldflags $QEMU_LDFLAGS" config_host_mak="config-host.mak" -echo "# Automatically generated by configure - do not modify" >config-all-disas.mak - echo "# Automatically generated by configure - do not modify" > $config_host_mak echo >> $config_host_mak @@ -7919,93 +7917,6 @@ if test "$target_bsd_user" = "yes" ; then echo "CONFIG_BSD_USER=y" >> $config_target_mak fi - -# generate QEMU_CFLAGS/QEMU_LDFLAGS for targets - -disas_config() { - echo "CONFIG_${1}_DIS=y" >> $config_target_mak - echo "CONFIG_${1}_DIS=y" >> config-all-disas.mak -} - -for i in $ARCH $TARGET_BASE_ARCH ; do - case "$i" in - alpha) - disas_config "ALPHA" - ;; - aarch64) - if test -n "${cxx}"; then - disas_config "ARM_A64" - fi - ;; - arm) - disas_config "ARM" - if test -n "${cxx}"; then - disas_config "ARM_A64" - fi - ;; - avr) - disas_config "AVR" - ;; - cris) - disas_config "CRIS" - ;; - hppa) - disas_config "HPPA" - ;; - i386|x86_64|x32) - disas_config "I386" - ;; - lm32) - disas_config "LM32" - ;; - m68k) - disas_config "M68K" - ;; - microblaze*) - disas_config "MICROBLAZE" - ;; - mips*) - disas_config "MIPS" - if test -n "${cxx}"; then - disas_config "NANOMIPS" - fi - ;; - moxie*) - disas_config "MOXIE" - ;; - nios2) - disas_config "NIOS2" - ;; - or1k) - disas_config "OPENRISC" - ;; - ppc*) - disas_config "PPC" - ;; - riscv*) - disas_config "RISCV" - ;; - rx) - disas_config "RX" - ;; - s390*) - disas_config "S390" - ;; - sh4) - disas_config "SH4" - ;; - sparc*) - disas_config "SPARC" - ;; - xtensa*) - disas_config "XTENSA" - ;; - esac -done -if test "$tcg_interpreter" = "yes" ; then - disas_config "TCI" -fi - done # for target in $targets if [ "$fdt" = "git" ]; then diff --git a/disas/meson.build b/disas/meson.build index 0527d69128..bde8280c73 100644 --- a/disas/meson.build +++ b/disas/meson.build @@ -22,6 +22,4 @@ common_ss.add(when: 'CONFIG_SH4_DIS', if_true: files('sh4.c')) common_ss.add(when: 'CONFIG_SPARC_DIS', if_true: files('sparc.c')) common_ss.add(when: 'CONFIG_XTENSA_DIS', if_true: files('xtensa.c')) -# TODO: As long as the TCG interpreter and its generated code depend -# on the QEMU target, we cannot compile the disassembler here. -#common_ss.add(when: 'CONFIG_TCI_DIS', if_true: files('tci.c')) +specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('tci.c')) diff --git a/meson.build b/meson.build index a6df2695a8..6fbe79ae94 100644 --- a/meson.build +++ b/meson.build @@ -14,7 +14,6 @@ ss = import('sourceset') sh = find_program('sh') cc = meson.get_compiler('c') config_host = keyval.load(meson.current_build_dir() / 'config-host.mak') -config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak') enable_modules = 'CONFIG_MODULES' in config_host enable_static = 'CONFIG_STATIC' in config_host build_docs = 'BUILD_DOCS' in config_host @@ -461,10 +460,44 @@ genh += configure_file(output: 'config-host.h', configuration: config_host_data) minikconf = find_program('scripts/minikconf.py') config_all_devices = {} +config_all_disas = {} config_devices_mak_list = [] config_devices_h = {} config_target_h = {} config_target_mak = {} + +disassemblers = { + 'alpha' : ['CONFIG_ALPHA_DIS'], + 'arm' : ['CONFIG_ARM_DIS'], + 'avr' : ['CONFIG_AVR_DIS'], + 'cris' : ['CONFIG_CRIS_DIS'], + 'hppa' : ['CONFIG_HPPA_DIS'], + 'i386' : ['CONFIG_I386_DIS'], + 'x86_64' : ['CONFIG_I386_DIS'], + 'x32' : ['CONFIG_I386_DIS'], + 'lm32' : ['CONFIG_LM32_DIS'], + 'm68k' : ['CONFIG_M68K_DIS'], + 'microblaze' : ['CONFIG_MICROBLAZE_DIS'], + 'mips' : ['CONFIG_MIPS_DIS'], + 'moxie' : ['CONFIG_MOXIE_DIS'], + 'nios2' : ['CONFIG_NIOS2_DIS'], + 'or1k' : ['CONFIG_OPENRISC_DIS'], + 'ppc' : ['CONFIG_PPC_DIS'], + 'riscv' : ['CONFIG_RISCV_DIS'], + 'rx' : ['CONFIG_RX_DIS'], + 's390' : ['CONFIG_S390_DIS'], + 'sh4' : ['CONFIG_SH4_DIS'], + 'sparc' : ['CONFIG_SPARC_DIS'], + 'xtensa' : ['CONFIG_XTENSA_DIS'], +} +if link_language == 'cpp' + disassemblers += { + 'aarch64' : [ 'CONFIG_ARM_A64_DIS'], + 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'], + 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'], + } +endif + kconfig_external_symbols = [ 'CONFIG_KVM', 'CONFIG_XEN', @@ -480,9 +513,19 @@ kconfig_external_symbols = [ 'CONFIG_PVRDMA', ] ignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS'] + foreach target : target_dirs config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + foreach k, v: disassemblers + if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k) + foreach sym: v + config_target += { sym: 'y' } + config_all_disas += { sym: 'y' } + endforeach + endif + endforeach + config_target_data = configuration_data() foreach k, v: config_target if not k.startswith('TARGET_') and not k.startswith('CONFIG_') From 201e8ed7df00cffe6df967bd42903c1cbcecd721 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 07:45:54 -0400 Subject: [PATCH 30/45] meson: keep all compiler flags detection together Signed-off-by: Paolo Bonzini --- meson.build | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/meson.build b/meson.build index 6fbe79ae94..d619cd901e 100644 --- a/meson.build +++ b/meson.build @@ -32,6 +32,23 @@ endforeach have_tools = 'CONFIG_TOOLS' in config_host have_block = have_system or have_tools +python = import('python').find_installation() + +supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux'] +supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64', + 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64'] + +cpu = host_machine.cpu_family() +targetos = host_machine.system() + +configure_file(input: files('scripts/ninjatool.py'), + output: 'ninjatool', + configuration: config_host) + +################## +# Compiler flags # +################## + add_project_arguments(config_host['QEMU_CFLAGS'].split(), native: false, language: ['c', 'objc']) add_project_arguments(config_host['QEMU_CXXFLAGS'].split(), @@ -41,8 +58,6 @@ add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(), add_project_arguments(config_host['QEMU_INCLUDES'].split(), language: ['c', 'cpp', 'objc']) -python = import('python').find_installation() - link_language = meson.get_external_property('link_language', 'cpp') if link_language == 'cpp' add_languages('cpp', required: true, native: false) @@ -58,17 +73,6 @@ if 'SPARSE_CFLAGS' in config_host 'compile_commands.json']) endif -configure_file(input: files('scripts/ninjatool.py'), - output: 'ninjatool', - configuration: config_host) - -supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux'] -supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64', - 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64'] - -cpu = host_machine.cpu_family() -targetos = host_machine.system() - m = cc.find_library('m', required: false) util = cc.find_library('util', required: false) winmm = [] From ccf7afa59e070b0cc65618af91dc01105f04e566 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 06:44:23 -0400 Subject: [PATCH 31/45] configure: move -ldl test to meson Signed-off-by: Paolo Bonzini --- accel/tcg/meson.build | 2 +- configure | 1 - meson.build | 4 ++++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/accel/tcg/meson.build b/accel/tcg/meson.build index 2a335b50f2..96a76ed23d 100644 --- a/accel/tcg/meson.build +++ b/accel/tcg/meson.build @@ -9,7 +9,7 @@ tcg_ss.add(files( )) tcg_ss.add(when: 'CONFIG_USER_ONLY', if_true: files('user-exec.c')) tcg_ss.add(when: 'CONFIG_SOFTMMU', if_false: files('user-exec-stub.c')) -tcg_ss.add(when: 'CONFIG_PLUGIN', if_true: files('plugin-gen.c')) +tcg_ss.add(when: 'CONFIG_PLUGIN', if_true: [files('plugin-gen.c'), libdl]) specific_ss.add_all(when: 'CONFIG_TCG', if_true: tcg_ss) specific_ss.add(when: ['CONFIG_SOFTMMU', 'CONFIG_TCG'], if_true: files('tcg-all.c', 'cputlb.c')) diff --git a/configure b/configure index b439b78a9b..255d54e069 100755 --- a/configure +++ b/configure @@ -7463,7 +7463,6 @@ fi if test "$plugins" = "yes" ; then echo "CONFIG_PLUGIN=y" >> $config_host_mak - LIBS="-ldl $LIBS" # Copy the export object list to the build dir if test "$ld_dynamic_list" = "yes" ; then echo "CONFIG_HAS_LD_DYNAMIC_LIST=yes" >> $config_host_mak diff --git a/meson.build b/meson.build index d619cd901e..8cc26fd859 100644 --- a/meson.build +++ b/meson.build @@ -211,6 +211,10 @@ libmpathpersist = not_found if config_host.has_key('CONFIG_MPATH') libmpathpersist = cc.find_library('mpathpersist') endif +libdl = not_found +if 'CONFIG_PLUGIN' in config_host + libdl = cc.find_library('dl', required: true) +endif libiscsi = not_found if 'CONFIG_LIBISCSI' in config_host libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(), From 3fc1aad3864b77df504ea4c61faa751a5a5a2244 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 06:29:11 -0400 Subject: [PATCH 32/45] configure: remove unnecessary libm test The same test is already performed by meson.build. Signed-off-by: Paolo Bonzini --- configure | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/configure b/configure index 255d54e069..ca3ca7664f 100755 --- a/configure +++ b/configure @@ -4993,20 +4993,6 @@ if test "$libiscsi" != "no" ; then fi fi -########################################## -# Do we need libm -cat > $TMPC << EOF -#include -int main(int argc, char **argv) { return isnan(sin((double)argc)); } -EOF -if compile_prog "" "" ; then - : -elif compile_prog "" "-lm" ; then - LIBS="-lm $LIBS" -else - error_exit "libm check failed" -fi - ########################################## # Do we need librt # uClibc provides 2 versions of clock_gettime(), one with realtime From b6daf4d3699fe255202e9a0866633ed2f2248497 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 06:38:04 -0400 Subject: [PATCH 33/45] configure: do not look for install(1) It is not used anymore, so there is no Solaris-specific check to perform. Signed-off-by: Paolo Bonzini --- configure | 53 ++----------------------------------- docs/devel/build-system.rst | 4 --- meson.build | 1 - 3 files changed, 2 insertions(+), 56 deletions(-) diff --git a/configure b/configure index ca3ca7664f..bd41f51d6d 100755 --- a/configure +++ b/configure @@ -192,36 +192,6 @@ has() { type "$1" >/dev/null 2>&1 } -# search for an executable in PATH -path_of() { - local_command="$1" - local_ifs="$IFS" - local_dir="" - - # pathname has a dir component? - if [ "${local_command#*/}" != "$local_command" ]; then - if [ -x "$local_command" ] && [ ! -d "$local_command" ]; then - echo "$local_command" - return 0 - fi - fi - if [ -z "$local_command" ]; then - return 1 - fi - - IFS=: - for local_dir in $PATH; do - if [ -x "$local_dir/$local_command" ] && [ ! -d "$local_dir/$local_command" ]; then - echo "$local_dir/$local_command" - IFS="${local_ifs:-$(printf ' \t\n')}" - return 0 - fi - done - # not found - IFS="${local_ifs:-$(printf ' \t\n')}" - return 1 -} - version_ge () { local_ver1=`echo $1 | tr . ' '` local_ver2=`echo $2 | tr . ' '` @@ -912,7 +882,6 @@ Darwin) SunOS) solaris="yes" make="${MAKE-gmake}" - install="${INSTALL-ginstall}" smbd="${SMBD-/usr/sfw/sbin/smbd}" if test -f /usr/include/sys/soundcard.h ; then audio_drv_list="oss try-sdl" @@ -948,7 +917,7 @@ if [ "$bsd" = "yes" ] ; then fi : ${make=${MAKE-make}} -: ${install=${INSTALL-install}} + # We prefer python 3.x. A bare 'python' is traditionally # python 2.x, but some distros have it as python 3.x, so # we check that too @@ -1035,7 +1004,7 @@ for opt do ;; --make=*) make="$optarg" ;; - --install=*) install="$optarg" + --install=*) ;; --python=*) python="$optarg" ; explicit_python=yes ;; @@ -1816,7 +1785,6 @@ Advanced options (experts only): --cross-cc-ARCH=CC use compiler when building ARCH guest test cases --cross-cc-flags-ARCH= use compiler flags when building ARCH guest tests --make=MAKE use specified make [$make] - --install=INSTALL use specified install [$install] --python=PYTHON use specified python [$python] --sphinx-build=SPHINX use specified sphinx-build [$sphinx_build] --meson=MESON use specified meson [$meson] @@ -2334,18 +2302,6 @@ fi # Solaris specific configure tool chain decisions if test "$solaris" = "yes" ; then - if has $install; then - : - else - error_exit "Solaris install program not found. Use --install=/usr/ucb/install or" \ - "install fileutils from www.blastwave.org using pkg-get -i fileutils" \ - "to get ginstall which is used by default (which lives in /opt/csw/bin)" - fi - if test "$(path_of $install)" = "/usr/sbin/install" ; then - error_exit "Solaris /usr/sbin/install is not an appropriate install program." \ - "try ginstall from the GNU fileutils available from www.blastwave.org" \ - "using pkg-get -i fileutils, or use --install=/usr/ucb/install" - fi if has ar; then : else @@ -7493,11 +7449,6 @@ fi echo "ROMS=$roms" >> $config_host_mak echo "MAKE=$make" >> $config_host_mak -echo "INSTALL=$install" >> $config_host_mak -echo "INSTALL_DIR=$install -d -m 0755" >> $config_host_mak -echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak -echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak -echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak echo "PYTHON=$python" >> $config_host_mak echo "SPHINX_BUILD=$sphinx_build" >> $config_host_mak echo "GENISOIMAGE=$genisoimage" >> $config_host_mak diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst index 55f0576c07..28492cfcae 100644 --- a/docs/devel/build-system.rst +++ b/docs/devel/build-system.rst @@ -136,10 +136,6 @@ developers in checking for system features: Determine if $COMMAND exists in the current environment, either as a shell builtin, or executable binary, returning 0 on success. -`path_of $COMMAND` - Return the fully qualified path of $COMMAND, printing it to stdout, - and returning 0 on success. - `check_define $NAME` Determine if the macro $NAME is defined by the system C compiler diff --git a/meson.build b/meson.build index 8cc26fd859..22fc4bc875 100644 --- a/meson.build +++ b/meson.build @@ -1344,7 +1344,6 @@ summary_info += {'CFLAGS': config_host['CFLAGS']} summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']} summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']} summary_info += {'make': config_host['MAKE']} -summary_info += {'install': config_host['INSTALL']} summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())} summary_info += {'sphinx-build': config_host['SPHINX_BUILD']} summary_info += {'genisoimage': config_host['GENISOIMAGE']} From 215b0c2fa5c9864343373f5a3e6680611dabef20 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 08:41:17 -0400 Subject: [PATCH 34/45] meson: get glib compilation flags from GLIB_CFLAGS The glib compilation flags were added to QEMU_CFLAGS. While we still want them to be added to all compilation commands (at least for now), do that via GLIB_CFLAGS rather than via QEMU_CFLAGS. This shows that glib is a special case and makes it clearer that QEMU_CFLAGS is only about compiler commands and not dependencies. Signed-off-by: Paolo Bonzini --- configure | 19 +++++++++---------- meson.build | 7 +++++-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/configure b/configure index bd41f51d6d..f2a3a1164c 100755 --- a/configure +++ b/configure @@ -3761,24 +3761,23 @@ if test "$plugins" = yes; then glib_modules="$glib_modules gmodule-2.0" 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 - QEMU_CFLAGS="-DGLIB_STATIC_COMPILATION $QEMU_CFLAGS" -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) - QEMU_CFLAGS="$glib_cflags $QEMU_CFLAGS" LIBS="$glib_libs $LIBS" else error_exit "glib-$glib_req_ver $i is required to compile QEMU" fi done +# 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 + if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then gio=yes gio_cflags=$($pkg_config --cflags gio-2.0) @@ -3813,7 +3812,7 @@ int main(void) { } EOF -if ! compile_prog "$CFLAGS" "$LIBS" ; then +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"\ @@ -3828,7 +3827,7 @@ EOF if ! compile_prog "$glib_cflags -Werror" "$glib_libs" ; then if cc_has_warning_flag "-Wno-unknown-attributes"; then glib_cflags="-Wno-unknown-attributes $glib_cflags" - QEMU_CFLAGS="-Wno-unknown-attributes $CFLAGS" + CFLAGS="-Wno-unknown-attributes $CFLAGS" fi fi diff --git a/meson.build b/meson.build index 22fc4bc875..689fc2269c 100644 --- a/meson.build +++ b/meson.build @@ -104,8 +104,11 @@ elif targetos == 'haiku' cc.find_library('network'), cc.find_library('bsd')] endif -glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(), - link_args: config_host['GLIB_LIBS'].split()) +# The path to glib.h is added to all compilation commands. This was +# grandfathered in from the QEMU Makefiles. +add_project_arguments(config_host['GLIB_CFLAGS'].split(), + native: false, language: ['c', 'cpp', 'objc']) +glib = declare_dependency(link_args: config_host['GLIB_LIBS'].split()) gio = not_found if 'CONFIG_GIO' in config_host gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(), From de2d30051a460e220817b5b5ae6e86bd5609b2b7 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 08:41:17 -0400 Subject: [PATCH 35/45] meson: get opengl compilation flags from OPENGL_CFLAGS The opengl compilation flags were added to QEMU_CFLAGS. We do not want them to be added to all compilation commands, so export them also via OPENGL_CFLAGS rather than via QEMU_CFLAGS. Signed-off-by: Paolo Bonzini --- configure | 1 + meson.build | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/configure b/configure index f2a3a1164c..1b1a4ce800 100755 --- a/configure +++ b/configure @@ -7054,6 +7054,7 @@ fi if test "$opengl" = "yes" ; then echo "CONFIG_OPENGL=y" >> $config_host_mak + echo "OPENGL_CFLAGS=$opengl_cflags" >> $config_host_mak echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak if test "$opengl_dmabuf" = "yes" ; then echo "CONFIG_OPENGL_DMABUF=y" >> $config_host_mak diff --git a/meson.build b/meson.build index 689fc2269c..071ef2688a 100644 --- a/meson.build +++ b/meson.build @@ -307,7 +307,8 @@ if 'CONFIG_AUDIO_COREAUDIO' in config_host endif opengl = not_found if 'CONFIG_OPENGL' in config_host - opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split()) + opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(), + link_args: config_host['OPENGL_LIBS'].split()) else endif gtk = not_found From feabc71dfa5807427b6b1a0f8db00d994399210d Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 06:15:41 -0400 Subject: [PATCH 36/45] configure: do not include dependency flags in QEMU_CFLAGS and LIBS All Meson executables should specify their dependencies explicitly, either directly or indirectly via declare_dependency. Makefiles instead did not propagate dependencies correctly from static libraries, for example. Therefore, flags for dependencies need not be included in QEMU_CFLAGS. LIBS is not used at all, so drop that one as well. In a few cases the dependencies were not yet specified, so add them. Signed-off-by: Paolo Bonzini --- Makefile | 2 +- configure | 40 ---------------------------------------- hw/arm/meson.build | 2 +- hw/mips/meson.build | 2 +- hw/riscv/meson.build | 2 +- monitor/meson.build | 2 +- ui/meson.build | 3 ++- 7 files changed, 7 insertions(+), 46 deletions(-) diff --git a/Makefile b/Makefile index 678e76d6f2..d6c5c9fdef 100644 --- a/Makefile +++ b/Makefile @@ -155,7 +155,7 @@ dtc/%: .git-submodule-status # Therefore we replicate some of the logic in the sub-makefile. # Remove all the extra -Warning flags that QEMU uses that Capstone doesn't; # no need to annoy QEMU developers with such things. -CAP_CFLAGS = $(patsubst -W%,,$(CFLAGS) $(QEMU_CFLAGS)) +CAP_CFLAGS = $(patsubst -W%,,$(CFLAGS) $(QEMU_CFLAGS)) $(CAPSTONE_CFLAGS) CAP_CFLAGS += -DCAPSTONE_USE_SYS_DYN_MEM CAP_CFLAGS += -DCAPSTONE_HAS_ARM CAP_CFLAGS += -DCAPSTONE_HAS_ARM64 diff --git a/configure b/configure index 1b1a4ce800..c3664b1519 100755 --- a/configure +++ b/configure @@ -833,7 +833,6 @@ FreeBSD) audio_drv_list="oss try-sdl" audio_possible_drivers="oss sdl pa" # needed for kinfo_getvmmap(3) in libutil.h - LIBS="-lutil $LIBS" netmap="" # enable netmap autodetect HOST_VARIANT_DIR="freebsd" ;; @@ -891,13 +890,10 @@ SunOS) QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS" # needed for TIOCWIN* defines in termios.h QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS" - solarisnetlibs="-lsocket -lnsl -lresolv" - LIBS="$solarisnetlibs $LIBS" ;; Haiku) haiku="yes" QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -DBSD_SOURCE $QEMU_CFLAGS" - LIBS="-lposix_error_mapper -lnetwork -lbsd $LIBS" ;; Linux) audio_drv_list="try-pa oss" @@ -967,11 +963,7 @@ if test "$mingw32" = "yes" ; then HOST_DSOSUF=".dll" # MinGW needs -mthreads for TLS and macro _MT. CFLAGS="-mthreads $CFLAGS" - LIBS="-lwinmm -lws2_32 $LIBS" write_c_skeleton; - if compile_prog "" "-liberty" ; then - LIBS="-liberty $LIBS" - fi prefix="c:/Program Files/QEMU" qemu_suffix="" libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga" @@ -2692,7 +2684,6 @@ if test "$xen" != "no" ; then if $pkg_config --exists xentoolcore; then xen_pc="$xen_pc xentoolcore" fi - QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags $xen_pc)" xen_cflags="$($pkg_config --cflags $xen_pc)" xen_libs="$($pkg_config --libs $xen_pc)" else @@ -3077,8 +3068,6 @@ if test "$gnutls" != "no"; then # At least ubuntu 18.04 ships only shared libraries. write_c_skeleton if compile_prog "" "$gnutls_libs" ; then - LIBS="$gnutls_libs $LIBS" - QEMU_CFLAGS="$QEMU_CFLAGS $gnutls_cflags" pass="yes" fi fi @@ -3148,8 +3137,6 @@ if test "$nettle" != "no"; then # Link test to make sure the given libraries work (e.g for static). write_c_skeleton if compile_prog "" "$nettle_libs" ; then - LIBS="$nettle_libs $LIBS" - QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags" if test -z "$gcrypt"; then gcrypt="no" fi @@ -3192,8 +3179,6 @@ if test "$gcrypt" != "no"; then # Link test to make sure the given libraries work (e.g for static). write_c_skeleton if compile_prog "" "$gcrypt_libs" ; then - LIBS="$gcrypt_libs $LIBS" - QEMU_CFLAGS="$QEMU_CFLAGS $gcrypt_cflags" pass="yes" fi fi @@ -3765,7 +3750,6 @@ 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) - LIBS="$glib_libs $LIBS" else error_exit "glib-$glib_req_ver $i is required to compile QEMU" fi @@ -4075,11 +4059,6 @@ if test "$linux_io_uring" != "no" ; then linux_io_uring_cflags=$($pkg_config --cflags liburing) linux_io_uring_libs=$($pkg_config --libs liburing) linux_io_uring=yes - - # io_uring is used in libqemuutil.a where per-file -libs variables are not - # seen by programs linking the archive. It's not ideal, but just add the - # library dependency globally. - LIBS="$linux_io_uring_libs $LIBS" else if test "$linux_io_uring" = "yes" ; then feature_not_found "linux io_uring" "Install liburing devel" @@ -4124,7 +4103,6 @@ EOF elif compile_prog "-DCONFIG_LIBATTR" "-lattr" ; then attr=yes libattr_libs="-lattr" - LIBS="$libattr_libs $LIBS" libattr=yes else if test "$attr" = "yes" ; then @@ -4244,7 +4222,6 @@ if test "$opengl" != "no" ; then if test "$gtk" = "yes" && $pkg_config --exists "$gtkpackage >= 3.16"; then gtk_gl="yes" fi - QEMU_CFLAGS="$QEMU_CFLAGS $opengl_cflags" else if test "$opengl" = "yes" ; then feature_not_found "opengl" "Please install opengl (mesa) devel pkgs: $opengl_pkgs" @@ -4999,7 +4976,6 @@ EOF $pkg_config --atleast-version=0.12.3 spice-protocol && \ compile_prog "$spice_cflags" "$spice_libs" ; then spice="yes" - QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags" else if test "$spice" = "yes" ; then feature_not_found "spice" \ @@ -5182,7 +5158,6 @@ case "$capstone" in git_submodules="${git_submodules} capstone" fi mkdir -p capstone - QEMU_CFLAGS="$QEMU_CFLAGS -I${source_path}/capstone/include" if test "$mingw32" = "yes"; then LIBCAPSTONE=capstone.lib else @@ -5195,7 +5170,6 @@ case "$capstone" in system) capstone_libs="$($pkg_config --libs capstone)" capstone_cflags="$($pkg_config --cflags capstone)" - QEMU_CFLAGS="$QEMU_CFLAGS $($pkg_config --cflags capstone)" ;; no) @@ -5344,8 +5318,6 @@ EOF else urcu_bp_libs="-lurcu-bp" fi - - LIBS="$lttng_ust_libs $urcu_bp_libs $LIBS" else error_exit "Trace backend 'ust' missing lttng-ust header files" fi @@ -6126,7 +6098,6 @@ if test "$libpmem" != "no"; then libpmem="yes" libpmem_libs=$($pkg_config --libs libpmem) libpmem_cflags=$($pkg_config --cflags libpmem) - QEMU_CFLAGS="$QEMU_CFLAGS $libpmem_cflags" else if test "$libpmem" = "yes" ; then feature_not_found "libpmem" "Install nvml or pmdk" @@ -6143,7 +6114,6 @@ if test "$libdaxctl" != "no"; then libdaxctl="yes" libdaxctl_libs=$($pkg_config --libs libdaxctl) libdaxctl_cflags=$($pkg_config --cflags libdaxctl) - QEMU_CFLAGS="$QEMU_CFLAGS $libdaxctl_cflags" else if test "$libdaxctl" = "yes" ; then feature_not_found "libdaxctl" "Install libdaxctl" @@ -6326,11 +6296,6 @@ if test "$libudev" != "no" ; then fi fi -# Now we've finished running tests it's OK to add -Werror to the compiler flags -if test "$werror" = "yes"; then - QEMU_CFLAGS="-Werror $QEMU_CFLAGS" -fi - # Exclude --warn-common with TSan to suppress warnings from the TSan libraries. if test "$solaris" = "no" && test "$tsan" = "no"; then if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then @@ -6547,10 +6512,6 @@ echo_version() { fi } -# prepend ftd flags after all config tests are done -QEMU_CFLAGS="$fdt_cflags $QEMU_CFLAGS" -QEMU_LDFLAGS="$fdt_ldflags $QEMU_LDFLAGS" - config_host_mak="config-host.mak" echo "# Automatically generated by configure - do not modify" > $config_host_mak @@ -7485,7 +7446,6 @@ echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak echo "LD_REL_FLAGS=$LD_REL_FLAGS" >> $config_host_mak echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak -echo "LIBS+=$LIBS" >> $config_host_mak echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak echo "EXESUF=$EXESUF" >> $config_host_mak diff --git a/hw/arm/meson.build b/hw/arm/meson.build index 1ae5e17eeb..8480b7f37d 100644 --- a/hw/arm/meson.build +++ b/hw/arm/meson.build @@ -1,5 +1,5 @@ arm_ss = ss.source_set() -arm_ss.add(files('boot.c')) +arm_ss.add(files('boot.c'), fdt) arm_ss.add(when: 'CONFIG_PLATFORM_BUS', if_true: files('sysbus-fdt.c')) arm_ss.add(when: 'CONFIG_ARM_VIRT', if_true: files('virt.c')) arm_ss.add(when: 'CONFIG_ACPI', if_true: files('virt-acpi-build.c')) diff --git a/hw/mips/meson.build b/hw/mips/meson.build index 6ac9dc4cff..46294b7382 100644 --- a/hw/mips/meson.build +++ b/hw/mips/meson.build @@ -4,7 +4,7 @@ mips_ss.add(when: 'CONFIG_FULOONG', if_true: files('fuloong2e.c')) mips_ss.add(when: 'CONFIG_JAZZ', if_true: files('jazz.c')) mips_ss.add(when: 'CONFIG_MALTA', if_true: files('gt64xxx_pci.c', 'malta.c')) mips_ss.add(when: 'CONFIG_MIPSSIM', if_true: files('mipssim.c')) -mips_ss.add(when: 'CONFIG_MIPS_BOSTON', if_true: files('boston.c')) +mips_ss.add(when: 'CONFIG_MIPS_BOSTON', if_true: [files('boston.c'), fdt]) mips_ss.add(when: 'CONFIG_MIPS_CPS', if_true: files('cps.c')) mips_ss.add(when: 'CONFIG_R4K', if_true: files('r4k.c')) diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build index 25af9db75e..fe2ea75f65 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -1,5 +1,5 @@ riscv_ss = ss.source_set() -riscv_ss.add(files('boot.c')) +riscv_ss.add(files('boot.c'), fdt) riscv_ss.add(files('numa.c')) riscv_ss.add(when: 'CONFIG_HART', if_true: files('riscv_hart.c')) riscv_ss.add(when: 'CONFIG_OPENTITAN', if_true: files('opentitan.c')) diff --git a/monitor/meson.build b/monitor/meson.build index 0484a64341..eb2a534fdc 100644 --- a/monitor/meson.build +++ b/monitor/meson.build @@ -6,4 +6,4 @@ softmmu_ss.add(files( 'qmp-cmds.c', )) -specific_ss.add(when: 'CONFIG_SOFTMMU', if_true: files('misc.c')) +specific_ss.add(when: 'CONFIG_SOFTMMU', if_true: [files('misc.c'), spice]) diff --git a/ui/meson.build b/ui/meson.build index 82f60756d9..dd6c110136 100644 --- a/ui/meson.build +++ b/ui/meson.build @@ -1,5 +1,5 @@ softmmu_ss.add(pixman) -specific_ss.add(pixman) # for the include path +specific_ss.add(when: ['CONFIG_SOFTMMU'], if_true: pixman) # for the include path softmmu_ss.add(files( 'console.c', @@ -35,6 +35,7 @@ softmmu_ss.add_all(when: vnc, if_true: vnc_ss) softmmu_ss.add(when: vnc, if_false: files('vnc-stubs.c')) softmmu_ss.add(when: [opengl, 'CONFIG_OPENGL'], if_true: files('shader.c', 'console-gl.c', 'egl-helpers.c', 'egl-context.c')) softmmu_ss.add(when: [opengl, 'CONFIG_OPENGL_DMABUF'], if_true: files('egl-headless.c')) +specific_ss.add(when: ['CONFIG_SOFTMMU'], if_true: opengl) ui_modules = {} From f2995ee4cb1cd866ce523a51cbee7f3359a4466b Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 06:28:38 -0400 Subject: [PATCH 37/45] configure: drop dead variables and functions Signed-off-by: Paolo Bonzini --- configure | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/configure b/configure index c3664b1519..4b2ceb094d 100755 --- a/configure +++ b/configure @@ -331,7 +331,6 @@ audio_drv_list="" block_drv_rw_whitelist="" block_drv_ro_whitelist="" host_cc="cc" -libs_tools="" audio_win_int="" libs_qga="" debug_info="yes" @@ -439,7 +438,6 @@ mingw32="no" gcov="no" EXESUF="" HOST_DSOSUF=".so" -LDFLAGS_SHARED="-shared" modules="no" module_upgrades="no" prefix="/usr/local" @@ -864,7 +862,6 @@ Darwin) darwin="yes" hax="yes" hvf="yes" - LDFLAGS_SHARED="-bundle -undefined dynamic_lookup" if [ "$cpu" = "x86_64" ] ; then QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS" QEMU_LDFLAGS="-arch x86_64 $QEMU_LDFLAGS" @@ -4947,7 +4944,7 @@ elif compile_prog "" "$pthread_lib -lrt" ; then LIBS="$LIBS -lrt" fi -# Check whether we need to link libutil for openpty() +# Check whether we have openpty() in either libc or libutil cat > $TMPC << EOF extern int openpty(int *am, int *as, char *name, void *termp, void *winp); int main(void) { return openpty(0, 0, 0, 0, 0); } @@ -4958,7 +4955,6 @@ if compile_prog "" "" ; then have_openpty="yes" else if compile_prog "" "-lutil" ; then - libs_tools="-lutil $libs_tools" have_openpty="yes" fi fi @@ -6506,12 +6502,6 @@ else cxx= fi -echo_version() { - if test "$1" = "yes" ; then - echo "($2)" - fi -} - config_host_mak="config-host.mak" echo "# Automatically generated by configure - do not modify" > $config_host_mak @@ -7432,7 +7422,6 @@ echo "NM=$nm" >> $config_host_mak echo "PKG_CONFIG=$pkg_config_exe" >> $config_host_mak echo "WINDRES=$windres" >> $config_host_mak echo "CFLAGS=$CFLAGS" >> $config_host_mak -echo "CXXFLAGS=$CXXFLAGS" >> $config_host_mak echo "CFLAGS_NOPIE=$CFLAGS_NOPIE" >> $config_host_mak echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak echo "QEMU_CXXFLAGS=$QEMU_CXXFLAGS" >> $config_host_mak @@ -7444,13 +7433,10 @@ if test "$sparse" = "yes" ; then fi echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak echo "LDFLAGS_NOPIE=$LDFLAGS_NOPIE" >> $config_host_mak -echo "LD_REL_FLAGS=$LD_REL_FLAGS" >> $config_host_mak echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak -echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak echo "PTHREAD_LIB=$PTHREAD_LIB" >> $config_host_mak echo "EXESUF=$EXESUF" >> $config_host_mak echo "HOST_DSOSUF=$HOST_DSOSUF" >> $config_host_mak -echo "LDFLAGS_SHARED=$LDFLAGS_SHARED" >> $config_host_mak echo "LIBS_QGA=$libs_qga" >> $config_host_mak echo "TASN1_LIBS=$tasn1_libs" >> $config_host_mak echo "TASN1_CFLAGS=$tasn1_cflags" >> $config_host_mak From 738aa606248ba4c04ca666f42db234c750728050 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 1 Sep 2020 06:38:25 -0400 Subject: [PATCH 38/45] docs: suggest Meson replacements for various configure functions Signed-off-by: Paolo Bonzini --- docs/devel/build-system.rst | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst index 28492cfcae..591e93f4b4 100644 --- a/docs/devel/build-system.rst +++ b/docs/devel/build-system.rst @@ -125,23 +125,27 @@ developers in checking for system features: `compile_object $CFLAGS` Attempt to compile a test program with the system C compiler using $CFLAGS. The test program must have been previously written to a file - called $TMPC. + called $TMPC. The replacement in Meson is the compiler object `cc`, + which has methods such as `cc.compiles()`, + `cc.check_header()`, `cc.has_function()`. `compile_prog $CFLAGS $LDFLAGS` Attempt to compile a test program with the system C compiler using $CFLAGS and link it with the system linker using $LDFLAGS. The test program must have been previously written to a file called $TMPC. + The replacement in Meson is `cc.find_library()` and `cc.links()`. `has $COMMAND` Determine if $COMMAND exists in the current environment, either as a - shell builtin, or executable binary, returning 0 on success. + shell builtin, or executable binary, returning 0 on success. The + replacement in Meson is `find_program()`. `check_define $NAME` Determine if the macro $NAME is defined by the system C compiler `check_include $NAME` Determine if the include $NAME file is available to the system C - compiler + compiler. The replacement in Meson is `cc.has_header()`. `write_c_skeleton` Write a minimal C program main() function to the temporary file From 5d91a2ed799cc0fe4e96c8c8786353c00a64c8ed Mon Sep 17 00:00:00 2001 From: Yonggang Luo Date: Thu, 3 Sep 2020 01:00:49 +0800 Subject: [PATCH 39/45] configure: update dtc submodule Update the dtc submodule in configure already and symlink dtc after git submodule update, because on win32 symlinks to non-existing folders are forbidden. Signed-off-by: Yonggang Luo Message-Id: <20200902170054.810-2-luoyonggang@gmail.com> Signed-off-by: Paolo Bonzini --- configure | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/configure b/configure index 4b2ceb094d..ba8c6e6c5d 100755 --- a/configure +++ b/configure @@ -2003,9 +2003,6 @@ fi if test "$meson" = git; then git_submodules="${git_submodules} meson" fi -if test "$git_update" = yes; then - (cd "${source_path}" && GIT="$git" "./scripts/git-submodule.sh" update "$git_submodules") -fi case "$meson" in git | internal) @@ -4184,7 +4181,6 @@ EOF if test -d "${source_path}/dtc/libfdt" || test -e "${source_path}/.git" ; then fdt=git mkdir -p dtc - symlink "$source_path/dtc/Makefile" "dtc/Makefile" fdt_cflags="-I${source_path}/dtc/libfdt" fdt_ldflags="-Ldtc/libfdt" fdt_libs="$fdt_libs" @@ -6502,6 +6498,13 @@ else cxx= fi +if test $git_update = 'yes' ; then + (cd "${source_path}" && GIT="$git" "./scripts/git-submodule.sh" update "$git_submodules") +fi +if test "$fdt" = "git" ; then + symlink "$source_path/dtc/Makefile" "dtc/Makefile" +fi + config_host_mak="config-host.mak" echo "# Automatically generated by configure - do not modify" > $config_host_mak From 789035f1239054331b335801a06bdbef026f02e1 Mon Sep 17 00:00:00 2001 From: Alexander Bulekov Date: Wed, 2 Sep 2020 10:26:57 -0400 Subject: [PATCH 40/45] oss-fuzz: fix rpath Prior to this change, readelf -d build/out/qemu/qemu-fuzz-i386-target-virtio-net-slirp ... 0x000000000000000f (RPATH) Library rpath: ['$$ORIGIN/lib':$ORIGIN/migration:$ORIGIN/] As of 1a4db552d8 ("ninjatool: quote dollars in variables"), we don't need to manually double the dollars. Also, remove the single-quotes as they are copied into the rpath. After this change: 0x000000000000000f (RPATH) Library rpath: [$ORIGIN/lib:$ORIGIN/migration:$ORIGIN/] Signed-off-by: Alexander Bulekov Message-Id: <20200902142657.112879-3-alxndr@bu.edu> Signed-off-by: Paolo Bonzini --- scripts/oss-fuzz/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/oss-fuzz/build.sh b/scripts/oss-fuzz/build.sh index f0b7442c96..d16207eb67 100755 --- a/scripts/oss-fuzz/build.sh +++ b/scripts/oss-fuzz/build.sh @@ -81,7 +81,7 @@ rm qemu-fuzz-i386 # Build a second time to build the final binary with correct rpath ../configure --disable-werror --cc="$CC" --cxx="$CXX" --enable-fuzzing \ --prefix="$DEST_DIR" --bindir="$DEST_DIR" --datadir="$DEST_DIR/data/" \ - --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="-Wl,-rpath,'\$\$ORIGIN/lib'" \ + --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="-Wl,-rpath,\$ORIGIN/lib" \ --target-list="i386-softmmu" make "-j$(nproc)" qemu-fuzz-i386 V=1 From c46f76d15869be27e5c9420f6a1733c3cfafc1a1 Mon Sep 17 00:00:00 2001 From: Alexander Bulekov Date: Wed, 2 Sep 2020 13:36:50 -0400 Subject: [PATCH 41/45] meson: specify fuzz linker script as a project arg With this change, the fuzzer-linker script should be specified outside any --start-group/--end-group pairs. We need this on oss-fuzz, where partially applying the linker-script results in a linker failure Signed-off-by: Alexander Bulekov Message-Id: <20200902173652.307222-2-alxndr@bu.edu> Signed-off-by: Paolo Bonzini --- meson.build | 9 ++++++++- tests/qtest/fuzz/meson.build | 3 --- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/meson.build b/meson.build index 071ef2688a..64e5e8af3e 100644 --- a/meson.build +++ b/meson.build @@ -58,6 +58,14 @@ add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(), add_project_arguments(config_host['QEMU_INCLUDES'].split(), language: ['c', 'cpp', 'objc']) +# Specify linker-script with add_project_link_arguments so that it is not placed +# within a linker --start-group/--end-group pair +if 'CONFIG_FUZZ' in config_host + add_project_link_arguments(['-Wl,-T,', + (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')], + native: false, language: ['c', 'cpp', 'objc']) +endif + link_language = meson.get_external_property('link_language', 'cpp') if link_language == 'cpp' add_languages('cpp', required: true, native: false) @@ -1084,7 +1092,6 @@ foreach target : target_dirs 'gui': false, 'sources': specific_fuzz.sources(), 'dependencies': specific_fuzz.dependencies(), - 'link_depends': [files('tests/qtest/fuzz/fork_fuzz.ld')], }] endif else diff --git a/tests/qtest/fuzz/meson.build b/tests/qtest/fuzz/meson.build index bb0a3f271d..bcc393828e 100644 --- a/tests/qtest/fuzz/meson.build +++ b/tests/qtest/fuzz/meson.build @@ -6,11 +6,8 @@ specific_fuzz_ss.add(when: 'CONFIG_I440FX', if_true: files('i440fx_fuzz.c')) specific_fuzz_ss.add(when: 'CONFIG_VIRTIO_NET', if_true: files('virtio_net_fuzz.c')) specific_fuzz_ss.add(when: 'CONFIG_VIRTIO_SCSI', if_true: files('virtio_scsi_fuzz.c')) -# unfortunately declare_dependency does not support link_depends, so -# this will be duplicated in meson.build fork_fuzz = declare_dependency( link_args: ['-fsanitize=fuzzer', - '-Wl,-T,' + (meson.current_source_dir() / 'fork_fuzz.ld'), '-Wl,-wrap,qtest_inb', '-Wl,-wrap,qtest_inw', '-Wl,-wrap,qtest_inl', From 54c9e41d47daa38219a53311cbc1c4e602709aee Mon Sep 17 00:00:00 2001 From: Alexander Bulekov Date: Wed, 2 Sep 2020 13:36:51 -0400 Subject: [PATCH 42/45] fuzz: Add support for custom fuzzing library On oss-fuzz, we must use the LIB_FUZZING_ENGINE and CFLAGS environment variables, rather than -fsanitize=fuzzer. With this change, when LIB_FUZZING_ENGINE is set, the --enable-fuzzing configure option will use that environment variable during the linking stage, rather than -fsanitize=fuzzer Signed-off-by: Alexander Bulekov Message-Id: <20200902173652.307222-3-alxndr@bu.edu> Signed-off-by: Paolo Bonzini --- configure | 12 ++++++++++-- tests/qtest/fuzz/meson.build | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/configure b/configure index ba8c6e6c5d..53723ace57 100755 --- a/configure +++ b/configure @@ -6048,7 +6048,7 @@ fi ########################################## # checks for fuzzer -if test "$fuzzing" = "yes" ; then +if test "$fuzzing" = "yes" && test -z "${LIB_FUZZING_ENGINE+xxx}"; then write_c_fuzzer_skeleton if compile_prog "$CPU_CFLAGS -Werror -fsanitize=fuzzer" ""; then have_fuzzer=yes @@ -7354,7 +7354,14 @@ if test "$have_mlockall" = "yes" ; then echo "HAVE_MLOCKALL=y" >> $config_host_mak fi if test "$fuzzing" = "yes" ; then - QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link" + # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the + # needed CFLAGS have already been provided + if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then + QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link" + FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer" + else + FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE" + fi fi if test "$plugins" = "yes" ; then @@ -7455,6 +7462,7 @@ fi if test "$fuzzing" != "no"; then echo "CONFIG_FUZZ=y" >> $config_host_mak fi +echo "FUZZ_EXE_LDFLAGS=$FUZZ_EXE_LDFLAGS" >> $config_host_mak if test "$edk2_blobs" = "yes" ; then echo "DECOMPRESS_EDK2_BLOBS=y" >> $config_host_mak diff --git a/tests/qtest/fuzz/meson.build b/tests/qtest/fuzz/meson.build index bcc393828e..b31ace7d5a 100644 --- a/tests/qtest/fuzz/meson.build +++ b/tests/qtest/fuzz/meson.build @@ -7,8 +7,8 @@ specific_fuzz_ss.add(when: 'CONFIG_VIRTIO_NET', if_true: files('virtio_net_fuzz. specific_fuzz_ss.add(when: 'CONFIG_VIRTIO_SCSI', if_true: files('virtio_scsi_fuzz.c')) fork_fuzz = declare_dependency( - link_args: ['-fsanitize=fuzzer', - '-Wl,-wrap,qtest_inb', + link_args: config_host['FUZZ_EXE_LDFLAGS'].split() + + ['-Wl,-wrap,qtest_inb', '-Wl,-wrap,qtest_inw', '-Wl,-wrap,qtest_inl', '-Wl,-wrap,qtest_outb', From 604f3e4e90c011a6b94fdc1d13700f3ec2375f2a Mon Sep 17 00:00:00 2001 From: Yonggang Luo Date: Thu, 3 Sep 2020 01:00:50 +0800 Subject: [PATCH 43/45] meson: Convert undefsym.sh to undefsym.py Shell scripts are not easily invoked from the build process on MSYS, so convert undefsym.sh to a python script. Signed-off-by: Yonggang Luo Message-Id: <20200902170054.810-3-luoyonggang@gmail.com> Signed-off-by: Paolo Bonzini --- meson.build | 2 +- scripts/undefsym.py | 49 +++++++++++++++++++++++++++++++++++++++++++++ scripts/undefsym.sh | 20 ------------------ 3 files changed, 50 insertions(+), 21 deletions(-) create mode 100644 scripts/undefsym.py delete mode 100755 scripts/undefsym.sh diff --git a/meson.build b/meson.build index 64e5e8af3e..5421eca66a 100644 --- a/meson.build +++ b/meson.build @@ -932,7 +932,7 @@ foreach d, list : modules endforeach nm = find_program('nm') -undefsym = find_program('scripts/undefsym.sh') +undefsym = find_program('scripts/undefsym.py') block_syms = custom_target('block.syms', output: 'block.syms', input: [libqemuutil, block_mods], capture: true, diff --git a/scripts/undefsym.py b/scripts/undefsym.py new file mode 100644 index 0000000000..69a895cd26 --- /dev/null +++ b/scripts/undefsym.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 + +# Before a shared module's DSO is produced, a static library is built for it +# and passed to this script. The script generates -Wl,-u options to force +# the inclusion of symbol from libqemuutil.a if the shared modules need them, +# This is necessary because the modules may use functions not needed by the +# executable itself, which would cause the function to not be linked in. +# Then the DSO loading would fail because of the missing symbol. + + +import sys +import subprocess + +def filter_lines_set(stdout, from_staticlib): + linesSet = set() + for line in stdout.splitlines(): + tokens = line.split(b' ') + if len(tokens) >= 1: + if len(tokens) > 1: + if from_staticlib and tokens[1] == b'U': + continue + if not from_staticlib and tokens[1] != b'U': + continue + new_line = b'-Wl,-u,' + tokens[0] + if not new_line in linesSet: + linesSet.add(new_line) + return linesSet + +def main(args): + if len(args) <= 3: + sys.exit(0) + + nm = args[1] + staticlib = args[2] + pc = subprocess.run([nm, "-P", "-g", staticlib], stdout=subprocess.PIPE) + if pc.returncode != 0: + sys.exit(1) + staticlib_syms = filter_lines_set(pc.stdout, True) + + shared_modules = args[3:] + pc = subprocess.run([nm, "-P", "-g"] + shared_modules, stdout=subprocess.PIPE) + if pc.returncode != 0: + sys.exit(1) + modules_undef_syms = filter_lines_set(pc.stdout, False) + lines = sorted(staticlib_syms.intersection(modules_undef_syms)) + sys.stdout.buffer.write(b'\n'.join(lines)) + +if __name__ == "__main__": + main(sys.argv) diff --git a/scripts/undefsym.sh b/scripts/undefsym.sh deleted file mode 100755 index b9ec332e95..0000000000 --- a/scripts/undefsym.sh +++ /dev/null @@ -1,20 +0,0 @@ -#! /usr/bin/env bash - -# Before a shared module's DSO is produced, a static library is built for it -# and passed to this script. The script generates -Wl,-u options to force -# the inclusion of symbol from libqemuutil.a if the shared modules need them, -# This is necessary because the modules may use functions not needed by the -# executable itself, which would cause the function to not be linked in. -# Then the DSO loading would fail because of the missing symbol. - -if test $# -le 2; then - exit 0 -fi - -NM=$1 -staticlib=$2 -shift 2 -# Find symbols defined in static libraries and undefined in shared modules -comm -12 \ - <( $NM -P -g $staticlib | awk '$2!="U"{print "-Wl,-u," $1}' | sort -u) \ - <( $NM -P -g "$@" | awk '$2=="U"{print "-Wl,-u," $1}' | sort -u) From fd6c986d90832e0ff5bfcf338bc54da21b7e27d6 Mon Sep 17 00:00:00 2001 From: Bruce Rogers Date: Thu, 3 Sep 2020 09:29:33 -0600 Subject: [PATCH 44/45] meson: remove linkage of sdl to baum Ever since commit 537fe2d63f744e7c96ff45b60d09486a81958e06 there has been a 'linkage' to sdl for compiling baum.c. Originally it had to do with including sdl cflags for any file including sdl headers. There is no longer any such need for baum.c, but the association has persisted in the make system, and with the switch to meson it has now become a hard requirement, which now causes chardev-baum.so to not be produced if sdl is not configured. Remove this bogus linkage. Signed-off-by: Bruce Rogers Message-Id: <20200903152933.97838-1-brogers@suse.com> Signed-off-by: Paolo Bonzini --- chardev/meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chardev/meson.build b/chardev/meson.build index 27a9a28f4c..54e88d0310 100644 --- a/chardev/meson.build +++ b/chardev/meson.build @@ -36,9 +36,9 @@ softmmu_ss.add(when: ['CONFIG_SPICE', spice], if_true: files('spice.c')) chardev_modules = {} -if config_host.has_key('CONFIG_BRLAPI') and sdl.found() +if config_host.has_key('CONFIG_BRLAPI') module_ss = ss.source_set() - module_ss.add(when: [sdl, brlapi], if_true: [files('baum.c'), pixman]) + module_ss.add(when: [brlapi], if_true: [files('baum.c'), pixman]) chardev_modules += { 'baum': module_ss } endif From ef6a0d6e3927464de67f70cb13abbfe67361e0c9 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Mon, 7 Sep 2020 18:39:13 +0200 Subject: [PATCH 45/45] docs: update build system documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Most of the Makefile bits are obsolete and can be removed. Reviewed-by: Philippe Mathieu-Daudé Signed-off-by: Paolo Bonzini --- docs/devel/build-system.rst | 97 +++++-------------------------------- 1 file changed, 11 insertions(+), 86 deletions(-) diff --git a/docs/devel/build-system.rst b/docs/devel/build-system.rst index 591e93f4b4..08e85c69e1 100644 --- a/docs/devel/build-system.rst +++ b/docs/devel/build-system.rst @@ -179,7 +179,7 @@ process for: - Userspace emulators - qemu-$ARCH - - Some (but not all) unit tests + - Unit tests 2) documentation @@ -204,8 +204,9 @@ are then turned into static libraries as follows:: chardev = declare_dependency(link_whole: libchardev) -The special `.fa` suffix is needed as long as unit tests are built with -the older Makefile infrastructure, and will go away later. +As of Meson 0.55.1, the special `.fa` suffix should be used for everything +that is used with `link_whole`, to ensure that the link flags are placed +correctly in the command line. Files linked into emulator targets there can be split into two distinct groups of files, those which are independent of the QEMU emulation target and @@ -221,7 +222,8 @@ only in system emulators, `user_ss` only in user-mode emulators. In the target-dependent set lives CPU emulation, device emulation and much glue code. This sometimes also has to be compiled multiple times, -once for each target being built. +once for each target being built. Target-dependent files are included +in the `specific_ss` sourceset. All binaries link with a static library `libqemuutil.a`, which is then linked to all the binaries. `libqemuutil.a` is built from several @@ -300,84 +302,9 @@ The resulting build system is largely non-recursive in nature, in contrast to common practices seen with automake. Tests are also ran by the Makefile with the traditional `make check` -phony target. Meson test suites such as `unit` can be ran with `make -check-unit` too. It is also possible to run tests defined in meson.build -with `meson test`. - -The following text is only relevant for unit tests which still have to -be converted to Meson. - -All binaries should link to `libqemuutil.a`, e.g.: - - qemu-img$(EXESUF): qemu-img.o ..snip.. libqemuutil.a - -On Windows, all binaries have the suffix `.exe`, so all Makefile rules -which create binaries must include the $(EXESUF) variable on the binary -name. e.g. - - qemu-img$(EXESUF): qemu-img.o ..snip.. - -This expands to `.exe` on Windows, or an empty string on other platforms. - -Variable naming ---------------- - -The QEMU convention is to define variables to list different groups of -object files. These are named with the convention $PREFIX-obj-y. The -Meson `chardev` variable in the previous example corresponds to a -variable 'chardev-obj-y'. - -Likewise, tests that are executed by `make check-unit` are grouped into -a variable check-unit-y, like this: - - check-unit-y += tests/test-visitor-serialization$(EXESUF) - check-unit-y += tests/test-iov$(EXESUF) - check-unit-y += tests/test-bitmap$(EXESUF) - -When a test or object file which needs to be conditionally built based -on some characteristic of the host system, the configure script will -define a variable for the conditional. For example, on Windows it will -define $(CONFIG_POSIX) with a value of 'n' and $(CONFIG_WIN32) with a -value of 'y'. It is now possible to use the config variables when -listing object files. For example, - - check-unit-$(CONFIG_POSIX) += tests/test-vmstate$(EXESUF) - -On Windows this expands to - - check-unit-n += tests/vmstate.exe - -Since the `check-unit` target only runs tests included in `$(check-unit-y)`, -POSIX specific tests listed in `$(util-obj-n)` are ignored on the Windows -platform builds. - - -CFLAGS / LDFLAGS / LIBS handling --------------------------------- - -There are many different binaries being built with differing purposes, -and some of them might even be 3rd party libraries pulled in via git -submodules. As such the use of the global CFLAGS variable is generally -avoided in QEMU, since it would apply to too many build targets. - -Flags that are needed by any QEMU code (i.e. everything *except* GIT -submodule projects) are put in $(QEMU_CFLAGS) variable. For linker -flags the $(LIBS) variable is sometimes used, but a couple of more -targeted variables are preferred. - -In addition to these variables, it is possible to provide cflags and -libs against individual source code files, by defining variables of the -form $FILENAME-cflags and $FILENAME-libs. For example, the test -test-crypto-tlscredsx509 needs to link to the libtasn1 library, -so tests/Makefile.include defines some variables: - - tests/crypto-tls-x509-helpers.o-cflags := $(TASN1_CFLAGS) - tests/crypto-tls-x509-helpers.o-libs := $(TASN1_LIBS) - -The scope is a little different between the two variables. The libs get -used when linking any target binary that includes the curl.o object -file, while the cflags get used when compiling the curl.c file only. - +phony target, while benchmarks are run with `make bench`. Meson test +suites such as `unit` can be ran with `make check-unit` too. It is also +possible to run tests defined in meson.build with `meson test`. Important files for the build system ==================================== @@ -402,10 +329,8 @@ number of dynamically created files listed later. other meson.build files spread throughout the QEMU source tree. `tests/Makefile.include` - Rules for building the unit tests. This file is included directly by the - top level Makefile, so anything defined in this file will influence the - entire build system. Care needs to be taken when writing rules for tests - to ensure they only apply to the unit test execution / build. + Rules for external test harnesses. These include the TCG tests, + `qemu-iotests` and the Avocado-based acceptance tests. `tests/docker/Makefile.include` Rules for Docker tests. Like tests/Makefile, this file is included