| #compdef meson mesonconf=meson-configure mesontest=meson-test mesonintrospect=meson-introspect |
| |
| # vim:ts=2 sw=2 |
| |
| # Copyright (c) 2017 Arseny Maslennikov |
| # All rights reserved. Individual authors, whether or not |
| # specifically named, retain copyright in all changes; in what follows, they |
| # are referred to as `the Meson development team'. This is for convenience |
| # only and this body has no legal status. This file is distributed under |
| # the following licence. |
| # |
| # Permission is hereby granted, without written agreement and without |
| # licence or royalty fees, to use, copy, modify, and distribute this |
| # software and to distribute modified versions of this software for any |
| # purpose, provided that the above copyright notice and the following |
| # two paragraphs appear in all copies of this software. |
| # |
| # In no event shall the Meson development team be liable to any party for |
| # direct, indirect, special, incidental, or consequential damages arising out |
| # of the use of this software and its documentation, even if the Meson |
| # development team have been advised of the possibility of such damage. |
| # |
| # The Meson development team specifically disclaim any warranties, including, |
| # but not limited to, the implied warranties of merchantability and fitness |
| # for a particular purpose. The software provided hereunder is on an "as is" |
| # basis, and the Meson development team have no obligation to provide |
| # maintenance, support, updates, enhancements, or modifications. |
| |
| local curcontext="$curcontext" state line |
| local -i ret |
| |
| local __meson_backends="(ninja xcode ${(j. .)${:-vs{,2010,2015,2017}}})" |
| local __meson_build_types="(plain debug debugoptimized minsize release)" |
| local __meson_wrap_modes="(WrapMode.{default,nofallback,nodownload,forcefallback})" |
| |
| local -a meson_commands=( |
| 'setup:set up a build directory' |
| 'configure:configure a project' |
| 'test:run tests' |
| 'introspect:query project properties' |
| 'wrap:manage source dependencies' |
| ) |
| |
| (( $+functions[__meson_is_build_dir] )) || __meson_is_build_dir() { |
| local mpd="${1:-$PWD}/meson-private" |
| [[ -f "$mpd/build.dat" && -f "$mpd/coredata.dat" ]] |
| return $? |
| } |
| |
| # TODO: implement build option completion |
| (( $+functions[__meson_build_options] )) || __meson_build_options() {} |
| # TODO: implement target name completion |
| (( $+functions[__meson_targets] )) || __meson_targets() {} |
| # `meson introspect` currently can provide that information in JSON. |
| # We can: |
| # 1) pipe its output to python3 -m json.tool | grep "$alovelyregex" | cut <...> |
| # 2) teach mintro.py to use a different output format |
| # (or perhaps just to select the fields printed) |
| |
| (( $+functions[__meson_test_names] )) || __meson_test_names() { |
| local rtests |
| if rtests="$(_call_program meson meson test ${opt_args[-C]:+-C "$opt_args[-C]"} --list)"; |
| then |
| local -a tests=(${(@f)rtests}) |
| _describe -t "tests" "Meson tests" tests |
| else |
| _message -r "current working directory is not a build directory" |
| _message -r 'use -C $build_dir or cd $build_dir' |
| fi |
| } |
| |
| (( $+functions[_meson_commands] )) || _meson_commands() { |
| _describe -t commands "Meson subcommands" meson_commands |
| } |
| |
| (( $+functions[_meson-setup] )) || _meson-setup() { |
| local firstd secondd |
| if [[ -f "meson.build" ]]; then |
| # if there's no second argument on the command line |
| # cwd will implicitly be substituted: |
| # - as the source directory if it has a file with the name "meson.build"; |
| # - as the build directory otherwise |
| # more info in mesonbuild/mesonmain.py |
| firstd="build" |
| secondd="source" |
| else |
| firstd="source" |
| secondd="build" |
| fi |
| |
| _arguments \ |
| '*-D-[set the value of a build option]:build option:__meson_build_options' \ |
| '--prefix=[installation prefix]: :_directories' \ |
| '--libdir=[library directory]: :_directories' \ |
| '--libexecdir=[library executable directory]: :_directories' \ |
| '--bindir=[executable directory]: :_directories' \ |
| '--sbindir=[system executable directory]: :_directories' \ |
| '--includedir=[header file directory]: :_directories' \ |
| '--datadir=[data file directory]: :_directories' \ |
| '--mandir=[manual page directory]: :_directories' \ |
| '--infodir=[info page directory]: :_directories' \ |
| '--localedir=[locale data directory]: :_directories' \ |
| '--sysconfdir=[system configuration directory]: :_directories' \ |
| '--localstatedir=[local state data directory]: :_directories' \ |
| '--sharedstatedir=[arch-independent data directory]: :_directories' \ |
| '--backend=[backend to use]:Meson backend:'"$__meson_backends" \ |
| '--buildtype=[build type to use]:Meson build type:'"$__meson_build_types" \ |
| '--strip[strip targets on install]' \ |
| '--unity=[unity builds on/off]:whether to do unity builds:(on off subprojects)' \ |
| '--werror[treat warnings as errors]' \ |
| '--layout=[build directory layout]:build directory layout:(flat mirror)' \ |
| '--default-library=[default library type]:default library type:(shared static)' \ |
| '--warnlevel=[compiler warning level]:compiler warning level:warning level:(1 2 3)' \ |
| '--stdsplit=[split stdout and stderr in test logs]' \ |
| '--errorlogs=[prints the logs from failing tests]' \ |
| '--cross-file=[cross-compilation environment description]:cross file:_files' \ |
| '--wrap-mode=[special wrap mode]:wrap mode:'"$__meson_wrap_modes" \ |
| ":$firstd directory:_directories" \ |
| "::$secondd directory:_directories" \ |
| # |
| } |
| |
| (( $+functions[_meson-configure] )) || _meson-configure() { |
| local curcontext="$curcontext" |
| # TODO: implement 'mesonconf @file' |
| local -a specs=( |
| '--clearcache[clear cached state]' |
| '*-D-[set the value of a build option]:build option:__meson_build_options' |
| '::build directory:_directories' |
| ) |
| |
| _arguments \ |
| '(: -)'{'--help','-h'}'[show a help message and quit]' \ |
| "${(@)specs}" |
| } |
| |
| (( $+functions[_meson-test] )) || _meson-test() { |
| local curcontext="$curcontext" |
| |
| # TODO: complete test suites |
| local -a specs=( |
| '(--quiet -q)'{'--quiet','-q'}'[produce less output to the terminal]' |
| '(--verbose -v)'{'--verbose','-v'}'[do not redirect stdout and stderr]' |
| '(--timeout-multiplier -t)'{'--timeout-multiplier','-t'}'[a multiplier for test timeouts]:Python floating-point number: ' |
| '-C[directory to cd into]: :_directories' |
| '--repeat[number of times to run the tests]:number of times to repeat: ' |
| '--no-rebuild[do not rebuild before running tests]' |
| '--gdb[run tests under gdb]' |
| '--list[list available tests]' |
| '(--wrapper --wrap)'{'--wrapper=','--wrap='}'[wrapper to run tests with]:wrapper program:_path_commands' |
| '(--no-suite)--suite[only run tests from this suite]:test suite: ' |
| '(--suite)--no-suite[do not run tests from this suite]:test suite: ' |
| '--no-stdsplit[do not split stderr and stdout in logs]' |
| '--print-errorlogs[print logs for failing tests]' |
| '--benchmark[run benchmarks instead of tests]' |
| '--logbase[base name for log file]:filename: ' |
| '--num-processes[how many threads to use]:number of processes: ' |
| '--setup[which test setup to use]:test setup: ' |
| '--test-args[arguments to pass to the tests]: : ' |
| '*:Meson tests:__meson_test_names' |
| ) |
| |
| _arguments \ |
| '(: -)'{'--help','-h'}'[show a help message and quit]' \ |
| "${(@)specs}" |
| } |
| |
| (( $+functions[_meson-introspect] )) || _meson-introspect() { |
| local curcontext="$curcontext" |
| local -a specs=( |
| '--targets[list top level targets]' |
| '--installed[list all installed files and directories]' |
| '--target-files[list source files for a given target]:target:__meson_targets' |
| '--buildsystem-files[list files that belong to the build system]' |
| '--buildoptions[list all build options]' |
| '--tests[list all unit tests]' |
| '--benchmarks[list all benchmarks]' |
| '--dependencies[list external dependencies]' |
| '--projectinfo[show project information]' |
| '::build directory:_directories' |
| ) |
| _arguments \ |
| '(: -)'{'--help','-h'}'[show a help message and quit]' \ |
| "${(@)specs}" |
| } |
| |
| (( $+functions[_meson-wrap] )) || _meson-wrap() { |
| # TODO |
| } |
| |
| if [[ $service != meson ]]; then |
| _call_function ret _$service |
| return ret |
| fi |
| |
| _arguments -C -R \ |
| '(: -)'{'--help','-h'}'[show a help message and quit]' \ |
| '(: -)'{'--version','-v'}'[show version information and quit]' \ |
| '(-): :_meson_commands' \ |
| '*:: :->post-command' \ |
| # |
| ret=$? |
| |
| [[ $ret = 300 ]] && case "$state" in |
| post-command) |
| service="meson-$words[1]" |
| curcontext=${curcontext%:*:*}:$service: |
| _call_function ret _$service |
| ;; |
| esac |
| |
| return ret |
| |