1# $Id: modmisc.mk,v 1.1.1.3 2020/07/09 22:35:19 sjg Exp $ 2# 3# miscellaneous modifier tests 4 5# do not put any dirs in this list which exist on some 6# but not all target systems - an exists() check is below. 7path=:/bin:/tmp::/:.:/no/such/dir:. 8# strip cwd from path. 9MOD_NODOT=S/:/ /g:N.:ts: 10# and decorate, note that $'s need to be doubled. Also note that 11# the modifier_variable can be used with other modifiers. 12MOD_NODOTX=S/:/ /g:N.:@d@'$$d'@ 13# another mod - pretend it is more interesting 14MOD_HOMES=S,/home/,/homes/, 15MOD_OPT=@d@$${exists($$d):?$$d:$${d:S,/usr,/opt,}}@ 16MOD_SEP=S,:, ,g 17 18all: modvar modvarloop modsysv mod-HTE emptyvar undefvar 19all: mod-S mod-C mod-at-varname mod-at-resolve 20all: mod-subst-dollar mod-loop-dollar 21 22modsysv: 23 @echo "The answer is ${libfoo.a:L:libfoo.a=42}" 24 25modvar: 26 @echo "path='${path}'" 27 @echo "path='${path:${MOD_NODOT}}'" 28 @echo "path='${path:S,home,homes,:${MOD_NODOT}}'" 29 @echo "path=${path:${MOD_NODOTX}:ts:}" 30 @echo "path=${path:${MOD_HOMES}:${MOD_NODOTX}:ts:}" 31 32.for d in ${path:${MOD_SEP}:N.} /usr/xbin 33path_$d?= ${d:${MOD_OPT}:${MOD_HOMES}}/ 34paths+= ${d:${MOD_OPT}:${MOD_HOMES}} 35.endfor 36 37modvarloop: 38 @echo "path_/usr/xbin=${path_/usr/xbin}" 39 @echo "paths=${paths}" 40 @echo "PATHS=${paths:tu}" 41 42PATHNAMES= a/b/c def a.b.c a.b/c a a.a .gitignore a a.a 43mod-HTE: 44 @echo "dirname of '"${PATHNAMES:Q}"' is '"${PATHNAMES:H:Q}"'" 45 @echo "basename of '"${PATHNAMES:Q}"' is '"${PATHNAMES:T:Q}"'" 46 @echo "suffix of '"${PATHNAMES:Q}"' is '"${PATHNAMES:E:Q}"'" 47 @echo "root of '"${PATHNAMES:Q}"' is '"${PATHNAMES:R:Q}"'" 48 49# When a modifier is applied to the "" variable, the result is discarded. 50emptyvar: 51 @echo S:${:S,^$,empty,} 52 @echo C:${:C,^$,empty,} 53 @echo @:${:@var@${var}@} 54 55# The :U modifier turns even the "" variable into something that has a value. 56# The resulting variable is empty, but is still considered to contain a 57# single empty word. This word can be accessed by the :S and :C modifiers, 58# but not by the :@ modifier since it explicitly skips empty words. 59undefvar: 60 @echo S:${:U:S,^$,empty,} 61 @echo C:${:U:C,^$,empty,} 62 @echo @:${:U:@var@empty@} 63 64mod-S: 65 @echo :${:Ua b b c:S,a b,,:Q}: 66 @echo :${:Ua b b c:S,a b,,1:Q}: 67 @echo :${:Ua b b c:S,a b,,W:Q}: 68 @echo :${:Ua b b c:S,b,,g:Q}: 69 @echo :${:U1 2 3 1 2 3:S,1 2,___,Wg:S,_,x,:Q}: 70 71mod-C: 72 @echo :${:Ua b b c:C,a b,,:Q}: 73 @echo :${:Ua b b c:C,a b,,1:Q}: 74 @echo :${:Ua b b c:C,a b,,W:Q}: 75 @echo :${:Uword1 word2:C,****,____,g:C,word,____,:Q}: 76 @echo :${:Ua b b c:C,b,,g:Q}: 77 @echo :${:U1 2 3 1 2 3:C,1 2,___,Wg:C,_,x,:Q}: 78 79# In the :@ modifier, the name of the loop variable can even be generated 80# dynamically. There's no practical use-case for this, and hopefully nobody 81# will ever depend on this, but technically it's possible. 82mod-at-varname: 83 @echo :${:Uone two three:@${:Ubar:S,b,v,}@+${var}+@:Q}: 84 85# The :@ modifier resolves the variables a little more often than expected. 86# In particular, it resolves _all_ variables from the context, and not only 87# the loop variable (in this case v). 88# 89# The d means direct reference, the i means indirect reference. 90RESOLVE= ${RES1} $${RES1} 91RES1= 1d${RES2} 1i$${RES2} 92RES2= 2d${RES3} 2i$${RES3} 93RES3= 3 94 95mod-at-resolve: 96 @echo $@:${RESOLVE:@v@w${v}w@:Q}: 97 98# No matter how many dollar characters there are, they all get merged 99# into a single dollar by the :S modifier. 100mod-subst-dollar: 101 @echo $@:${:U1:S,^,$,:Q}: 102 @echo $@:${:U2:S,^,$$,:Q}: 103 @echo $@:${:U3:S,^,$$$,:Q}: 104 @echo $@:${:U4:S,^,$$$$,:Q}: 105 @echo $@:${:U5:S,^,$$$$$,:Q}: 106 @echo $@:${:U6:S,^,$$$$$$,:Q}: 107 @echo $@:${:U7:S,^,$$$$$$$,:Q}: 108 @echo $@:${:U8:S,^,$$$$$$$$,:Q}: 109# This generates no dollar at all: 110 @echo $@:${:UU8:S,^,${:U$$$$$$$$},:Q}: 111# Here is an alternative way to generate dollar characters. 112# It's unexpectedly complicated though. 113 @echo $@:${:U:range=5:ts\x24:C,[0-9],,g:Q}: 114 115# Demonstrate that it is possible to generate dollar characters using the 116# :@ modifier. 117# 118# These are edge cases that could have resulted in a parse error as well 119# since the $@ at the end could have been interpreted as a variable, which 120# would mean a missing closing @ delimiter. 121mod-loop-dollar: 122 @echo $@:${:U1:@word@${word}$@:Q}: 123 @echo $@:${:U2:@word@$${word}$$@:Q}: 124 @echo $@:${:U3:@word@$$${word}$$$@:Q}: 125 @echo $@:${:U4:@word@$$$${word}$$$$@:Q}: 126 @echo $@:${:U5:@word@$$$$${word}$$$$$@:Q}: 127 @echo $@:${:U6:@word@$$$$$${word}$$$$$$@:Q}: 128