Home | History | Annotate | Line # | Download | only in unit-tests
cond-func.mk revision 1.14
      1 # $NetBSD: cond-func.mk,v 1.14 2023/11/19 21:47:52 rillig Exp $
      2 #
      3 # Tests for those parts of the functions in .if conditions that are common
      4 # among several functions.
      5 #
      6 # The below test uses the 'defined' function since it has no side-effects.
      7 # The other functions would work equally well, except for 'empty', which
      8 # parses its argument differently from the other functions.
      9 #
     10 
     11 DEF=			defined
     12 ${:UA B}=		variable name with spaces
     13 ${:UVAR(value)}=	variable name with parentheses
     14 ${:UVAR{value}}=	variable name with balanced braces
     15 
     16 # Really strange variable names must be given indirectly via another variable,
     17 # so that no unbalanced braces appear in the top-level expression.
     18 VARNAME_UNBALANCED_BRACES=	VAR{{{value
     19 ${VARNAME_UNBALANCED_BRACES}=	variable name with unbalanced braces
     20 
     21 .if !defined(DEF)
     22 .  error
     23 .endif
     24 
     25 # Horizontal whitespace (space tab) after the opening parenthesis is ignored.
     26 .if !defined( 	DEF)
     27 .  error
     28 .endif
     29 
     30 # Horizontal whitespace (space tab) before the closing parenthesis is ignored.
     31 .if !defined(DEF 	)
     32 .  error
     33 .endif
     34 
     35 # The argument of a function must not directly contain whitespace.
     36 # expect+1: Missing closing parenthesis for defined()
     37 .if !defined(A B)
     38 .  error
     39 .endif
     40 
     41 # If necessary, the whitespace can be generated by an expression.
     42 .if !defined(${:UA B})
     43 .  error
     44 .endif
     45 
     46 # Characters that could be mistaken for operators must not appear directly
     47 # in a function argument.  As with whitespace, these can be generated
     48 # indirectly.
     49 #
     50 # It's not entirely clear why these characters are forbidden.
     51 # The most plausible reason seems to be typo detection.
     52 # expect+1: Missing closing parenthesis for defined()
     53 .if !defined(A&B)
     54 .  error
     55 .endif
     56 # expect+1: Missing closing parenthesis for defined()
     57 .if !defined(A|B)
     58 .  error
     59 .endif
     60 
     61 # Even parentheses may appear in variable names.
     62 # They must be balanced though.
     63 .if !defined(VAR(value))
     64 .  error
     65 .endif
     66 
     67 # Braces do not have any special meaning when parsing arguments.
     68 .if !defined(VAR{value})
     69 .  error
     70 .endif
     71 
     72 # Braces do not have any special meaning when parsing arguments.
     73 # They don't need to be balanced.
     74 .if !defined(VAR{{{value)
     75 .  error
     76 .endif
     77 
     78 # There may be spaces around the operators and parentheses, and even
     79 # inside the parentheses.  The spaces inside the parentheses are not
     80 # allowed for the 'empty' function (see cond-func-empty.mk), therefore
     81 # they are typically omitted for the other functions as well.
     82 .if ! defined ( DEF )
     83 .  error
     84 .endif
     85 
     86 # The following condition is interpreted as defined(A) && defined(B).
     87 # In lack of a function call expression, each kind of .if directive has a
     88 # default function that is called when a bare word is parsed.  For the plain
     89 # .if directive, this function is defined(); see "struct If ifs" in cond.c.
     90 .if A&B
     91 .  error
     92 .endif
     93 
     94 .if defined()
     95 .  error
     96 .else
     97 # expect+1: The empty variable is never defined.
     98 .  info The empty variable is never defined.
     99 .endif
    100 
    101 # The plain word 'defined' is interpreted as 'defined(defined)', see
    102 # CondParser_ComparisonOrLeaf.
    103 # That variable is not defined (yet).
    104 .if defined
    105 .  error
    106 .else
    107 # expect+1: A plain function name is parsed as defined(...).
    108 .  info A plain function name is parsed as defined(...).
    109 .endif
    110 
    111 # If a variable named 'defined' is actually defined, the bare word 'defined'
    112 # is interpreted as 'defined(defined)', and the condition evaluates to true.
    113 defined=	# defined but empty
    114 .if defined
    115 # expect+1: A plain function name is parsed as defined(...).
    116 .  info A plain function name is parsed as defined(...).
    117 .else
    118 .  error
    119 .endif
    120 
    121 # A plain symbol name may start with one of the function names, in this case
    122 # 'defined'.
    123 .if defined-var
    124 .  error
    125 .else
    126 # expect+1: Symbols may start with a function name.
    127 .  info Symbols may start with a function name.
    128 .endif
    129 
    130 defined-var=	# defined but empty
    131 .if defined-var
    132 # expect+1: Symbols may start with a function name.
    133 .  info Symbols may start with a function name.
    134 .else
    135 .  error
    136 .endif
    137 
    138 # expect+1: Missing closing parenthesis for defined()
    139 .if defined(
    140 .  error
    141 .else
    142 .  error
    143 .endif
    144