configure --help currently outputs the following line for the tools
option:

-->8-------------------------------------------------------------------
░░tcg░░░░░░░░░░░░░TCG░support░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  tools           build support utilities that come with QEMU
░░tpm░░░░░░░░░░░░░TPM░support░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░u2f░░░░░░░░░░░░░U2F░emulation░support░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
---8<------------------------------------------------------------------

Which does not convey information if you don't already know what these
utilities are going to be.

This commit uses script/meson-buildoptions.py to parse the hard-coded
test binary names in meson.build and update the --help output to include
their names, like as follows:

-->8-------------------------------------------------------------------
░░tcg░░░░░░░░░░░░░TCG░support░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  tools           build utility tool binaries like qemu-edid, qemu-img,
                  qemu-io, qemu-nbd, qemu-bridge-helper, qemu-pr-helper
░░tpm░░░░░░░░░░░░░TPM░support░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
░░u2f░░░░░░░░░░░░░U2F░emulation░support░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
---8<------------------------------------------------------------------

Since it uses the meson.build AST to find those values, only hard-coded
binary names are selected and the description is non-exhaustive.

Signed-off-by: Manos Pitsidianakis <manos.pitsidiana...@linaro.org>
---
 Makefile                      |  8 +++++--
 meson_options.txt             |  2 +-
 scripts/meson-buildoptions.py | 43 ++++++++++++++++++++++++++++++++---
 scripts/meson-buildoptions.sh |  3 ++-
 4 files changed, 49 insertions(+), 7 deletions(-)

diff --git a/Makefile b/Makefile
index 8f36990335..79ab594c4b 100644
--- a/Makefile
+++ b/Makefile
@@ -128,8 +128,12 @@ Makefile.mtest: build.ninja scripts/mtest2make.py
 .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 $@
+       { printf '{"buildoptions":'; \
+               $(MESON) introspect --buildoptions $(SRC_PATH)/meson.build 2> 
>(grep -v "Unable to evaluate subdir(\[\])" >&2) \
+               && printf ',"ast":' \
+               && $(MESON) introspect --ast $(SRC_PATH)/meson.build 2> >(grep 
-v "Unable to evaluate subdir(\[\])" >&2) \
+               && printf "}" ; } \
+               | $(PYTHON) scripts/meson-buildoptions.py > $@.tmp && mv $@.tmp 
$@
 endif
 
 # 4. Rules to bridge to other makefiles
diff --git a/meson_options.txt b/meson_options.txt
index 0a99a059ec..53a8b6b3e2 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -58,7 +58,7 @@ option('guest_agent', type : 'feature', value : 'auto',
 option('guest_agent_msi', type : 'feature', value : 'auto',
        description: 'Build MSI package for the QEMU Guest Agent')
 option('tools', type : 'feature', value : 'auto',
-       description: 'build support utilities that come with QEMU')
+       description: 'build utility tool binaries')
 option('qga_vss', type : 'feature', value: 'auto',
        description: 'build QGA VSS support (broken with MinGW)')
 
diff --git a/scripts/meson-buildoptions.py b/scripts/meson-buildoptions.py
index 4814a8ff61..4abdfc1d05 100644
--- a/scripts/meson-buildoptions.py
+++ b/scripts/meson-buildoptions.py
@@ -24,6 +24,7 @@
 import textwrap
 import shlex
 import sys
+from collections import deque
 
 # Options with nonstandard names (e.g. --with/--without) or OS-dependent
 # defaults.  Try not to add any.
@@ -182,7 +183,7 @@ def cli_metavar(opt):
     return "CHOICE"
 
 
-def print_help(options):
+def print_help(options, tools: list[str]):
     print("meson_options_help() {")
     feature_opts = []
     for opt in sorted(options, key=cli_help_key):
@@ -212,6 +213,8 @@ def print_help(options):
     sh_print()
     for opt in sorted(feature_opts, key=cli_option):
         key = cli_option(opt)
+        if key == "tools":
+            opt["description"] += " like " + ", ".join(tools)
         help_line(key, opt, 18, False)
     print("}")
 
@@ -242,7 +245,41 @@ def print_parse(options):
     print("}")
 
 
-options = load_options(json.load(sys.stdin))
+# Returns hard-coded executables from meson.build AST
+def tool_executables(d: dict) -> list[str]:
+    def is_executable_fn_call(i: dict) -> bool:
+        if not (
+            "name" in i
+            and i["name"] == "executable"
+            and "node" in i
+            and i["node"] == "FunctionNode"
+            and "positional" in i["args"]
+            and len(i["args"]) > 0
+        ):
+            return False
+        first_arg = i["args"]["positional"][0]
+        return first_arg["node"] == "StringNode"
+
+    stack = deque([d])
+    while len(stack) > 0:
+        item = stack.popleft()
+        if isinstance(item, dict):
+            # Check if this is an `executable(....)` function call.
+            if is_executable_fn_call(item):
+                name = item["args"]["positional"][0]["value"]
+                if name not in ("qemu-keymap",):
+                    yield name
+            else:
+                stack.extend(item.values())
+            continue
+        if isinstance(item, list):
+            stack.extend(item)
+            continue
+
+
+input_string = json.load(sys.stdin)
+options = load_options(input_string["buildoptions"])
+bins = list(tool_executables(input_string["ast"]))
 print("# This file is generated by meson-buildoptions.py, do not edit!")
-print_help(options)
+print_help(options, bins)
 print_parse(options)
diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh
index 680fa3f581..ac1fad55df 100644
--- a/scripts/meson-buildoptions.sh
+++ b/scripts/meson-buildoptions.sh
@@ -185,7 +185,8 @@ meson_options_help() {
   printf "%s\n" '  spice-protocol  Spice protocol support'
   printf "%s\n" '  stack-protector compiler-provided stack protection'
   printf "%s\n" '  tcg             TCG support'
-  printf "%s\n" '  tools           build support utilities that come with QEMU'
+  printf "%s\n" '  tools           build utility tool binaries like qemu-edid, 
qemu-img,'
+  printf "%s\n" '                  qemu-io, qemu-nbd, qemu-bridge-helper, 
qemu-pr-helper'
   printf "%s\n" '  tpm             TPM support'
   printf "%s\n" '  u2f             U2F emulation support'
   printf "%s\n" '  usb-redir       libusbredir support'

base-commit: da96ad4a6a2ef26c83b15fa95e7fceef5147269c
-- 
γαῖα πυρί μιχθήτω


Reply via email to