On Wed, Apr 20, 2022 at 7:57 PM Paolo Bonzini <pbonz...@redhat.com> wrote:
> Allow using the buildoptions.json file for more options, namely anything > that is not a boolean or multiple-choice. > > The mapping between configure and meson is messy for string options, > so allow configure to use to something other than the name in > meson_options.txt. This will come in handy anyway for builtin > Meson options such as b_lto or b_coverage. > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > lgtm Tested-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > meson_options.txt | 2 +- > scripts/meson-buildoptions.py | 65 ++++++++++++++++++++++++++++++----- > scripts/meson-buildoptions.sh | 6 ++-- > 3 files changed, 60 insertions(+), 13 deletions(-) > > diff --git a/meson_options.txt b/meson_options.txt > index cf18663833..415fcc448e 100644 > --- a/meson_options.txt > +++ b/meson_options.txt > @@ -11,7 +11,7 @@ option('qemu_firmwarepath', type : 'string', value : '', > option('smbd', type : 'string', value : '', > description: 'Path to smbd for slirp networking') > option('sphinx_build', type : 'string', value : '', > - description: 'Use specified sphinx-build [$sphinx_build] for > building document (default to be empty)') > + description: 'Use specified sphinx-build for building document') > option('iasl', type : 'string', value : '', > description: 'Path to ACPI disassembler') > option('default_devices', type : 'boolean', value : true, > diff --git a/scripts/meson-buildoptions.py b/scripts/meson-buildoptions.py > index 693be7b966..4af8d6e732 100755 > --- a/scripts/meson-buildoptions.py > +++ b/scripts/meson-buildoptions.py > @@ -38,6 +38,11 @@ > "trace_file", > } > > +OPTION_NAMES = { > + "malloc": "enable-malloc", > + "trace_backends": "enable-trace-backends", > +} > + > BUILTIN_OPTIONS = { > "strip", > } > @@ -75,7 +80,7 @@ def help_line(left, opt, indent, long): > right = f'{opt["description"]}' > if long: > value = value_to_help(opt["value"]) > - if value != "auto": > + if value != "auto" and value != "": > right += f" [{value}]" > if "choices" in opt and long: > choices = "/".join(sorted(opt["choices"])) > @@ -96,6 +101,18 @@ def allow_arg(opt): > return not (set(opt["choices"]) <= {"auto", "disabled", "enabled"}) > > > +# Return whether the option (a dictionary) can be used without > +# arguments. Booleans can only be used without arguments; > +# combos require an argument if they accept neither "enabled" > +# nor "disabled" > +def require_arg(opt): > + if opt["type"] == "boolean": > + return False > + if opt["type"] != "combo": > + return True > + return not ({"enabled", "disabled"}.intersection(opt["choices"])) > + > + > def filter_options(json): > if ":" in json["name"]: > return False > @@ -110,20 +127,48 @@ def load_options(json): > return sorted(json, key=lambda x: x["name"]) > > > +def cli_option(opt): > + name = opt["name"] > + if name in OPTION_NAMES: > + return OPTION_NAMES[name] > + return name.replace("_", "-") > + > + > +def cli_help_key(opt): > + key = cli_option(opt) > + if require_arg(opt): > + return key > + if opt["type"] == "boolean" and opt["value"]: > + return f"disable-{key}" > + return f"enable-{key}" > + > + > +def cli_metavar(opt): > + if opt["type"] == "string": > + return "VALUE" > + if opt["type"] == "array": > + return "CHOICES" > + return "CHOICE" > + > + > def print_help(options): > print("meson_options_help() {") > - for opt in options: > - key = opt["name"].replace("_", "-") > + for opt in sorted(options, key=cli_help_key): > + key = cli_help_key(opt) > # The first section includes options that have an arguments, > # and booleans (i.e., only one of enable/disable makes sense) > - if opt["type"] == "boolean": > - left = f"--disable-{key}" if opt["value"] else > f"--enable-{key}" > + if require_arg(opt): > + metavar = cli_metavar(opt) > + left = f"--{key}={metavar}" > + help_line(left, opt, 27, True) > + elif opt["type"] == "boolean": > + left = f"--{key}" > help_line(left, opt, 27, False) > elif allow_arg(opt): > if opt["type"] == "combo" and "enabled" in opt["choices"]: > - left = f"--enable-{key}[=CHOICE]" > + left = f"--{key}[=CHOICE]" > else: > - left = f"--enable-{key}=CHOICE" > + left = f"--{key}=CHOICE" > help_line(left, opt, 27, True) > > sh_print() > @@ -142,9 +187,11 @@ def print_parse(options): > print("_meson_option_parse() {") > print(" case $1 in") > for opt in options: > - key = opt["name"].replace("_", "-") > + key = cli_option(opt) > name = opt["name"] > - if opt["type"] == "boolean": > + if require_arg(opt): > + print(f' --{key}=*) quote_sh "-D{name}=$2" ;;') > + elif opt["type"] == "boolean": > print(f' --enable-{key}) printf "%s" -D{name}=true ;;') > print(f' --disable-{key}) printf "%s" -D{name}=false ;;') > else: > diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh > index a269534394..5a06b7915c 100644 > --- a/scripts/meson-buildoptions.sh > +++ b/scripts/meson-buildoptions.sh > @@ -1,5 +1,7 @@ > # This file is generated by meson-buildoptions.py, do not edit! > meson_options_help() { > + printf "%s\n" ' --disable-coroutine-pool coroutine freelist (better > performance)' > + printf "%s\n" ' --disable-install-blobs install provided firmware > blobs' > printf "%s\n" ' --enable-block-drv-whitelist-in-tools' > printf "%s\n" ' use block whitelist also in > tools instead of only' > printf "%s\n" ' QEMU' > @@ -8,7 +10,6 @@ meson_options_help() { > printf "%s\n" ' (choices: > auto/disabled/enabled/internal/system)' > printf "%s\n" ' --enable-cfi Control-Flow Integrity (CFI)' > printf "%s\n" ' --enable-cfi-debug Verbose errors in case of CFI > violation' > - printf "%s\n" ' --disable-coroutine-pool coroutine freelist (better > performance)' > printf "%s\n" ' --enable-debug-mutex mutex debugging support' > printf "%s\n" ' --enable-debug-stack-usage' > printf "%s\n" ' measure coroutine stack usage' > @@ -16,7 +17,6 @@ meson_options_help() { > printf "%s\n" ' (choices: > auto/disabled/enabled/internal/system)' > printf "%s\n" ' --enable-fuzzing build fuzzing targets' > printf "%s\n" ' --enable-gprof QEMU profiling with gprof' > - printf "%s\n" ' --disable-install-blobs install provided firmware > blobs' > printf "%s\n" ' --enable-malloc=CHOICE choose memory allocator to > use [system] (choices:' > printf "%s\n" ' jemalloc/system/tcmalloc)' > printf "%s\n" ' --enable-module-upgrades try to load modules from > alternate paths for' > @@ -29,7 +29,7 @@ meson_options_help() { > printf "%s\n" ' (choices: > auto/disabled/enabled/internal/system)' > printf "%s\n" ' --enable-strip Strip targets on install' > printf "%s\n" ' --enable-tcg-interpreter TCG with bytecode interpreter > (slow)' > - printf "%s\n" ' --enable-trace-backends=CHOICE' > + printf "%s\n" ' --enable-trace-backends=CHOICES' > printf "%s\n" ' Set available tracing > backends [log] (choices:' > printf "%s\n" ' > dtrace/ftrace/log/nop/simple/syslog/ust)' > printf "%s\n" '' > -- > 2.35.1 > > > > -- Marc-André Lureau