mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-19 11:31:26 +01:00
35957: fix _make-expandVars()
Also use variables set in the command line and environment.
This commit is contained in:
parent
3d9a8073c2
commit
f4723a0c08
2 changed files with 77 additions and 60 deletions
|
@ -1,3 +1,8 @@
|
|||
2015-08-01 Jun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>
|
||||
|
||||
* 35957: Completion/Unix/Command/_make: fix _make-expandVars(),
|
||||
and use variables set in the command line and environment.
|
||||
|
||||
2015-07-31 Oliver Kiddle <opk@zsh.org>
|
||||
|
||||
* 35963: Src/Modules/system.c: simplify condition found by
|
||||
|
|
|
@ -4,58 +4,68 @@
|
|||
# are used in those targets and their dependencies.
|
||||
|
||||
_make-expandVars() {
|
||||
local open close var val front ret tmp=$1
|
||||
local open close var val front='' rest=$1
|
||||
|
||||
front=${tmp%%\$*}
|
||||
case $tmp in
|
||||
(\(*) # Variable of the form $(foobar)
|
||||
open='('
|
||||
close=')'
|
||||
;;
|
||||
while [[ $rest == (#b)[^$]#($)* ]]; do
|
||||
front=$front${rest[1,$mbegin[1]-1]}
|
||||
rest=${rest[$mbegin[1],-1]}
|
||||
|
||||
({*) # ${foobar}
|
||||
open='{'
|
||||
close='}'
|
||||
;;
|
||||
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
|
||||
|
||||
([[:alpha:]]*) # $foobar. This is exactly $(f)oobar.
|
||||
open=''
|
||||
close=''
|
||||
var=${(s::)var[1]}
|
||||
;;
|
||||
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
|
||||
|
||||
(\$*) # Escaped $.
|
||||
print -- "${front}\$$(_make-expandVars ${tmp#\$})"
|
||||
return
|
||||
;;
|
||||
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
|
||||
|
||||
(*) # Nothing left to substitute.
|
||||
print -- $tmp
|
||||
return
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ -n $open ]]
|
||||
then
|
||||
var=${tmp#$open}
|
||||
var=${var%%$close*}
|
||||
fi
|
||||
|
||||
case $var in
|
||||
([[:alnum:]_]#)
|
||||
val=${VARIABLES[$var]}
|
||||
ret=${ret//\$$open$var$close/$val}
|
||||
;;
|
||||
|
||||
(*)
|
||||
# Improper variable name. No replacement.
|
||||
# I'm not sure if this is desired behavior.
|
||||
front+="\$$open$var$close"
|
||||
ret=${ret/\$$open$var$close/}
|
||||
;;
|
||||
esac
|
||||
|
||||
print -- "${front}$(_make-expandVars ${ret})"
|
||||
print -- ${front}${rest}
|
||||
}
|
||||
|
||||
_make-parseMakefile () {
|
||||
|
@ -84,16 +94,9 @@ _make-parseMakefile () {
|
|||
|
||||
# TARGET: dependencies
|
||||
# TARGET1 TARGET2 TARGET3: dependencies
|
||||
([[:alnum:]][^$TAB:=]#:[^=]*)
|
||||
input=$(_make-expandVars $input)
|
||||
target=${input%%:*}
|
||||
dep=${input#*:}
|
||||
dep=${(z)dep}
|
||||
dep="$dep"
|
||||
for tmp in ${(z)target}
|
||||
do
|
||||
TARGETS[$tmp]=$dep
|
||||
done
|
||||
([[*?[:alnum:]$][^$TAB:=%]#:[^=]*)
|
||||
target=$(_make-expandVars ${input%%:*})
|
||||
TARGETS+=( ${(z)target} )
|
||||
;;
|
||||
|
||||
# Include another makefile
|
||||
|
@ -150,9 +153,18 @@ _make() {
|
|||
local prev="$words[CURRENT-1]" file expl tmp is_gnu dir incl match
|
||||
local context state state_descr line
|
||||
local -a option_specs
|
||||
local -A TARGETS VARIABLES opt_args
|
||||
local -A VARIABLES VAR_ARGS opt_args
|
||||
local -aU TARGETS keys
|
||||
local ret=1
|
||||
|
||||
# VAR=VAL on the current command line
|
||||
for tmp in $words; do
|
||||
if [[ $tmp == (#b)([[:alnum:]_]##)=(*) ]]; then
|
||||
VAR_ARGS[${tmp[$mbegin[1],$mend[1]]}]=${(e)tmp[$mbegin[2],$mend[2]]}
|
||||
fi
|
||||
done
|
||||
keys=( ${(k)VAR_ARGS} ) # to be used in 'compadd -F keys'
|
||||
|
||||
_pick_variant -r is_gnu gnu=GNU unix -v -f
|
||||
|
||||
if [[ $is_gnu == gnu ]]
|
||||
|
@ -275,9 +287,9 @@ _make() {
|
|||
while _tags
|
||||
do
|
||||
_requested targets expl 'make targets' \
|
||||
compadd -- ${(k)TARGETS} && ret=0
|
||||
compadd -Q -- $TARGETS && ret=0
|
||||
_requested variables expl 'make variables' \
|
||||
compadd -S '=' -- ${(k)VARIABLES} && ret=0
|
||||
compadd -S '=' -F keys -- ${(k)VARIABLES} && ret=0
|
||||
done
|
||||
fi
|
||||
esac
|
||||
|
|
Loading…
Reference in a new issue