#compdef meson # 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_common=( '--prefix=[installation prefix]: :_directories' '--bindir=[executable directory]: :_directories' '--datadir=[data file directory]: :_directories' '--includedir=[header file directory]: :_directories' '--infodir=[info page directory]: :_directories' '--libdir=[library directory]: :_directories' '--libexecdir=[library executable directory]: :_directories' '--localedir=[locale data directory]: :_directories' '--localstatedir=[local state data directory]: :_directories' '--mandir=[manual page directory]: :_directories' '--sbindir=[system executable directory]: :_directories' '--sharedstatedir=[arch-independent data directory]: :_directories' '--sysconfdir=[system configuration directory]: :_directories' '--auto-features=[default value for auto features]:auto features types:(auto disabled enabled)' '--backend=[backend to use]:Meson backend:'"$__meson_backends" '--buildtype=[build type to use]:Meson build type:'"$__meson_build_types" '--debug[turn on building with debug]' '--default-library=[default library type]:default library type:(shared static both)' '--errorlogs[prints the logs from failing tests]' '--install-umask=[default umask for permissions of all installed files]' '--layout=[build directory layout]:build directory layout:(flat mirror)' '--optimization=[optimization level for compiled targets]:optimization:(0 g 1 2 3 s)' '--stdsplit=[split stdout and stderr in test logs]' '--strip[strip targets on install]' '--unity=[unity builds on/off]:whether to do unity builds:(on off subprojects)' '--warnlevel=[compiler warning level]:compiler warning level:warning level:(1 2 3)' '--werror[treat warnings as errors]' '--wrap-mode=[special wrap mode]:wrap mode:'"$__meson_wrap_modes" '--force-fallback-for=[force fallback for listed subprojects]' '--pkg-config-path=[extra paths for HOST pkg-config to search]:paths:_files -/' '--build.pkg-config-path=[extra paths for BUILD pkg-config to search]:paths:_files -/' '--cmake-prefix-path=[extra prefixes for HOST cmake to search]:paths:_files -/' '--build.cmake-prefix-path=[extra prefix for BUILD cmake to search]:paths:_files -/' ) 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() {} # `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' \ '--cross-file=[cross-compilation environment description]:cross file:_files' \ '--native-file=[build machine compilation environment description]:native file:_files' \ '--clearcache[clear cached state]' \ '--fatal-meson-warnings=[exit when any meson warnings are encountered]' \ '(-v --version)'{'-v','--version'}'[print the meson version and exit]' \ '--reconfigure=[re-run build configuration]' \ '--wipe=[delete saved state and restart using saved command line options]' \ ":$firstd directory:_directories" \ "::$secondd directory:_directories" \ "${(@)__meson_common}" } (( $+functions[_meson-configure] )) || _meson-configure() { local curcontext="$curcontext" # TODO: implement 'mesonconf @file' local -a specs=( '*-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}" \ "${(@)__meson_common}" } (( $+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=( '--ast[dump the ASK of the meson file]' '--benchmarks[list all benchmarks]' '--buildoptions[list all build options]' '--buildsystem-files[list files that belong to the build system]' '--dependencies[list external dependencies]' '--installed[list all installed files and directories]' '--projectinfo[show project information]' '--targets[list top level targets]' '--tests[list all unit tests]' '--backend=[backend to use]:Meson backend:'"$__meson_backends" '::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