The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
416 lines
8.5 KiB
416 lines
8.5 KiB
_meson() { |
|
command="${COMP_WORDS[1]}" |
|
case "$command" in |
|
setup |\ |
|
configure |\ |
|
install |\ |
|
introspect |\ |
|
init |\ |
|
test |\ |
|
wrap |\ |
|
subprojects |\ |
|
help) |
|
_meson-$command "${COMP_WORDS[@]:1}" |
|
;; |
|
*) |
|
_meson-setup "${COMP_WORDS[@]}" |
|
;; |
|
esac |
|
} && |
|
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 |\ |
|
libdir |\ |
|
libexecdir |\ |
|
bindir |\ |
|
sbindir |\ |
|
includedir |\ |
|
datadir |\ |
|
mandir |\ |
|
infodir |\ |
|
localedir |\ |
|
sysconfdir |\ |
|
localstatedir |\ |
|
sharedstatedir) |
|
_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)) |
|
;; |
|
*) |
|
return 1;; |
|
esac |
|
return 0 |
|
} |
|
|
|
_meson-setup() { |
|
|
|
shortopts=( |
|
h |
|
D |
|
v |
|
) |
|
|
|
longopts=( |
|
help |
|
prefix |
|
libdir |
|
libexecdir |
|
bindir |
|
sbindir |
|
includedir |
|
datadir |
|
mandir |
|
infodir |
|
localedir |
|
sysconfdir |
|
localstatedir |
|
sharedstatedir |
|
backend |
|
buildtype |
|
strip |
|
unity |
|
werror |
|
layout |
|
default-library |
|
warnlevel |
|
stdsplit |
|
errorlogs |
|
cross-file |
|
version |
|
wrap-mode |
|
) |
|
|
|
local cur prev |
|
if _get_comp_words_by_ref cur prev &>/dev/null && |
|
[ "${prev:0:2}" = '--' ] && _meson_complete_option "${prev:2}" "$cur"; then |
|
return |
|
elif _get_comp_words_by_ref cur prev &>/dev/null && |
|
[ "${prev:0:1}" = '-' ] && [ "${prev:1:2}" != '-' ] && _meson_complete_option "${prev:1}"; then |
|
return |
|
elif _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 [[ "$cur" == "--"* ]]; then |
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}' -- "${cur:2}")) |
|
elif [[ "$cur" == "-"* ]]; then |
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}' -- "${cur:2}")) |
|
COMPREPLY+=($(compgen -P '-' -W '${shortopts[*]}' -- "${cur:1}")) |
|
else |
|
_filedir -d |
|
if [ -z "$cur" ]; then |
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}')) |
|
COMPREPLY+=($(compgen -P '-' -W '${shortopts[*]}')) |
|
fi |
|
|
|
if [ $COMP_CWORD -eq 1 ]; then |
|
COMPREPLY+=($(compgen -W 'setup configure test introspect' -- "$cur")) |
|
fi |
|
fi |
|
} |
|
|
|
_meson-configure() { |
|
|
|
shortopts=( |
|
h |
|
D |
|
) |
|
|
|
longopts=( |
|
help |
|
clearcache |
|
) |
|
|
|
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 [[ "$cur" == "--"* ]]; then |
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}' -- "${cur:2}")) |
|
elif [[ "$cur" == "-"* ]]; then |
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}' -- "${cur:2}")) |
|
COMPREPLY+=($(compgen -P '-' -W '${shortopts[*]}' -- "${cur:1}")) |
|
else |
|
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-test() { |
|
shortopts=( |
|
q |
|
v |
|
t |
|
C |
|
) |
|
|
|
longopts=( |
|
quiet |
|
verbose |
|
timeout-multiplier |
|
repeat |
|
no-rebuild |
|
gdb |
|
list |
|
wrapper --wrap |
|
no-suite |
|
suite |
|
no-stdsplit |
|
print-errorlogs |
|
benchmark |
|
logbase |
|
num-processes |
|
setup |
|
test-args |
|
) |
|
|
|
local cur prev |
|
if _get_comp_words_by_ref -n ':' cur prev &>/dev/null; then |
|
case $prev in |
|
--repeat) |
|
# number, can't be completed |
|
return |
|
;; |
|
--wrapper) |
|
_command_offset $COMP_CWORD |
|
return |
|
;; |
|
-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=($(python3 -c 'import sys, json; |
|
for test in json.load(sys.stdin): |
|
for suite in test["suite"]: |
|
print(suite) |
|
' <<< "$(meson introspect "$dir" --tests)")) |
|
# TODO |
|
COMPREPLY+=($(compgen -W "${suites[*]}" -- "$cur")) |
|
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 [[ "$cur" == "--"* ]]; then |
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}' -- "${cur:2}")) |
|
elif [[ "$cur" == "-"* && ${#cur} -gt 1 ]]; then |
|
COMPREPLY+=($(compgen -P '-' -W '${shortopts[*]}' -- "${cur:1}")) |
|
else |
|
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=($(python3 -c 'import sys, json; |
|
for test in json.load(sys.stdin): |
|
print(test["name"]) |
|
' <<< "$(meson introspect "$dir" --tests)")) |
|
COMPREPLY+=($(compgen -W "${tests[*]}" -- "$cur")) |
|
|
|
if [ -z "$cur" ]; then |
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}' -- "${cur:2}")) |
|
COMPREPLY+=($(compgen -P '-' -W '${shortopts[*]}' -- "${cur:1}")) |
|
fi |
|
fi |
|
} |
|
|
|
_meson-introspect() { |
|
shortopts=( |
|
h |
|
) |
|
|
|
longopts=( |
|
targets |
|
installed |
|
buildsystem-files |
|
buildoptions |
|
tests |
|
benchmarks |
|
dependencies |
|
projectinfo |
|
) |
|
|
|
local cur prev |
|
if ! _get_comp_words_by_ref cur prev &>/dev/null; then |
|
cur="${COMP_WORDS[COMP_CWORD]}" |
|
fi |
|
|
|
if [[ "$cur" == "--"* ]]; then |
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}' -- "${cur:2}")) |
|
elif [[ "$cur" == "-"* ]]; then |
|
COMPREPLY+=($(compgen -P '--' -W '${longopts[*]}' -- "${cur:2}")) |
|
COMPREPLY+=($(compgen -P '-' -W '${shortopts[*]}' -- "${cur:1}")) |
|
else |
|
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-wrap() { |
|
: TODO |
|
}
|
|
|