Home | History | Annotate | Line # | Download | only in unit-tests
      1 # $NetBSD: varname-dot-suffixes.mk,v 1.5 2023/12/20 09:03:09 rillig Exp $
      2 #
      3 # Tests for the special "variable" .SUFFIXES, which lists the suffixes that
      4 # have been registered for use in suffix transformation rules.  Suffixes are
      5 # listed even if there is no actual transformation rule that uses them.
      6 #
      7 # The name '.SUFFIXES' does not refer to a real variable, instead it can be
      8 # used as a starting "variable name" for expressions like ${.SUFFIXES} or
      9 # ${.SUFFIXES:M*o}.
     10 
     11 # In the beginning, there are no suffix rules, the expression is thus empty.
     12 .if ${.SUFFIXES} != ""
     13 .endif
     14 
     15 # There is no actual variable named '.SUFFIXES', it is all made up.
     16 .if defined(.SUFFIXES)
     17 .  error
     18 .endif
     19 
     20 # The suffixes list is still empty, and so is the "variable" '.SUFFIXES'.
     21 .if !empty(.SUFFIXES)
     22 .  error
     23 .endif
     24 
     25 .SUFFIXES: .c .o .1		.err
     26 
     27 # The suffixes are listed in declaration order.
     28 .if ${.SUFFIXES} != ".c .o .1 .err"
     29 .  error
     30 .endif
     31 
     32 # There is still no actual variable named '.SUFFIXES', it is all made up.
     33 .if defined(.SUFFIXES)
     34 .  error
     35 .endif
     36 
     37 # Now the suffixes list is not empty anymore.  It may seem strange that there
     38 # is no variable named '.SUFFIXES' but evaluating '${.SUFFIXES}' nevertheless
     39 # returns something.  For all practical use cases, it's good enough though.
     40 .if empty(.SUFFIXES)
     41 .  error
     42 .endif
     43 
     44 .SUFFIXES: .tar.gz
     45 
     46 # Changes to the suffixes list are reflected immediately.
     47 .if ${.SUFFIXES} != ".c .o .1 .err .tar.gz"
     48 .  error
     49 .endif
     50 
     51 # Deleting .SUFFIXES has no effect since there is no actual variable of that
     52 # name.
     53 .MAKEFLAGS: -dv
     54 # expect: Global: ignoring delete '.SUFFIXES' as it is not found
     55 .undef .SUFFIXES
     56 .MAKEFLAGS: -d0
     57 .if ${.SUFFIXES} != ".c .o .1 .err .tar.gz"
     58 .  error
     59 .endif
     60 
     61 # The list of suffixes can only be modified using dependency declarations, any
     62 # attempt at setting the variable named '.SUFFIXES' is rejected.
     63 .MAKEFLAGS: -dv
     64 # expect: Global: ignoring '.SUFFIXES = set' as it is read-only
     65 .SUFFIXES=	set
     66 # expect: Global: ignoring '.SUFFIXES = append' as it is read-only
     67 .SUFFIXES+=	append
     68 # expect: Global: ignoring '.SUFFIXES = assign' as it is read-only
     69 _:=		${.SUFFIXES::=assign}
     70 # expect: Global: ignoring '.SUFFIXES = preserve' as it is read-only
     71 _:=		${preserve:L:_=.SUFFIXES}
     72 .MAKEFLAGS: -d0
     73 
     74 # Using the name '.SUFFIXES' in a .for loop looks strange because these
     75 # variable names are typically in singular form, and .for loops do not use
     76 # real variables either, they are made up as well, see directive-for.mk.  The
     77 # replacement mechanism for the iteration variables takes precedence.
     78 .for .SUFFIXES in .c .o
     79 .  if ${.SUFFIXES} != ".c" && ${.SUFFIXES} != ".o"
     80 .    error
     81 .  endif
     82 .endfor
     83 
     84 # After the .for loop, the expression '${.SUFFIXES}' refers to the list of
     85 # suffixes again.
     86 .if ${.SUFFIXES} != ".c .o .1 .err .tar.gz"
     87 .  error
     88 .endif
     89 
     90 # Using the name '.SUFFIXES' in the modifier ':@var@body@' does not create an
     91 # actual variable either.  Like in the .for loop, choosing the name
     92 # '.SUFFIXES' for the iteration variable is unusual.  In ODE Make, the
     93 # convention for these iteration variables is to have dots at both ends, so
     94 # the name would be '.SUFFIXES.', furthermore the name of the iteration
     95 # variable is typically in singular form.
     96 .MAKEFLAGS: -dv
     97 # expect: Command: ignoring '.SUFFIXES = 1' as it is read-only
     98 # expect: Command: ignoring '.SUFFIXES = 2' as it is read-only
     99 # expect: Command: ignoring delete '.SUFFIXES' as it is not found
    100 .if ${1 2:L:@.SUFFIXES@${.SUFFIXES}@} != ".c .o .1 .err .tar.gz .c .o .1 .err .tar.gz"
    101 .  error
    102 .endif
    103 .MAKEFLAGS: -d0
    104 
    105 all:
    106