627 lines
11 KiB
Plaintext
627 lines
11 KiB
Plaintext
_meson() {
|
|
command="${COMP_WORDS[1]}"
|
|
meson_subcommands=(
|
|
setup
|
|
configure
|
|
dist
|
|
install
|
|
introspect
|
|
init
|
|
test
|
|
wrap
|
|
subprojects
|
|
help
|
|
rewrite
|
|
compile
|
|
devenv
|
|
env2mfile
|
|
)
|
|
|
|
if [[ " ${meson_subcommands[*]} " =~ " ${command} " ]]; then
|
|
_meson-$command "${COMP_WORDS[@]:1}"
|
|
else
|
|
_meson-setup "${COMP_WORDS[@]}"
|
|
fi
|
|
} &&
|
|
complete -F _meson meson
|
|
|
|
_meson_complete_option() {
|
|
option_string=$1
|
|
|
|
if [[ $# -eq 2 ]] && ! [[ "$option_string" == *=* ]]; then
|
|
option_string="$option_string=$2"
|
|
fi
|
|
|
|
if [[ "$option_string" == *=* ]]; then
|
|
_meson_complete_option_value "$option_string"
|
|
else
|
|
_meson_complete_option_name "$option_string"
|
|
fi
|
|
}
|
|
|
|
_meson_complete_option_name() {
|
|
option=$1
|
|
options=($(python3 -c 'import sys, json
|
|
for option in json.load(sys.stdin):
|
|
print(option["name"])
|
|
' <<< "$(_meson_get_options)"))
|
|
compopt -o nospace
|
|
COMPREPLY=($(compgen -W '${options[@]}' -S= -- "$option"))
|
|
}
|
|
|
|
_meson_complete_option_value() {
|
|
cur=$1
|
|
option_name=${cur%%=*}
|
|
option_value=${cur#*=}
|
|
|
|
if _meson_complete_filedir "$option_name" "$option_value"; then
|
|
return
|
|
fi
|
|
|
|
# TODO: support all the option types
|
|
options=($(python3 -c 'import sys, json
|
|
for option in json.load(sys.stdin):
|
|
if option["name"] != "'$option_name'":
|
|
continue
|
|
choices = []
|
|
if option["type"] == "boolean":
|
|
choices.append("true")
|
|
choices.append("false")
|
|
elif option["type"] == "combo":
|
|
for choice in option["choices"]:
|
|
choices.append(choice)
|
|
for choice in choices:
|
|
if choice.startswith("'$cur'"):
|
|
print(choice)
|
|
' <<< "$(_meson_get_options)"))
|
|
COMPREPLY=("${options[@]}")
|
|
}
|
|
|
|
_meson_get_options() {
|
|
local options
|
|
for builddir in "${COMP_WORDS[@]}"; do
|
|
if [ -d "$builddir" ]; then
|
|
break
|
|
fi
|
|
builddir=.
|
|
done
|
|
options=$(meson introspect "$builddir" --buildoptions 2>/dev/null) &&
|
|
echo "$options" ||
|
|
echo '[]'
|
|
}
|
|
|
|
_meson_complete_filedir() {
|
|
_filedir_in() {
|
|
pushd "$1" &>/dev/null
|
|
local COMPREPLY=()
|
|
_filedir
|
|
echo "${COMPREPLY[@]}"
|
|
popd &>/dev/null
|
|
}
|
|
|
|
option=$1
|
|
cur=$2
|
|
case $option in
|
|
prefix |\
|
|
bindir |\
|
|
datadir |\
|
|
includedir |\
|
|
infodir |\
|
|
libdir |\
|
|
licensedir |\
|
|
libexecdir |\
|
|
localedir |\
|
|
localstatedir |\
|
|
mandir |\
|
|
sbindir |\
|
|
sharedstatedir |\
|
|
sysconfdir |\
|
|
python.platlibdir |\
|
|
python.purelibdir |\
|
|
pkg-config-path |\
|
|
build.pkg-config-path |\
|
|
cmake-prefix-path |\
|
|
build.cmake-prefix-path)
|
|
_filedir -d
|
|
;;
|
|
|
|
cross-file)
|
|
_filedir
|
|
COMPREPLY+=($(_filedir_in "$XDG_DATA_DIRS"/meson/cross))
|
|
COMPREPLY+=($(_filedir_in /usr/local/share/meson/cross))
|
|
COMPREPLY+=($(_filedir_in /usr/share/meson/cross))
|
|
COMPREPLY+=($(_filedir_in "$XDG_DATA_HOME"/meson/cross))
|
|
COMPREPLY+=($(_filedir_in ~/.local/share/meson/cross))
|
|
;;
|
|
|
|
native-file)
|
|
_filedir
|
|
COMPREPLY+=($(_filedir_in "$XDG_DATA_DIRS"/meson/native))
|
|
COMPREPLY+=($(_filedir_in /usr/local/share/meson/native))
|
|
COMPREPLY+=($(_filedir_in /usr/share/meson/native))
|
|
COMPREPLY+=($(_filedir_in "$XDG_DATA_HOME"/meson/native))
|
|
COMPREPLY+=($(_filedir_in ~/.local/share/meson/native))
|
|
;;
|
|
|
|
*)
|
|
return 1;;
|
|
esac
|
|
return 0
|
|
}
|
|
|
|
_meson_compgen_options() {
|
|
local -r cur=$1
|
|
|
|
if [[ ${cur:0:2} == -- ]]; then
|
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}' -- "${cur:2}"))
|
|
elif [[ ${cur:0:1} == - ]]; then
|
|
if [[ ${#cur} == 1 ]]; then
|
|
# Only add longopts if cur not "-something"
|
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}' -- ""))
|
|
fi
|
|
|
|
COMPREPLY+=($(compgen -P '-' -W '${shortopts[*]}' -- "${cur:1}"))
|
|
else
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
_meson_common_setup_configure_longopts=(
|
|
help
|
|
prefix
|
|
bindir
|
|
datadir
|
|
includedir
|
|
infodir
|
|
libdir
|
|
licensedir
|
|
libexecdir
|
|
localedir
|
|
localstatedir
|
|
mandir
|
|
sbindir
|
|
sharedstatedir
|
|
sysconfdir
|
|
auto-features
|
|
backend
|
|
genvslite
|
|
buildtype
|
|
debug
|
|
default-library
|
|
errorlogs
|
|
install-umask
|
|
layout
|
|
optimization
|
|
prefer-static
|
|
stdsplit
|
|
strip
|
|
unity
|
|
unity-size
|
|
warnlevel
|
|
werror
|
|
wrap-mode
|
|
force-fallback-for
|
|
vsenv
|
|
pkgconfig.relocatable
|
|
python.bytecompile
|
|
python.install-env
|
|
python.platlibdir
|
|
python.purelibdir
|
|
python.allow-limited-api
|
|
pkg-config-path
|
|
build.pkg-config-path
|
|
cmake-prefix-path
|
|
build.cmake-prefix-path
|
|
clearcache
|
|
)
|
|
|
|
_meson-setup() {
|
|
shortopts=(
|
|
h
|
|
D
|
|
v
|
|
)
|
|
|
|
longopts=(
|
|
${_meson_common_setup_configure_longopts[@]}
|
|
native-file
|
|
cross-file
|
|
version
|
|
fatal-meson-warnings
|
|
reconfigure
|
|
wipe
|
|
)
|
|
|
|
local cur prev
|
|
if _get_comp_words_by_ref cur prev &>/dev/null; then
|
|
if [[ ${prev:0:2} == -- ]] && _meson_complete_option "${prev:2}" "$cur"; then
|
|
return
|
|
elif [[ ${prev:0:1} == - ]] && [[ ${prev:1:2} != - ]] && _meson_complete_option "${prev:1}"; then
|
|
return
|
|
fi
|
|
fi
|
|
|
|
if _get_comp_words_by_ref -n '=' cur prev &>/dev/null; then
|
|
if [[ $prev == -D ]]; then
|
|
_meson_complete_option "$cur"
|
|
return
|
|
fi
|
|
else
|
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
fi
|
|
|
|
if ! _meson_compgen_options "$cur"; then
|
|
_filedir -d
|
|
if [[ -z $cur ]]; then
|
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}'))
|
|
COMPREPLY+=($(compgen -P '-' -W '${shortopts[*]}'))
|
|
fi
|
|
|
|
if [[ $COMP_CWORD == 1 ]]; then
|
|
COMPREPLY+=($(compgen -W "${meson_subcommands[*]}" -- "$cur"))
|
|
fi
|
|
fi
|
|
}
|
|
|
|
_meson-configure() {
|
|
shortopts=(
|
|
h
|
|
D
|
|
)
|
|
|
|
longopts=(
|
|
${_meson_common_setup_configure_longopts[@]}
|
|
no-pager
|
|
)
|
|
|
|
local cur prev
|
|
if _get_comp_words_by_ref -n '=' cur prev &>/dev/null; then
|
|
if [[ $prev == -D ]]; then
|
|
_meson_complete_option "$cur"
|
|
return
|
|
fi
|
|
else
|
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
fi
|
|
|
|
if ! _meson_compgen_options "$cur"; then
|
|
for dir in "${COMP_WORDS[@]}"; do
|
|
if [[ -d "$dir" ]]; then
|
|
break
|
|
fi
|
|
dir=.
|
|
done
|
|
if [[ ! -d "$dir/meson-private" ]]; then
|
|
_filedir -d
|
|
fi
|
|
|
|
if [[ -z $cur ]]; then
|
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}'))
|
|
COMPREPLY+=($(compgen -P '-' -W '${shortopts[*]}'))
|
|
fi
|
|
fi
|
|
}
|
|
|
|
_meson-dist() {
|
|
: TODO
|
|
}
|
|
|
|
_meson-install() {
|
|
: TODO
|
|
}
|
|
|
|
_meson-introspect() {
|
|
shortopts=(
|
|
h
|
|
a
|
|
i
|
|
f
|
|
)
|
|
|
|
longopts=(
|
|
ast
|
|
benchmarks
|
|
buildoptions
|
|
buildsystem-files
|
|
dependencies
|
|
scan-dependencies
|
|
installed
|
|
install-plan
|
|
projectinfo
|
|
targets
|
|
tests
|
|
backend
|
|
all
|
|
indent
|
|
force-object-output
|
|
)
|
|
|
|
local cur prev
|
|
if ! _get_comp_words_by_ref cur prev &>/dev/null; then
|
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
fi
|
|
|
|
if ! _meson_compgen_options "$cur"; then
|
|
for dir in "${COMP_WORDS[@]}"; do
|
|
if [ -d "$dir" ]; then
|
|
break
|
|
fi
|
|
dir=.
|
|
done
|
|
if [ ! -d "$dir/meson-private" ]; then
|
|
_filedir -d
|
|
fi
|
|
|
|
if [ -z "$cur" ]; then
|
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}'))
|
|
COMPREPLY+=($(compgen -P '-' -W '${shortopts[*]}'))
|
|
fi
|
|
fi
|
|
}
|
|
|
|
_meson-init() {
|
|
shortopts=(
|
|
h
|
|
C
|
|
n
|
|
e
|
|
d
|
|
l
|
|
b
|
|
f
|
|
)
|
|
|
|
longopts=(
|
|
help
|
|
name
|
|
executable
|
|
deps
|
|
language
|
|
build
|
|
builddir
|
|
force
|
|
type
|
|
version
|
|
)
|
|
|
|
if ! _meson_compgen_options "$cur"; then
|
|
if [[ -z $cur ]]; then
|
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}'))
|
|
COMPREPLY+=($(compgen -P '-' -W '${shortopts[*]}'))
|
|
fi
|
|
fi
|
|
}
|
|
|
|
_meson-test() {
|
|
shortopts=(
|
|
h
|
|
q
|
|
v
|
|
t
|
|
C
|
|
)
|
|
|
|
longopts=(
|
|
help
|
|
maxfail
|
|
repeat
|
|
no-rebuild
|
|
gdb
|
|
gdb-path
|
|
list
|
|
wrapper
|
|
suite
|
|
no-suite
|
|
no-stdsplit
|
|
print-errorlogs
|
|
benchmark
|
|
logbase
|
|
num-processes
|
|
verbose
|
|
quiet
|
|
timeout-multiplier
|
|
setup
|
|
test-args
|
|
)
|
|
|
|
local cur prev
|
|
if _get_comp_words_by_ref -n ':' cur prev &>/dev/null; then
|
|
case $prev in
|
|
--maxfail | --repeat)
|
|
# number, can't be completed
|
|
return
|
|
;;
|
|
|
|
--wrapper)
|
|
_command_offset $COMP_CWORD
|
|
return
|
|
;;
|
|
|
|
--gdb-path | -C)
|
|
_filedir -d
|
|
return
|
|
;;
|
|
|
|
--suite | --no-suite)
|
|
for i in "${!COMP_WORDS[@]}"; do
|
|
opt="${COMP_WORDS[i]}"
|
|
dir="${COMP_WORDS[i+1]}"
|
|
case "$opt" in
|
|
-C)
|
|
break
|
|
;;
|
|
esac
|
|
dir=.
|
|
done
|
|
|
|
suites=$(meson introspect "$dir" --tests | python3 -c 'import sys, json;
|
|
for test in json.load(sys.stdin):
|
|
for suite in test["suite"]:
|
|
print(suite)
|
|
' 2> /dev/null)
|
|
# TODO - what?
|
|
|
|
if [[ $? == 0 ]]; then
|
|
COMPREPLY+=($(compgen -W "${suites[*]}" -- "$cur"))
|
|
fi
|
|
return
|
|
;;
|
|
|
|
--logbase)
|
|
# free string, can't be completed
|
|
return
|
|
;;
|
|
|
|
--num-processes)
|
|
# number, can't be completed
|
|
return
|
|
;;
|
|
|
|
-t | --timeout-multiplier)
|
|
# number, can't be completed
|
|
return
|
|
;;
|
|
|
|
--setup)
|
|
# TODO
|
|
return
|
|
;;
|
|
|
|
--test-args)
|
|
return
|
|
;;
|
|
esac
|
|
else
|
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
fi
|
|
|
|
if ! _meson_compgen_options "$cur"; then
|
|
for dir in "${COMP_WORDS[@]}"; do
|
|
if [ -d "$dir" ]; then
|
|
break
|
|
fi
|
|
dir=.
|
|
done
|
|
|
|
if [ ! -d "$dir/meson-private" ]; then
|
|
_filedir -d
|
|
fi
|
|
|
|
for i in "${!COMP_WORDS[@]}"; do
|
|
opt="${COMP_WORDS[i]}"
|
|
dir="${COMP_WORDS[i+1]}"
|
|
case "$opt" in
|
|
-C)
|
|
break
|
|
;;
|
|
esac
|
|
dir=.
|
|
done
|
|
|
|
tests=$(meson introspect "$dir" --tests | python3 -c 'import sys, json;
|
|
for test in json.load(sys.stdin):
|
|
print(test["name"])
|
|
' 2> /dev/null)
|
|
|
|
if [[ $? == 0 ]]; then
|
|
COMPREPLY+=($(compgen -W "${tests[*]}" -- "$cur"))
|
|
fi
|
|
|
|
if [ -z "$cur" ]; then
|
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}' -- "${cur:2}"))
|
|
COMPREPLY+=($(compgen -P '-' -W '${shortopts[*]}' -- "${cur:1}"))
|
|
fi
|
|
fi
|
|
}
|
|
|
|
_meson-wrap() {
|
|
: TODO
|
|
}
|
|
|
|
_meson-subprojects() {
|
|
: TODO
|
|
}
|
|
|
|
_meson-help() {
|
|
longopts=(
|
|
setup
|
|
configure
|
|
dist
|
|
install
|
|
introspect
|
|
init
|
|
test
|
|
wrap
|
|
subprojects
|
|
rewrite
|
|
compile
|
|
devenv
|
|
env2mfile
|
|
)
|
|
|
|
local cur prev
|
|
|
|
if _get_comp_words_by_ref cur prev &>/dev/null; then
|
|
COMPREPLY+=($(compgen -W '${longopts[*]}' -- "${cur}"))
|
|
fi
|
|
}
|
|
|
|
_meson-rewrite() {
|
|
: TODO
|
|
}
|
|
|
|
_meson-compile() {
|
|
shortopts=(
|
|
h
|
|
C
|
|
j
|
|
l
|
|
v
|
|
)
|
|
|
|
longopts=(
|
|
help
|
|
clean
|
|
jobs
|
|
load-average
|
|
verbose
|
|
ninja-args
|
|
vs-args
|
|
xcode-args
|
|
)
|
|
|
|
local cur prev
|
|
if _get_comp_words_by_ref cur prev &>/dev/null; then
|
|
if [[ ${prev:0:2} == -- ]] && _meson_complete_option "${prev:2}" "$cur"; then
|
|
return
|
|
elif [[ ${prev:0:1} == - ]] && [[ ${prev:1:2} != - ]] && _meson_complete_option "${prev:1}"; then
|
|
return
|
|
fi
|
|
else
|
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
fi
|
|
|
|
if ! _meson_compgen_options "$cur"; then
|
|
_filedir -d
|
|
|
|
if [[ -z $cur ]]; then
|
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}'))
|
|
COMPREPLY+=($(compgen -P '-' -W '${shortopts[*]}'))
|
|
fi
|
|
|
|
if [[ $COMP_CWORD == 1 ]]; then
|
|
COMPREPLY+=($(compgen -W "${meson_subcommands[*]}" -- "$cur"))
|
|
fi
|
|
fi
|
|
}
|
|
|
|
_meson-devenv() {
|
|
: TODO
|
|
}
|
|
|
|
_meson-env2mfile() {
|
|
: TODO
|
|
}
|