99 lines
2.9 KiB
Bash
99 lines
2.9 KiB
Bash
# -*- mode: sh; sh-indentation: 4; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
|
# Almost all code borrowed from Zshell's _make function
|
|
#
|
|
# Copyright (c) 2018 Sebastian Gniazdowski
|
|
|
|
local -a TARGETS
|
|
|
|
.make-expandVars() {
|
|
local open close var val front='' rest=$1
|
|
|
|
while [[ $rest == (#b)[^$]#($)* ]]; do
|
|
front=$front${rest[1,$mbegin[1]-1]}
|
|
rest=${rest[$mbegin[1],-1]}
|
|
|
|
case $rest[2] in
|
|
($) # '$$'. may not appear in target and variable's value
|
|
front=$front\$\$
|
|
rest=${rest[3,-1]}
|
|
continue
|
|
;;
|
|
(\() # Variable of the form $(foobar)
|
|
open='('
|
|
close=')'
|
|
;;
|
|
({) # ${foobar}
|
|
open='{'
|
|
close='}'
|
|
;;
|
|
([[:alpha:]]) # $foobar. This is exactly $(f)oobar.
|
|
open=''
|
|
close=''
|
|
var=$rest[2]
|
|
;;
|
|
(*) # bad parameter name
|
|
print -- $front$rest
|
|
return 1
|
|
;;
|
|
esac
|
|
|
|
if [[ -n $open ]]; then
|
|
if [[ $rest == \$$open(#b)([[:alnum:]_]##)(#B)$close* ]]; then
|
|
var=$match
|
|
else # unmatched () or {}, or bad parameter name
|
|
print -- $front$rest
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
val=''
|
|
if [[ -n ${VAR_ARGS[(i)$var]} ]]; then
|
|
val=${VAR_ARGS[$var]}
|
|
else
|
|
if [[ -n $opt_args[(I)(-e|--environment-overrides)] ]]; then
|
|
if [[ $parameters[$var] == scalar-export* ]]; then
|
|
val=${(P)var}
|
|
elif [[ -n ${VARIABLES[(i)$var]} ]]; then
|
|
val=${VARIABLES[$var]}
|
|
fi
|
|
else
|
|
if [[ -n ${VARIABLES[(i)$var]} ]]; then
|
|
val=${VARIABLES[$var]}
|
|
elif [[ $parameters[$var] == scalar-export* ]]; then
|
|
val=${(P)var}
|
|
fi
|
|
fi
|
|
fi
|
|
rest=${rest//\$$open$var$close/$val}
|
|
done
|
|
|
|
print -- ${front}${rest}
|
|
}
|
|
|
|
|
|
.make-parseMakefile () {
|
|
local input var val target dep TAB=$'\t' tmp IFS=
|
|
|
|
while read input
|
|
do
|
|
case "$input " in
|
|
# TARGET: dependencies
|
|
# TARGET1 TARGET2 TARGET3: dependencies
|
|
([[*?[:alnum:]$][^$TAB:=%]#:[^=]*)
|
|
target=$(.make-expandVars ${input%%:*})
|
|
TARGETS+=( ${(z)target} )
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
if [[ -z "${FAST_HIGHLIGHT[chroma-make-cache]}" || $(( EPOCHSECONDS - FAST_HIGHLIGHT[chroma-make-cache-born-at] )) -gt 7 ]]; then
|
|
.make-parseMakefile
|
|
FAST_HIGHLIGHT[chroma-make-cache-born-at]="$EPOCHSECONDS"
|
|
FAST_HIGHLIGHT[chroma-make-cache]="${(j:;:)TARGETS}"
|
|
fi
|
|
|
|
reply2=( "${(s:;:)FAST_HIGHLIGHT[chroma-make-cache]}" )
|
|
|
|
# vim:ft=zsh:et
|