mirror of
https://github.com/fish-shell/fish-shell
synced 2025-01-13 21:44:16 +00:00
63 lines
2.1 KiB
Fish
63 lines
2.1 KiB
Fish
|
function __fish_parse_configure
|
||
|
if test (count $argv) -ne 1
|
||
|
echo "Usage: parse_configure path/to/configure" 1>&2
|
||
|
return 1
|
||
|
end
|
||
|
|
||
|
# `complete` parses `./configure` as `configure` so we have to handle all paths, not just ./
|
||
|
if not test -x $argv[1]
|
||
|
printf "Cannot find or execute '%s'\n" $argv[1] 1>&2
|
||
|
return 1
|
||
|
end
|
||
|
|
||
|
# Must support output along the lines of
|
||
|
# -h, --help display this help and exit
|
||
|
# --help=short display options specific to this package
|
||
|
# --help=recursive display the short help of all the included packages
|
||
|
# -V, --version display version information and exit
|
||
|
# -q, --quiet, --silent do not print `checking ...' messages
|
||
|
|
||
|
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
|
||
|
# 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
|
||
|
set line $next_line
|
||
|
set next_line "" # mark it as consumed
|
||
|
continue
|
||
|
else if string match -qr '^( |\t){2,}[^-]\S*' -- $next_line
|
||
|
# echo "continuation line found. Old value of line: " \"$line\"
|
||
|
set line "$line "(string trim $next_line)
|
||
|
set next_line "" # mark it as consumed
|
||
|
continue
|
||
|
end
|
||
|
|
||
|
# echo line: $line
|
||
|
|
||
|
# Search for one or more strings starting with `-` separated by commas
|
||
|
if string replace -fr '^\s+(-.*?)\s+([^\s\-].*)' '$1\n$2' -- $line | read -lL opts description
|
||
|
for opt in (string split -n , -- $opts | string trim)
|
||
|
|
||
|
if string match -qr -- '--.*=\[.*\]' $opt
|
||
|
# --option=[OPTIONAL_VALUE]
|
||
|
string replace -r -- '(--.*)=.*' '$1' $opt | read opt
|
||
|
else if string match -qr -- '--.*=[A-Z]+' $opt
|
||
|
# --option=CLASS_OF_VALUE (eg FILE or DIR)
|
||
|
string replace -r -- '(--.*)=.*' '$1' $opt | read opt
|
||
|
else if string match -qr -- '--.*=\S+' $opt
|
||
|
# --option=literal_value, leave as-is
|
||
|
else if string match -qr -- '-[^-]\b' $opt
|
||
|
# short option, leave as-is
|
||
|
end
|
||
|
|
||
|
echo "$opt"\t"$description" # parsed by `complete` as value and description
|
||
|
end
|
||
|
end
|
||
|
|
||
|
set line ""
|
||
|
end
|
||
|
end
|