# gcc(1) completion -*- shell-script -*- # # The only unusual feature is that we don't parse "gcc --help -v" output # directly, because that would include the options of all the other backend # tools (linker, assembler, preprocessor, etc) without any indication that # you cannot feed such options to the gcc driver directly. (For example, the # linker takes a -z option, but you must type -Wl,-z for gcc.) Instead, we # ask the driver ("g++") for the name of the compiler ("cc1"), and parse the # --help output of the compiler. proc _gcc { var cur = '', prev = '', words = '', cword = '' _init_completion || return _expand || return 0 var cc = '', backend = '' match $1 { with gcj set backend = 'jc1' with gpc set backend = 'gpc1' with *77 set backend = 'f771' with *95 set backend = 'f951' with * set backend = 'cc1' # (near-)universal backend } if [[ "$cur" == -* ]] { set cc = $[ $1 -print-prog-name=$backend !2 >/dev/null] [[ $cc ]] || return # sink stderr: # for C/C++/ObjectiveC it's useless # for FORTRAN/Java it's an error setglobal COMPREPLY = '( '$( compgen -W "$( $cc --help 2>/dev/null | tr '\t' ' ' |\ sed -e '/^ *-/!d' -e 's/ *-\([^][ <>]*\).*/-\1/' )" -- "$cur" ) ) [[ $COMPREPLY == *= ]] && compopt -o nospace } else { _filedir } } && complete -F _gcc gcc g++ gfortran g77 g95 gcj gpc && do { cc --version !2 >/dev/null | command grep -q GCC || \ [[ $( _realcommand cc ) == *gcc* ]] && \ complete -F _gcc cc || complete -F _minimal cc c++ --version !2 >/dev/null | command grep -q GCC || \ [[ $( _realcommand c++ ) == *g++* ]] && \ complete -F _gcc c++ || complete -F _minimal c++ f77 --version !2 >/dev/null | command grep -q GCC || \ [[ $( _realcommand f77 ) == *gfortran* ]] && \ complete -F _gcc f77 || complete -F _minimal f77 f95 --version !2 >/dev/null | command grep -q GCC || \ [[ $( _realcommand f95 ) == *gfortran* ]] && \ complete -F _gcc f95 || complete -F _minimal f95 } # ex: ts=4 sw=4 et filetype=sh