Home | History | Annotate | Line # | Download | only in unit-tests
varmod.mk revision 1.8
      1  1.8  rillig # $NetBSD: varmod.mk,v 1.8 2023/06/01 20:56:35 rillig Exp $
      2  1.1  rillig #
      3  1.2  rillig # Tests for variable modifiers, such as :Q, :S,from,to or :Ufallback.
      4  1.7  rillig #
      5  1.7  rillig # See also:
      6  1.7  rillig #	varparse-errors.mk
      7  1.1  rillig 
      8  1.6  rillig # As of 2022-08-06, the possible behaviors during parsing are:
      9  1.6  rillig #
     10  1.6  rillig # * `strict`: the parsing style used by most modifiers:
     11  1.6  rillig #   * either uses `ParseModifierPart` or parses the modifier literal
     12  1.6  rillig #   * other modifiers may follow, separated by a ':'
     13  1.6  rillig #
     14  1.6  rillig # * `greedy`: calls `ParseModifierPart` with `ch->endc`; this means
     15  1.6  rillig #   that no further modifiers are parsed in that expression.
     16  1.6  rillig #
     17  1.6  rillig # * `no-colon`: after parsing this modifier, the following modifier
     18  1.6  rillig #   does not need to be separated by a colon.
     19  1.6  rillig #   Omitting this colon is bad style.
     20  1.6  rillig #
     21  1.6  rillig # * `individual`: parsing this modifier does not follow the common
     22  1.6  rillig #   pattern of calling `ParseModifierPart`.
     23  1.6  rillig #
     24  1.6  rillig # The SysV column says whether a parse error in the modifier falls back
     25  1.6  rillig # trying the `:from=to` System V modifier.
     26  1.6  rillig #
     27  1.6  rillig # | **Operator** | **Behavior** | **Remarks**        | **SysV** |
     28  1.6  rillig # |--------------|--------------|--------------------|----------|
     29  1.6  rillig # | `!`          | no-colon     |                    | no       |
     30  1.6  rillig # | `:=`         | greedy       |                    | yes      |
     31  1.6  rillig # | `?:`         | greedy       |                    | no       |
     32  1.6  rillig # | `@`          | no-colon     |                    | no       |
     33  1.6  rillig # | `C`          | no-colon     |                    | no       |
     34  1.6  rillig # | `D`          | individual   | custom parser      | N/A      |
     35  1.6  rillig # | `E`          | strict       |                    | yes      |
     36  1.6  rillig # | `H`          | strict       |                    | yes      |
     37  1.6  rillig # | `L`          | no-colon     |                    | N/A      |
     38  1.6  rillig # | `M`          | individual   | custom parser      | N/A      |
     39  1.6  rillig # | `N`          | individual   | custom parser      | N/A      |
     40  1.6  rillig # | `O`          | strict       | only literal value | no       |
     41  1.6  rillig # | `P`          | no-colon     |                    | N/A      |
     42  1.6  rillig # | `Q`          | strict       |                    | yes      |
     43  1.6  rillig # | `R`          | strict       |                    | yes      |
     44  1.6  rillig # | `S`          | no-colon     |                    | N/A      |
     45  1.6  rillig # | `T`          | strict       |                    | N/A      |
     46  1.6  rillig # | `U`          | individual   | custom parser      | N/A      |
     47  1.6  rillig # | `[`          | strict       |                    | no       |
     48  1.6  rillig # | `_`          | individual   | strcspn            | yes      |
     49  1.6  rillig # | `gmtime`     | strict       | only literal value | yes      |
     50  1.6  rillig # | `hash`       | strict       |                    | N/A      |
     51  1.6  rillig # | `localtime`  | strict       | only literal value | yes      |
     52  1.6  rillig # | `q`          | strict       |                    | yes      |
     53  1.6  rillig # | `range`      | strict       |                    | N/A      |
     54  1.6  rillig # | `sh`         | strict       |                    | N/A      |
     55  1.6  rillig # | `t`          | strict       |                    | no       |
     56  1.6  rillig # | `u`          | strict       |                    | yes      |
     57  1.6  rillig # | `from=to`    | greedy       | SysV, fallback     | N/A      |
     58  1.6  rillig 
     59  1.3  rillig DOLLAR1=	$$
     60  1.3  rillig DOLLAR2=	${:U\$}
     61  1.1  rillig 
     62  1.3  rillig # To get a single '$' sign in the value of a variable expression, it has to
     63  1.3  rillig # be written as '$$' in a literal variable value.
     64  1.3  rillig #
     65  1.3  rillig # See Var_Parse, where it calls Var_Subst.
     66  1.3  rillig .if ${DOLLAR1} != "\$"
     67  1.3  rillig .  error
     68  1.3  rillig .endif
     69  1.3  rillig 
     70  1.3  rillig # Another way to get a single '$' sign is to use the :U modifier.  In the
     71  1.3  rillig # argument of that modifier, a '$' is escaped using the backslash instead.
     72  1.3  rillig #
     73  1.3  rillig # See Var_Parse, where it calls Var_Subst.
     74  1.3  rillig .if ${DOLLAR2} != "\$"
     75  1.3  rillig .  error
     76  1.3  rillig .endif
     77  1.3  rillig 
     78  1.3  rillig # It is also possible to use the :U modifier directly in the expression.
     79  1.3  rillig #
     80  1.3  rillig # See Var_Parse, where it calls Var_Subst.
     81  1.3  rillig .if ${:U\$} != "\$"
     82  1.3  rillig .  error
     83  1.3  rillig .endif
     84  1.3  rillig 
     85  1.3  rillig # XXX: As of 2020-09-13, it is not possible to use '$$' in a variable name
     86  1.3  rillig # to mean a single '$'.  This contradicts the manual page, which says that
     87  1.3  rillig # '$' can be escaped as '$$'.
     88  1.3  rillig .if ${$$:L} != ""
     89  1.3  rillig .  error
     90  1.3  rillig .endif
     91  1.3  rillig 
     92  1.3  rillig # In lint mode, make prints helpful error messages.
     93  1.3  rillig # For compatibility, make does not print these error messages in normal mode.
     94  1.3  rillig # Should it?
     95  1.3  rillig .MAKEFLAGS: -dL
     96  1.8  rillig # expect+2: To escape a dollar, use \$, not $$, at "$$:L} != """
     97  1.8  rillig # expect+1: Invalid variable name ':', at "$:L} != """
     98  1.3  rillig .if ${$$:L} != ""
     99  1.3  rillig .  error
    100  1.3  rillig .endif
    101  1.3  rillig 
    102  1.3  rillig # A '$' followed by nothing is an error as well.
    103  1.8  rillig # expect+1: Dollar followed by nothing
    104  1.3  rillig .if ${:Uword:@word@${word}$@} != "word"
    105  1.3  rillig .  error
    106  1.3  rillig .endif
    107  1.3  rillig 
    108  1.4  rillig # The variable modifier :P does not fall back to the SysV modifier.
    109  1.4  rillig # Therefore the modifier :P=RE generates a parse error.
    110  1.4  rillig # XXX: The .error should not be reached since the variable expression is
    111  1.5  rillig # malformed, and this error should be propagated up to Cond_EvalLine.
    112  1.4  rillig VAR=	STOP
    113  1.8  rillig # expect+1: Missing delimiter ':' after modifier "P"
    114  1.4  rillig .if ${VAR:P=RE} != "STORE"
    115  1.8  rillig # expect+1: Missing argument for ".error"
    116  1.4  rillig .  error
    117  1.4  rillig .endif
    118  1.4  rillig 
    119  1.3  rillig all: # nothing
    120