Makefile | 8 +++++-- meson_options.txt | 2 +- scripts/meson-buildoptions.py | 43 ++++++++++++++++++++++++++++++++--- scripts/meson-buildoptions.sh | 3 ++- 4 files changed, 49 insertions(+), 7 deletions(-)
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.pitsidianakis@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
--
γαῖα πυρί μιχθήτω
On Sat, 17 Feb 2024 at 08:21, Manos Pitsidianakis <manos.pitsidianakis@linaro.org> wrote: > > 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. How about updating the description in meson_options.txt to what's shown above and dropping the meson introspect part? I think the complexity is a little high given that the generated list is incomplete. Less custom build system code makes it easier to understand and reduces the chance of breakage. > > Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@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 > -- > γαῖα πυρί μιχθήτω > >
© 2016 - 2024 Red Hat, Inc.