mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 18:10:56 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			132 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #compdef make gmake pmake dmake
 | |
| 
 | |
| local prev="$words[CURRENT-1]" file expl tmp is_gnu dir incl
 | |
| 
 | |
| expandVars() {
 | |
|     local open close var val tmp=$2 ret=$2
 | |
|     if (( $1 == 0 )); then
 | |
| 	return
 | |
|     fi
 | |
|     while :; do
 | |
| 	var=${tmp#*\$}
 | |
| 	if [[ $var != $tmp ]]; then
 | |
| 	    tmp=$var
 | |
| 	    case $var in
 | |
| 	    (\(*)
 | |
| 		open='('
 | |
| 		close=')'
 | |
| 		;;
 | |
| 	    ({*)
 | |
| 		open='{'
 | |
| 		close='}'
 | |
| 		;;
 | |
| 	    ([[:alpha:]]*)
 | |
| 		open=''
 | |
| 		close=''
 | |
| 		var=${(s::)var[1]}
 | |
| 		;;
 | |
| 	    (\$*)
 | |
| 		# avoid parsing second $ in $$
 | |
| 		tmp=${tmp#\$}
 | |
| 		;&
 | |
| 	    (*)
 | |
| 		continue
 | |
| 		;;
 | |
| 	    esac
 | |
| 	    if [[ $open != '' ]]; then
 | |
| 		var=${var#$open}
 | |
| 		var=${var%%$close*}
 | |
| 	    fi
 | |
| 	    case $var in
 | |
| 	    ([[:alnum:]_]#)
 | |
| 		val=${(P)var}
 | |
| 		val=$(expandVars $(($1 - 1)) $val)
 | |
| 		ret=${ret//\$$open$var$close/$val}
 | |
| 		;;
 | |
| 	    esac
 | |
| 	else
 | |
| 	    print -- ${ret//\$\$/\$}
 | |
| 	    return
 | |
| 	fi
 | |
|     done
 | |
| }
 | |
| 
 | |
| parseMakefile() {
 | |
|     local input var val TAB=$'\t' dir=$1
 | |
| 
 | |
|     while read input; do
 | |
| 	case "$input " in
 | |
| 	([[:alnum:]][[:alnum:]_]#[ $TAB]#=*)
 | |
| 	    var=${input%%[ $TAB]#=*}
 | |
| 	    val=${input#*=}
 | |
| 	    val=${val##[ $TAB]#}
 | |
| 	    eval $var=\$val
 | |
| 	    ;;
 | |
| 	([[:alnum:]][[:alnum:]_]#[ $TAB]#:=*)
 | |
| 	    var=${input%%[ $TAB]#:=*}
 | |
| 	    val=${input#*=}
 | |
| 	    val=${val##[ $TAB]#}
 | |
| 	    val=$(expandVars 10 $val)
 | |
| 	    eval $var=\$val
 | |
| 	    ;;
 | |
| 	([[:alnum:]][^$TAB:=]#:[^=]*)
 | |
| 	    input=${input%%:*}
 | |
| 	    print $(expandVars 10 $input)
 | |
| 	    ;;
 | |
| 	($incl *)
 | |
| 	    local f=${input##$incl ##}
 | |
| 	    if [[ $incl = '.include' ]]; then
 | |
| 		f=${f#[\"<]}
 | |
| 		f=${f%[\">]}
 | |
| 	    fi
 | |
| 	    f=$(expandVars 10 $f)
 | |
| 	    case $f in
 | |
| 	    (/*) ;;
 | |
| 	    (*)  f=$dir/$f ;;
 | |
| 	    esac
 | |
| 	    if [ -r $f ]; then
 | |
| 		parseMakefile ${f%%/[^/]##} < $f
 | |
| 	    fi
 | |
| 	    ;;
 | |
| 	esac
 | |
|     done
 | |
| }
 | |
| 
 | |
| _pick_variant -r is_gnu gnu=GNU unix -v -f
 | |
| 
 | |
| if [[ $is_gnu = gnu ]]; then
 | |
|     incl=include
 | |
| else
 | |
|     incl=.include
 | |
| fi
 | |
| if [[ "$prev" = -[CI] ]]; then
 | |
|   _files -/
 | |
| elif [[ "$prev" = -[foW] ]]; then
 | |
|   _files
 | |
| else
 | |
|   file="$words[(I)-f]"
 | |
|   if (( file )); then
 | |
|     file="$words[file+1]"
 | |
|   elif [[ -e Makefile ]]; then
 | |
|     file=Makefile
 | |
|   elif [[ -e makefile ]]; then
 | |
|     file=makefile
 | |
|   elif [[ $is_gnu = gnu && -e GNUmakefile ]]; then
 | |
|     file=GNUmakefile
 | |
|   else
 | |
|     file=''
 | |
|   fi
 | |
| 
 | |
|   if [[ -n "$file" ]] && _tags targets; then
 | |
|     if [[ $is_gnu = gnu ]] &&
 | |
|        zstyle -t ":completion:${curcontext}:targets" call-command; then
 | |
|        tmp=( $(_call_program targets "$words[1]" -nsp --no-print-directory -f "$file" .PHONY 2> /dev/null | parseMakefile $PWD) )
 | |
|     else
 | |
|        tmp=( $(parseMakefile $PWD < $file) )
 | |
|     fi
 | |
|     _wanted targets expl 'make target' compadd -a tmp && return 0
 | |
|   fi
 | |
|   compstate[parameter]="${PREFIX%%\=*}"
 | |
|   compset -P 1 '*='
 | |
|   _value "$@"
 | |
| fi
 |