Speed up ./configure completion by not running ./configure --help

Instead, attempt to extract the message that _would_ be displayed on
execution of `./configure --help` by relying on some markers present in
autoconf-generated configure files.

As measured with 'hyperfine' on a laptop running in reduced frequency
power savings mode, `fish -c "__fish_parse_configure ./configure"`
runtime dropped from ~1.25s to ~0.8ms, which is inline with the
previously observed ~350ms execution time for `./configure --help`.
fish's own startup time is approximately 75ms before parsing begins.

Still very slow, but much better.
This commit is contained in:
Mahmoud Al-Qudsi 2018-04-18 15:40:52 -05:00
parent 6c5e5d35a9
commit 9d9afd8264

View file

@ -20,11 +20,15 @@ function __fish_parse_configure
set -l next_line
set -l line
set -l buffer
eval $argv[1] --help 2>/dev/null | while test (string length -- "$next_line") -gt 0 || read -lL next_line
# eval $argv[1] --help 2>/dev/null |
# Just fish's `./configure --help` takes ~350ms to run, before parsing
# The following chain attempts to extract the help message:
cat $argv[1] | tr \n \u0e | sed -n 's/.*Report the --help message\(.*\?\)ac_status.*/\1/; s/ac_status.*//p' | tr \u0e \n |
while test "$next_line" != "" || read -lL next_line
# In autoconfigure scripts, the first column wraps at 26 chars
# echo next_line: $next_line
# echo old_line: $line
if test (string length -- "$line") -eq 0
if test "$line" = ""
set line $next_line
set next_line "" # mark it as consumed
continue