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

Reply via email to