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