Home | History | Annotate | Line # | Download | only in unit-tests
varmisc.mk revision 1.14
      1  1.14  rillig # $Id: varmisc.mk,v 1.14 2020/07/26 11:10:29 rillig Exp $
      2   1.1     apb #
      3   1.1     apb # Miscellaneous variable tests.
      4   1.1     apb 
      5   1.6     sjg all: unmatched_var_paren D_true U_true D_false U_false Q_lhs Q_rhs NQ_none \
      6   1.9     sjg 	strftime cmpv manok
      7  1.12  rillig all: save-dollars
      8  1.14  rillig all: export-appended
      9   1.1     apb 
     10   1.1     apb unmatched_var_paren:
     11   1.2     sjg 	@echo ${foo::=foo-text}
     12   1.3     sjg 
     13   1.4     sjg True = ${echo true >&2:L:sh}TRUE
     14   1.4     sjg False= ${echo false >&2:L:sh}FALSE
     15   1.3     sjg 
     16   1.3     sjg VSET= is set
     17   1.3     sjg .undef UNDEF
     18   1.3     sjg 
     19   1.3     sjg U_false:
     20   1.3     sjg 	@echo :U skipped when var set
     21   1.3     sjg 	@echo ${VSET:U${False}}
     22   1.3     sjg 
     23   1.3     sjg D_false:
     24   1.3     sjg 	@echo :D skipped if var undef
     25   1.3     sjg 	@echo ${UNDEF:D${False}}
     26   1.3     sjg 
     27   1.3     sjg U_true:
     28   1.3     sjg 	@echo :U expanded when var undef
     29   1.3     sjg 	@echo ${UNDEF:U${True}}
     30   1.3     sjg 
     31   1.3     sjg D_true:
     32   1.3     sjg 	@echo :D expanded when var set
     33   1.3     sjg 	@echo ${VSET:D${True}}
     34   1.3     sjg 
     35   1.3     sjg Q_lhs:
     36   1.3     sjg 	@echo :? only lhs when value true
     37   1.3     sjg 	@echo ${1:L:?${True}:${False}}
     38   1.3     sjg 
     39   1.3     sjg Q_rhs:
     40   1.3     sjg 	@echo :? only rhs when value false
     41   1.3     sjg 	@echo ${0:L:?${True}:${False}}
     42   1.5     sjg 
     43   1.5     sjg NQ_none:
     44   1.5     sjg 	@echo do not evaluate or expand :? if discarding
     45   1.5     sjg 	@echo ${VSET:U${1:L:?${True}:${False}}}
     46   1.6     sjg 
     47   1.6     sjg April1= 1459494000
     48   1.6     sjg 
     49   1.6     sjg # slightly contorted syntax to use utc via variable
     50   1.6     sjg strftime:
     51   1.6     sjg 	@echo ${year=%Y month=%m day=%d:L:gmtime=1459494000}
     52   1.6     sjg 	@echo date=${%Y%m%d:L:${gmtime=${April1}:L}}
     53   1.6     sjg 
     54   1.7     sjg # big jumps to handle 3 digits per step
     55   1.8     sjg M_cmpv.units = 1 1000 1000000
     56   1.7     sjg M_cmpv = S,., ,g:_:range:@i@+ $${_:[-$$i]} \* $${M_cmpv.units:[$$i]}@:S,^,expr 0 ,1:sh
     57   1.7     sjg 
     58   1.8     sjg Version = 123.456.789
     59   1.8     sjg cmpv.only = target specific vars
     60   1.7     sjg 
     61   1.7     sjg cmpv:
     62   1.7     sjg 	@echo Version=${Version} == ${Version:${M_cmpv}}
     63   1.7     sjg 	@echo Literal=3.4.5 == ${3.4.5:L:${M_cmpv}}
     64   1.8     sjg 	@echo We have ${${.TARGET:T}.only}
     65   1.9     sjg 
     66   1.9     sjg # catch misshandling of nested vars in .for loop
     67   1.9     sjg MAN=
     68   1.9     sjg MAN1= make.1
     69   1.9     sjg .for s in 1 2
     70   1.9     sjg .if defined(MAN$s) && !empty(MAN$s)
     71   1.9     sjg MAN+= ${MAN$s}
     72   1.9     sjg .endif
     73   1.9     sjg .endfor
     74   1.9     sjg 
     75   1.9     sjg manok:
     76   1.9     sjg 	@echo MAN=${MAN}
     77  1.10  rillig 
     78  1.10  rillig # This is an expanded variant of the above .for loop.
     79  1.11  rillig # Between 2020-06-28 and 2020-07-02 this paragraph generated a wrong
     80  1.10  rillig # error message "Variable VARNAME is recursive".
     81  1.10  rillig # When evaluating the !empty expression, the ${:U1} was not expanded and
     82  1.10  rillig # thus resulted in the seeming definition VARNAME=${VARNAME}, which is
     83  1.10  rillig # obviously recursive.
     84  1.10  rillig VARNAME=	${VARNAME${:U1}}
     85  1.10  rillig .if defined(VARNAME${:U2}) && !empty(VARNAME${:U2})
     86  1.10  rillig .endif
     87  1.12  rillig 
     88  1.12  rillig # begin .MAKE.SAVE_DOLLARS; see Var_Set_with_flags and s2Boolean.
     89  1.12  rillig SD_VALUES=	0 1 2 False True false true Yes No yes no On Off ON OFF on off
     90  1.12  rillig SD_4_DOLLARS=	$$$$
     91  1.12  rillig 
     92  1.12  rillig .for val in ${SD_VALUES}
     93  1.12  rillig .MAKE.SAVE_DOLLARS:=	${val}	# Must be := since a simple = has no effect.
     94  1.12  rillig SD.${val}:=		${SD_4_DOLLARS}
     95  1.12  rillig .endfor
     96  1.12  rillig .MAKE.SAVE_DOLLARS:=	yes
     97  1.12  rillig 
     98  1.12  rillig save-dollars:
     99  1.12  rillig .for val in ${SD_VALUES}
    100  1.12  rillig 	@printf '%s: %-8s = %s\n' $@ ${val} ${SD.${val}:Q}
    101  1.12  rillig .endfor
    102  1.13  rillig 
    103  1.13  rillig # Appending to an undefined variable does not add a space in front.
    104  1.13  rillig .undef APPENDED
    105  1.13  rillig APPENDED+=	value
    106  1.13  rillig .if ${APPENDED} != "value"
    107  1.13  rillig .error "${APPENDED}"
    108  1.13  rillig .endif
    109  1.13  rillig 
    110  1.13  rillig # Appending to an empty variable adds a space between the old value
    111  1.13  rillig # and the additional value.
    112  1.13  rillig APPENDED=	# empty
    113  1.13  rillig APPENDED+=	value
    114  1.13  rillig .if ${APPENDED} != " value"
    115  1.13  rillig .error "${APPENDED}"
    116  1.13  rillig .endif
    117  1.13  rillig 
    118  1.13  rillig # Appending to parameterized variables works as well.
    119  1.13  rillig PARAM=		param
    120  1.13  rillig VAR.${PARAM}=	1
    121  1.13  rillig VAR.${PARAM}+=	2
    122  1.13  rillig .if ${VAR.param} != "1 2"
    123  1.13  rillig .error "${VAR.param}"
    124  1.13  rillig .endif
    125  1.13  rillig 
    126  1.13  rillig # The variable name can contain arbitrary characters.
    127  1.13  rillig # If the expanded variable name ends in a +, this still does not influence
    128  1.13  rillig # the parser. The assignment operator is still a simple assignment.
    129  1.13  rillig # Therefore, there is no need to add a space between the variable name
    130  1.13  rillig # and the assignment operator.
    131  1.13  rillig PARAM=		+
    132  1.13  rillig VAR.${PARAM}=	1
    133  1.13  rillig VAR.${PARAM}+=	2
    134  1.13  rillig .if ${VAR.+} != "1 2"
    135  1.13  rillig .error "${VAR.+}"
    136  1.13  rillig .endif
    137  1.13  rillig .for param in + ! ?
    138  1.13  rillig VAR.${param}=	${param}
    139  1.13  rillig .endfor
    140  1.13  rillig .if ${VAR.+} != "+" || ${VAR.!} != "!" || ${VAR.?} != "?"
    141  1.13  rillig .error "${VAR.+}" "${VAR.!}" "${VAR.?}"
    142  1.13  rillig .endif
    143  1.14  rillig 
    144  1.14  rillig # Appending to a variable from the environment creates a copy of that variable
    145  1.14  rillig # in the global context.
    146  1.14  rillig # The appended value is not exported automatically.
    147  1.14  rillig # When a variable is exported, the exported value is taken at the time of the
    148  1.14  rillig # .export directive. Later changes to the variable have no effect.
    149  1.14  rillig .export FROM_ENV_BEFORE
    150  1.14  rillig FROM_ENV+=		mk
    151  1.14  rillig FROM_ENV_BEFORE+=	mk
    152  1.14  rillig FROM_ENV_AFTER+=	mk
    153  1.14  rillig .export FROM_ENV_AFTER
    154  1.14  rillig 
    155  1.14  rillig export-appended:
    156  1.14  rillig 	@echo $@: "$$FROM_ENV"
    157  1.14  rillig 	@echo $@: "$$FROM_ENV_BEFORE"
    158  1.14  rillig 	@echo $@: "$$FROM_ENV_AFTER"
    159