It's cumbersome to maintain the option help texts twice, once in the
"configure" script and once in meson_options.txt. So let's add some logic to
the configure script to read most of the help texts from meson_options.txt.
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
configure | 89 ++++++++++++++++---------------------------------------
1 file changed, 25 insertions(+), 64 deletions(-)
diff --git a/configure b/configure
index cb125c3f84..8446b7b3ea 100755
--- a/configure
+++ b/configure
@@ -1549,7 +1549,6 @@ Advanced options (experts only):
Default:trace-<pid>
--disable-slirp disable SLIRP userspace network connectivity
--enable-tcg-interpreter enable TCI (TCG with bytecode interpreter, experimental and slow)
- --enable-malloc-trim enable libc malloc_trim() for memory optimization
--oss-lib path to OSS library
--cpu=CPU Build for host CPU [$cpu]
--with-coroutine=BACKEND coroutine backend. Supported options:
@@ -1576,16 +1575,13 @@ disabled with --disable-FEATURE, default is enabled if available
user supported user emulation targets
linux-user all linux usermode emulation targets
bsd-user all BSD usermode emulation targets
- docs build documentation
guest-agent build the QEMU Guest Agent
- guest-agent-msi build guest agent Windows MSI installation package
pie Position Independent Executables
modules modules support (non-Windows)
module-upgrades try to load modules from alternate paths for upgrades
debug-tcg TCG debugging (default is disabled)
debug-info debugging information
lto Enable Link-Time Optimization.
- sparse sparse checker
safe-stack SafeStack Stack Smash Protection. Depends on
clang/llvm >= 3.7 and requires coroutine backend ucontext.
cfi Enable Control-Flow Integrity for indirect function calls.
@@ -1595,85 +1591,33 @@ disabled with --disable-FEATURE, default is enabled if available
cfi-debug In case of a cfi violation, a message containing the line that
triggered the error is written to stderr. After the error,
QEMU is still terminated with SIGILL
- gnutls GNUTLS cryptography support
- nettle nettle cryptography support
- gcrypt libgcrypt cryptography support
- auth-pam PAM access control
- sdl SDL UI
- sdl-image SDL Image support for icons
- gtk gtk UI
- vte vte support for the gtk UI
- curses curses UI
- iconv font glyph conversion support
- vnc VNC UI support
- vnc-sasl SASL encryption for VNC server
- vnc-jpeg JPEG lossy compression for VNC server
- vnc-png PNG compression for VNC server
- cocoa Cocoa UI (Mac OS X only)
- virtfs VirtFS
- virtiofsd build virtiofs daemon (virtiofsd)
- libudev Use libudev to enumerate host devices
- mpath Multipath persistent reservation passthrough
- xen xen backend driver support
- xen-pci-passthrough PCI passthrough support for Xen
- brlapi BrlAPI (Braile)
- curl curl connectivity
membarrier membarrier system call (for Linux 4.14+ or Windows)
fdt fdt device tree
- kvm KVM acceleration support
- hax HAX acceleration support
- hvf Hypervisor.framework acceleration support
- nvmm NVMM acceleration support
- whpx Windows Hypervisor Platform acceleration support
rdma Enable RDMA-based migration
pvrdma Enable PVRDMA support
vde support for vde network
netmap support for netmap network
linux-aio Linux AIO support
- linux-io-uring Linux io_uring support
- cap-ng libcap-ng support
- attr attr and xattr support
vhost-net vhost-net kernel acceleration support
vhost-vsock virtio sockets device support
vhost-scsi vhost-scsi kernel target support
vhost-crypto vhost-user-crypto backend support
vhost-kernel vhost kernel backend support
vhost-user vhost-user backend support
- vhost-user-blk-server vhost-user-blk server support
vhost-vdpa vhost-vdpa kernel backend support
- bpf BPF kernel support
spice spice
spice-protocol spice-protocol
- rbd rados block device (rbd)
- libiscsi iscsi support
- libnfs nfs support
- smartcard smartcard support (libcacard)
- u2f U2F support (u2f-emu)
- libusb libusb (for usb passthrough)
live-block-migration Block migration in the main migration stream
- usb-redir usb network redirection support
- lzo support of lzo compression library
- snappy support of snappy compression library
- bzip2 support of bzip2 compression library
- (for reading bzip2-compressed dmg images)
- lzfse support of lzfse compression library
- (for reading lzfse-compressed dmg images)
- zstd support for zstd compression library
- (for migration compression and qcow2 cluster compression)
- seccomp seccomp support
coroutine-pool coroutine freelist (better performance)
- glusterfs GlusterFS backend
tpm TPM support
libssh ssh block device support
numa libnuma support
- libxml2 for Parallels image format
tcmalloc tcmalloc support
jemalloc jemalloc support
avx2 AVX2 optimization support
avx512f AVX512F optimization support
replication replication support
opengl opengl support
- virglrenderer virgl rendering support
xfsctl xfsctl support
qom-cast-debug cast debugging support
tools build qemu-io, qemu-nbd and qemu-img tools
@@ -1688,18 +1632,35 @@ disabled with --disable-FEATURE, default is enabled if available
crypto-afalg Linux AF_ALG crypto backend driver
capstone capstone disassembler support
debug-mutex mutex debugging support
- libpmem libpmem support
- xkbcommon xkbcommon support
rng-none dummy RNG, avoid using /dev/(u)random and getrandom()
- libdaxctl libdaxctl support
- fuse FUSE block device export
- fuse-lseek SEEK_HOLE/SEEK_DATA support for FUSE exports
- multiprocess Out of process device emulation support
gio libgio support
slirp-smbd use smbd (at path --smbd=*) in slirp networking
-
-NOTE: The object files are built at the place where configure is launched
EOF
+
+current_feature=""
+current_desc=""
+while read word1 word2 ; do
+ case "$word1" in
+ option*)
+ if echo "$word2" | grep -q "type[ ]*: 'feature'"; then
+ current_feature=$(echo $word1 | sed -e "s/option('//" -e "s/',.*$//")
+ else
+ current_feature=""
+ fi
+ ;;
+ description:)
+ if [ -n "$current_feature" ]; then
+ printf " %-15s %s\n" "$current_feature" \
+ "$(echo "$word2" | sed -e "s/^'//" -e "s/'.*$//")"
+ current_feature=""
+ fi
+ ;;
+ esac
+done < $source_path/meson_options.txt | sort
+
+echo
+echo "NOTE: The object files are built at the place where configure is launched"
+
exit 0
fi
--
2.27.0
On Sun, Aug 29, 2021 at 07:32:10PM +0200, Thomas Huth wrote:
> It's cumbersome to maintain the option help texts twice, once in the
> "configure" script and once in meson_options.txt. So let's add some logic to
> the configure script to read most of the help texts from meson_options.txt.
>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
> configure | 89 ++++++++++++++++---------------------------------------
> 1 file changed, 25 insertions(+), 64 deletions(-)
>
> diff --git a/configure b/configure
> index cb125c3f84..8446b7b3ea 100755
> --- a/configure
> +++ b/configure
> +
> +current_feature=""
> +current_desc=""
current_desc is unused below.
> +while read word1 word2 ; do
A bit misleading in the variable names. As a sample, you are parsing:
option('malloc_trim', type : 'feature', value : 'auto',
description: 'enable libc malloc_trim() for memory optimization')
which read then splits into:
word1="option('malloc_trim'," word2="type : 'feature', value : 'auto',"
or
word1="description:" word2="'enable libc malloc_trim() for memory optimization')"
Better might be the names $first and $rest. You could also play with
$IFS for more precise splitting, but your hack is good enough for the
current usage.
> + case "$word1" in
> + option*)
> + if echo "$word2" | grep -q "type[ ]*: 'feature'"; then
Unlike my complaint in patch 1 about using echo on user-supplied text,
here you are using it on test in meson_options.txt which is presumably
not going to contain \ or leading -.
> + current_feature=$(echo $word1 | sed -e "s/option('//" -e "s/',.*$//")
> + else
> + current_feature=""
> + fi
If desired, you can save some fork()ing by doing:
case "$word2" in *type*:*"'feature'")
current_feature=${word1%\'*}
current_feature=${current_feature#*\'}
*) current_feature=""
esac
> + ;;
> + description:)
> + if [ -n "$current_feature" ]; then
> + printf " %-15s %s\n" "$current_feature" \
> + "$(echo "$word2" | sed -e "s/^'//" -e "s/'.*$//")"
Similarly,
if [ "$current_feature" ]; then
word2=${word2%\'*}
printf " %-15s %s\n" "$current_feature" "${word2#\'}"
fi
> + current_feature=""
> + fi
> + ;;
> + esac
Missing a *) catchall case (probably a good idea to reset
current_feature back to "" on lines that don't match the two forms you
care about).
> +done < $source_path/meson_options.txt | sort
> +
> +echo
> +echo "NOTE: The object files are built at the place where configure is launched"
> +
> exit 0
> fi
>
> --
> 2.27.0
>
>
Overall pretty clever.
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3266
Virtualization: qemu.org | libvirt.org
On 30/08/2021 17.30, Eric Blake wrote:
> On Sun, Aug 29, 2021 at 07:32:10PM +0200, Thomas Huth wrote:
>> It's cumbersome to maintain the option help texts twice, once in the
>> "configure" script and once in meson_options.txt. So let's add some logic to
>> the configure script to read most of the help texts from meson_options.txt.
>>
>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>> ---
>> configure | 89 ++++++++++++++++---------------------------------------
>> 1 file changed, 25 insertions(+), 64 deletions(-)
>>
>> diff --git a/configure b/configure
>> index cb125c3f84..8446b7b3ea 100755
>> --- a/configure
>> +++ b/configure
>
>> +
>> +current_feature=""
>> +current_desc=""
>
> current_desc is unused below.
>
>> +while read word1 word2 ; do
>
> A bit misleading in the variable names. As a sample, you are parsing:
>
> option('malloc_trim', type : 'feature', value : 'auto',
> description: 'enable libc malloc_trim() for memory optimization')
>
> which read then splits into:
>
> word1="option('malloc_trim'," word2="type : 'feature', value : 'auto',"
> or
> word1="description:" word2="'enable libc malloc_trim() for memory optimization')"
>
> Better might be the names $first and $rest. You could also play with
> $IFS for more precise splitting, but your hack is good enough for the
> current usage.
>
>> + case "$word1" in
>> + option*)
>> + if echo "$word2" | grep -q "type[ ]*: 'feature'"; then
>
> Unlike my complaint in patch 1 about using echo on user-supplied text,
> here you are using it on test in meson_options.txt which is presumably
> not going to contain \ or leading -.
>
>> + current_feature=$(echo $word1 | sed -e "s/option('//" -e "s/',.*$//")
>> + else
>> + current_feature=""
>> + fi
>
> If desired, you can save some fork()ing by doing:
>
> case "$word2" in *type*:*"'feature'")
> current_feature=${word1%\'*}
> current_feature=${current_feature#*\'}
> *) current_feature=""
> esac
>
>> + ;;
>> + description:)
>> + if [ -n "$current_feature" ]; then
>> + printf " %-15s %s\n" "$current_feature" \
>> + "$(echo "$word2" | sed -e "s/^'//" -e "s/'.*$//")"
>
> Similarly,
>
> if [ "$current_feature" ]; then
> word2=${word2%\'*}
> printf " %-15s %s\n" "$current_feature" "${word2#\'}"
> fi
>
>> + current_feature=""
>> + fi
>> + ;;
>> + esac
>
> Missing a *) catchall case (probably a good idea to reset
> current_feature back to "" on lines that don't match the two forms you
> care about).
Thanks for your review, Eric! Your shell script knowledge is always amazing! :-)
I'll wait for Paolo first to chime in to see whether he rather wants to
resume his variant with the Perl or Python script, but if not, I'll include
your suggestions in the next version of the patch.
Thomas
© 2016 - 2026 Red Hat, Inc.