aboutsummaryrefslogblamecommitdiff
path: root/bash/bash_completion.d/make.bash
blob: bf4ed26810fdc9e3ba3d3c0ab3f399000bd96852 (plain) (tree)
1
2
3
4
5
6
                                               
         
 
                                 
                                 
 









                                                                    
                                
                                                  




                                                                   
                                   
 












                                                                             
                    


                   
 
                                 
# Completion setup for Make, completing targets
_make() {

    # Bail if no legible Makefile
    [[ -r Makefile ]] || return 1

    # Iterate through the Makefile, line by line
    while IFS= read -r line ; do
        case $line in

            # We're looking for targets but not variable assignments
            $'\t'*) ;;
            *:=*) ;;
            *:*)

                # Break the target up with space delimiters
                local -a targets
                IFS=' ' read -rd '' -a targets < \
                    <(printf '%s\0' "${line%%:*}")

                # Iterate through the targets and add suitable ones
                local target
                for target in "${targets[@]}" ; do
                    case $target in

                        # Don't complete special targets beginning with a
                        # period
                        .*) ;;

                        # Don't complete targets with names that have
                        # characters outside of the POSIX spec (plus slashes)
                        *[^[:word:]./-]*) ;;

                        # Add targets that match what we're completing
                        ${COMP_WORDS[COMP_CWORD]}*)
                            COMPREPLY[${#COMPREPLY[@]}]=$target
                            ;;
                    esac
                done
                ;;
        esac
    done < Makefile
}
complete -F _make -o default make