# 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. _gcc() { local cur prev words cword _init_completion || return _expand || return 0 local cc backend case $1 in gcj) backend=jc1 ;; gpc) backend=gpc1 ;; *77) backend=f771 ;; *) backend=cc1 # (near-)universal backend ;; esac if [[ "$cur" == -* ]]; then 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 COMPREPLY=( $( compgen -W "$( $cc --help 2>/dev/null | tr '\t' ' ' |\ sed -e '/^ *-/!d' -e 's/ *-\([^][ <>]*\).*/-\1/' )" -- "$cur" ) ) [[ $COMPREPLY == *= ]] && compopt -o nospace else _filedir fi } && complete -F _gcc gcc g++ g77 gcj gpc && { cc --version 2>/dev/null | grep -q 'GCC\|Debian' && complete -F _gcc cc || : c++ --version 2>/dev/null | grep -q 'GCC\|Debian' && complete -F _gcc c++ || : } # ex: ts=4 sw=4 et filetype=sh