aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile8
-rwxr-xr-xconfigure31
-rwxr-xr-xscripts/meson-buildoptions.py64
-rw-r--r--scripts/meson-buildoptions.sh13
4 files changed, 106 insertions, 10 deletions
diff --git a/Makefile b/Makefile
index 401c623a65..fe9415ac64 100644
--- a/Makefile
+++ b/Makefile
@@ -87,7 +87,7 @@ x := $(shell rm -rf meson-private meson-info meson-logs)
endif
# 1. ensure config-host.mak is up-to-date
-config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/pc-bios $(SRC_PATH)/VERSION
+config-host.mak: $(SRC_PATH)/configure $(SRC_PATH)/scripts/meson-buildoptions.sh $(SRC_PATH)/pc-bios $(SRC_PATH)/VERSION
@echo config-host.mak is out-of-date, running configure
@if test -f meson-private/coredata.dat; then \
./config.status --skip-meson; \
@@ -124,6 +124,12 @@ ifneq ($(MESON),)
Makefile.mtest: build.ninja scripts/mtest2make.py
$(MESON) introspect --targets --tests --benchmarks | $(PYTHON) scripts/mtest2make.py > $@
-include Makefile.mtest
+
+.PHONY: update-buildoptions
+all update-buildoptions: $(SRC_PATH)/scripts/meson-buildoptions.sh
+$(SRC_PATH)/scripts/meson-buildoptions.sh: $(SRC_PATH)/meson_options.txt
+ $(MESON) introspect --buildoptions $(SRC_PATH)/meson.build | $(PYTHON) \
+ scripts/meson-buildoptions.py > $@.tmp && mv $@.tmp $@
endif
# 4. Rules to bridge to other makefiles
diff --git a/configure b/configure
index 2ec410378e..8eb0ef160f 100755
--- a/configure
+++ b/configure
@@ -789,6 +789,18 @@ fi
werror=""
+. $source_path/scripts/meson-buildoptions.sh
+
+meson_options=
+meson_option_parse() {
+ meson_options="$meson_options $(_meson_option_parse "$@")"
+ if test $? -eq 1; then
+ echo "ERROR: unknown option $1"
+ echo "Try '$0 --help' for more information"
+ exit 1
+ fi
+}
+
for opt do
optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
case "$opt" in
@@ -1548,6 +1560,8 @@ for opt do
;;
--disable-slirp-smbd) slirp_smbd=no
;;
+ --enable-* | --disable-*) meson_option_parse "$opt" "$optarg"
+ ;;
*)
echo "ERROR: unknown option $opt"
echo "Try '$0 --help' for more information"
@@ -1804,11 +1818,9 @@ Advanced options (experts only):
enable plugins via shared library loading
--disable-containers don't use containers for cross-building
--gdb=GDB-path gdb to use for gdbstub tests [$gdb_bin]
-
-Optional features, enabled with --enable-FEATURE and
-disabled with --disable-FEATURE, default is enabled if available
-(unless built with --without-default-features):
-
+EOF
+ meson_options_help
+cat << EOF
system all system emulation targets
user supported user emulation targets
linux-user all linux usermode emulation targets
@@ -4489,7 +4501,8 @@ if test "$skip_meson" = no; then
mv $cross config-meson.cross
rm -rf meson-private meson-info meson-logs
- NINJA=$ninja $meson setup \
+ run_meson() {
+ NINJA=$ninja $meson setup \
--prefix "$prefix" \
--libdir "$libdir" \
--libexecdir "$libexecdir" \
@@ -4534,9 +4547,9 @@ if test "$skip_meson" = no; then
-Dpa=$pa -Daudio_drv_list=$audio_drv_list -Dtcg_interpreter=$tcg_interpreter \
-Dtrace_backends=$trace_backends -Dtrace_file=$trace_file -Dlinux_aio=$linux_aio \
-Dnetmap=$netmap -Dvde=$vde \
- $cross_arg \
- "$PWD" "$source_path"
-
+ "$@" $cross_arg "$PWD" "$source_path"
+ }
+ eval run_meson $meson_options
if test "$?" -ne 0 ; then
error_exit "meson setup failed"
fi
diff --git a/scripts/meson-buildoptions.py b/scripts/meson-buildoptions.py
new file mode 100755
index 0000000000..71ee56bd22
--- /dev/null
+++ b/scripts/meson-buildoptions.py
@@ -0,0 +1,64 @@
+#! /usr/bin/env python3
+
+# Generate configure command line options handling code, based on Meson's
+# user build options introspection data
+#
+# Copyright (C) 2021 Red Hat, Inc.
+#
+# Author: Paolo Bonzini <pbonzini@redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+import json
+import textwrap
+import shlex
+import sys
+
+def sh_print(line=""):
+ print(' printf "%s\\n"', shlex.quote(line))
+
+
+def load_options(json):
+ json = [
+ x
+ for x in json
+ if x["section"] == "user"
+ and ":" not in x["name"]
+ and x["name"] not in SKIP_OPTIONS
+ ]
+ return sorted(json, key=lambda x: x["name"])
+
+
+def print_help(options):
+ print("meson_options_help() {")
+ sh_print()
+ sh_print("Optional features, enabled with --enable-FEATURE and")
+ sh_print("disabled with --disable-FEATURE, default is enabled if available")
+ sh_print("(unless built with --without-default-features):")
+ sh_print()
+ print("}")
+
+
+def print_parse(options):
+ print("_meson_option_parse() {")
+ print(" case $1 in")
+ print(" *) return 1 ;;")
+ print(" esac")
+ print("}")
+
+
+options = load_options(json.load(sys.stdin))
+print("# This file is generated by meson-buildoptions.py, do not edit!")
+print_help(options)
+print_parse(options)
diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
new file mode 100644
index 0000000000..c8ae205601
--- /dev/null
+++ b/scripts/meson-buildoptions.sh
@@ -0,0 +1,13 @@
+# This file is generated by meson-buildoptions.py, do not edit!
+meson_options_help() {
+ printf "%s\n" ''
+ printf "%s\n" 'Optional features, enabled with --enable-FEATURE and'
+ printf "%s\n" 'disabled with --disable-FEATURE, default is enabled if available'
+ printf "%s\n" '(unless built with --without-default-features):'
+ printf "%s\n" ''
+}
+_meson_option_parse() {
+ case $1 in
+ *) return 1 ;;
+ esac
+}