diff mbox series

[3/3] configure: Get help text from meson_options.txt

Message ID 20210829173210.39562-4-thuth@redhat.com
State New
Headers show
Series Use meson_options.txt in the configure script | expand

Commit Message

Thomas Huth Aug. 29, 2021, 5:32 p.m. UTC
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(-)

Comments

Eric Blake Aug. 30, 2021, 3:30 p.m. UTC | #1
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.
Thomas Huth Aug. 30, 2021, 4:48 p.m. UTC | #2
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
diff mbox series

Patch

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