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 105all: 106