Home | History | Annotate | Line # | Download | only in unit-tests
opt-debug-lint.mk revision 1.20
      1 # $NetBSD: opt-debug-lint.mk,v 1.20 2024/08/29 20:20:36 rillig Exp $
      2 #
      3 # Tests for the -dL command line option, which runs additional checks
      4 # to catch common mistakes, such as unclosed expressions.
      5 
      6 .MAKEFLAGS: -dL
      7 
      8 # Since 2020-09-13, undefined variables that are used on the left-hand side
      9 # of a condition at parse time get a proper error message.  Before, the
     10 # error message was "Malformed conditional" only, which was wrong and
     11 # misleading.  The form of the condition is totally fine, it's the evaluation
     12 # that fails.
     13 #
     14 # Since 2020-09-13, the "Malformed conditional" error message is not printed
     15 # anymore.
     16 #
     17 # See also:
     18 #	cond-undef-lint.mk
     19 # expect+2: Malformed conditional '$X'
     20 # expect+1: Variable "X" is undefined
     21 .if $X
     22 .  error
     23 .endif
     24 
     25 # The dynamic variables like .TARGET are treated specially.  It does not make
     26 # sense to expand them in the global scope since they will never be defined
     27 # there under normal circumstances.  Therefore they expand to a string that
     28 # will later be expanded correctly, when the variable is evaluated again in
     29 # the scope of an actual target.
     30 #
     31 # Even though the "@" variable is not defined at this point, this is not an
     32 # error.  In all practical cases, this is no problem.  This particular test
     33 # case is made up and unrealistic.
     34 .if $@ != "\$(.TARGET)"
     35 .  error
     36 .endif
     37 
     38 # Since 2020-09-13, Var_Parse properly reports errors for undefined variables,
     39 # but only in lint mode.  Before, it had only silently returned var_Error,
     40 # hoping for the caller to print an error message.  This resulted in the
     41 # well-known "Malformed conditional" error message, even though the
     42 # conditional was well-formed and the only error was an undefined variable.
     43 # expect+2: Malformed conditional '${UNDEF}'
     44 # expect+1: Variable "UNDEF" is undefined
     45 .if ${UNDEF}
     46 .  error
     47 .endif
     48 
     49 # Since 2020-09-14, dependency lines may contain undefined variables.
     50 # Before, undefined variables were forbidden, but this distinction was not
     51 # observable from the outside of the function Var_Parse.
     52 ${UNDEF}: ${UNDEF}
     53 
     54 # In a condition that has a defined(UNDEF) guard, all guarded conditions
     55 # may assume that the variable is defined since they will only be evaluated
     56 # if the variable is indeed defined.  Otherwise they are only parsed, and
     57 # for parsing it doesn't make a difference whether the variable is defined
     58 # or not.
     59 .if defined(UNDEF) && exists(${UNDEF})
     60 .  error
     61 .endif
     62 
     63 # Since 2020-10-03, in lint mode the variable modifier must be separated
     64 # by colons.  See varparse-mod.mk.
     65 # expect+2: Missing delimiter ':' after modifier "L"
     66 # expect+1: Missing delimiter ':' after modifier "P"
     67 .if ${value:LPL} != "value"
     68 .  error
     69 .endif
     70 
     71 # Between 2020-10-03 and var.c 1.752 from 2020-12-20, in lint mode the
     72 # variable modifier had to be separated by colons.  This was wrong though
     73 # since make always fell back trying to parse the indirect modifier as a
     74 # SysV modifier.
     75 # expect+1: Unknown modifier "${"
     76 .if ${value:${:UL}PL} != "LPL}"		# FIXME: "LPL}" is unexpected here.
     77 .  error ${value:${:UL}PL}
     78 .endif
     79 
     80 # Typically, an indirect modifier is followed by a colon or the closing
     81 # brace.  This one isn't, therefore make falls back to parsing it as the SysV
     82 # modifier ":lue=lid".
     83 .if ${value:L:${:Ulue}=${:Ulid}} != "valid"
     84 .  error
     85 .endif
     86 
     87 # In lint mode, the whole variable text is evaluated to check for unclosed
     88 # expressions and unknown operators.  During this check, the subexpression
     89 # '${:U2}' is not expanded, instead it is copied verbatim into the regular
     90 # expression, leading to '.*=.{1,${:U2}}$'.
     91 #
     92 # Before var.c 1.856 from 2021-03-14, this regular expression was then
     93 # compiled even though that was not necessary for checking the syntax at the
     94 # level of expressions.  The unexpanded '$' then resulted in a wrong
     95 # error message.
     96 #
     97 # This only happened in lint mode since in default mode the early check for
     98 # unclosed expressions and unknown modifiers is skipped.
     99 #
    100 # See VarCheckSyntax, ApplyModifier_Regex.
    101 #
    102 VARMOD_REGEX=	${:UA=111 B=222 C=33:C/.*=.{1,${:U2}}$//g}
    103