meson-buildoptions: add support for string options
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. Tested-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
f780a3f480
commit
119fc611ea
|
@ -11,7 +11,7 @@ option('qemu_firmwarepath', type : 'string', value : '',
|
||||||
option('smbd', type : 'string', value : '',
|
option('smbd', type : 'string', value : '',
|
||||||
description: 'Path to smbd for slirp networking')
|
description: 'Path to smbd for slirp networking')
|
||||||
option('sphinx_build', type : 'string', value : '',
|
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 : '',
|
option('iasl', type : 'string', value : '',
|
||||||
description: 'Path to ACPI disassembler')
|
description: 'Path to ACPI disassembler')
|
||||||
option('default_devices', type : 'boolean', value : true,
|
option('default_devices', type : 'boolean', value : true,
|
||||||
|
|
|
@ -38,6 +38,11 @@ SKIP_OPTIONS = {
|
||||||
"trace_file",
|
"trace_file",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OPTION_NAMES = {
|
||||||
|
"malloc": "enable-malloc",
|
||||||
|
"trace_backends": "enable-trace-backends",
|
||||||
|
}
|
||||||
|
|
||||||
BUILTIN_OPTIONS = {
|
BUILTIN_OPTIONS = {
|
||||||
"strip",
|
"strip",
|
||||||
}
|
}
|
||||||
|
@ -75,7 +80,7 @@ def help_line(left, opt, indent, long):
|
||||||
right = f'{opt["description"]}'
|
right = f'{opt["description"]}'
|
||||||
if long:
|
if long:
|
||||||
value = value_to_help(opt["value"])
|
value = value_to_help(opt["value"])
|
||||||
if value != "auto":
|
if value != "auto" and value != "":
|
||||||
right += f" [{value}]"
|
right += f" [{value}]"
|
||||||
if "choices" in opt and long:
|
if "choices" in opt and long:
|
||||||
choices = "/".join(sorted(opt["choices"]))
|
choices = "/".join(sorted(opt["choices"]))
|
||||||
|
@ -96,6 +101,18 @@ def allow_arg(opt):
|
||||||
return not (set(opt["choices"]) <= {"auto", "disabled", "enabled"})
|
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):
|
def filter_options(json):
|
||||||
if ":" in json["name"]:
|
if ":" in json["name"]:
|
||||||
return False
|
return False
|
||||||
|
@ -110,20 +127,48 @@ def load_options(json):
|
||||||
return sorted(json, key=lambda x: x["name"])
|
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):
|
def print_help(options):
|
||||||
print("meson_options_help() {")
|
print("meson_options_help() {")
|
||||||
for opt in options:
|
for opt in sorted(options, key=cli_help_key):
|
||||||
key = opt["name"].replace("_", "-")
|
key = cli_help_key(opt)
|
||||||
# The first section includes options that have an arguments,
|
# The first section includes options that have an arguments,
|
||||||
# and booleans (i.e., only one of enable/disable makes sense)
|
# and booleans (i.e., only one of enable/disable makes sense)
|
||||||
if opt["type"] == "boolean":
|
if require_arg(opt):
|
||||||
left = f"--disable-{key}" if opt["value"] else f"--enable-{key}"
|
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)
|
help_line(left, opt, 27, False)
|
||||||
elif allow_arg(opt):
|
elif allow_arg(opt):
|
||||||
if opt["type"] == "combo" and "enabled" in opt["choices"]:
|
if opt["type"] == "combo" and "enabled" in opt["choices"]:
|
||||||
left = f"--enable-{key}[=CHOICE]"
|
left = f"--{key}[=CHOICE]"
|
||||||
else:
|
else:
|
||||||
left = f"--enable-{key}=CHOICE"
|
left = f"--{key}=CHOICE"
|
||||||
help_line(left, opt, 27, True)
|
help_line(left, opt, 27, True)
|
||||||
|
|
||||||
sh_print()
|
sh_print()
|
||||||
|
@ -142,9 +187,11 @@ def print_parse(options):
|
||||||
print("_meson_option_parse() {")
|
print("_meson_option_parse() {")
|
||||||
print(" case $1 in")
|
print(" case $1 in")
|
||||||
for opt in options:
|
for opt in options:
|
||||||
key = opt["name"].replace("_", "-")
|
key = cli_option(opt)
|
||||||
name = opt["name"]
|
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' --enable-{key}) printf "%s" -D{name}=true ;;')
|
||||||
print(f' --disable-{key}) printf "%s" -D{name}=false ;;')
|
print(f' --disable-{key}) printf "%s" -D{name}=false ;;')
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
# This file is generated by meson-buildoptions.py, do not edit!
|
# This file is generated by meson-buildoptions.py, do not edit!
|
||||||
meson_options_help() {
|
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" ' --enable-block-drv-whitelist-in-tools'
|
||||||
printf "%s\n" ' use block whitelist also in tools instead of only'
|
printf "%s\n" ' use block whitelist also in tools instead of only'
|
||||||
printf "%s\n" ' QEMU'
|
printf "%s\n" ' QEMU'
|
||||||
|
@ -8,7 +10,6 @@ meson_options_help() {
|
||||||
printf "%s\n" ' (choices: auto/disabled/enabled/internal/system)'
|
printf "%s\n" ' (choices: auto/disabled/enabled/internal/system)'
|
||||||
printf "%s\n" ' --enable-cfi Control-Flow Integrity (CFI)'
|
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" ' --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-mutex mutex debugging support'
|
||||||
printf "%s\n" ' --enable-debug-stack-usage'
|
printf "%s\n" ' --enable-debug-stack-usage'
|
||||||
printf "%s\n" ' measure coroutine 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" ' (choices: auto/disabled/enabled/internal/system)'
|
||||||
printf "%s\n" ' --enable-fuzzing build fuzzing targets'
|
printf "%s\n" ' --enable-fuzzing build fuzzing targets'
|
||||||
printf "%s\n" ' --enable-gprof QEMU profiling with gprof'
|
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" ' --enable-malloc=CHOICE choose memory allocator to use [system] (choices:'
|
||||||
printf "%s\n" ' jemalloc/system/tcmalloc)'
|
printf "%s\n" ' jemalloc/system/tcmalloc)'
|
||||||
printf "%s\n" ' --enable-module-upgrades try to load modules from alternate paths for'
|
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" ' (choices: auto/disabled/enabled/internal/system)'
|
||||||
printf "%s\n" ' --enable-strip Strip targets on install'
|
printf "%s\n" ' --enable-strip Strip targets on install'
|
||||||
printf "%s\n" ' --enable-tcg-interpreter TCG with bytecode interpreter (slow)'
|
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" ' Set available tracing backends [log] (choices:'
|
||||||
printf "%s\n" ' dtrace/ftrace/log/nop/simple/syslog/ust)'
|
printf "%s\n" ' dtrace/ftrace/log/nop/simple/syslog/ust)'
|
||||||
printf "%s\n" ''
|
printf "%s\n" ''
|
||||||
|
|
Loading…
Reference in New Issue