]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bmake/unit-tests/dep-var.mk
bhyvectl(8): Normalize the man page date
[FreeBSD/FreeBSD.git] / contrib / bmake / unit-tests / dep-var.mk
1 # $NetBSD: dep-var.mk,v 1.5 2020/09/13 20:04:26 rillig Exp $
2 #
3 # Tests for variable references in dependency declarations.
4 #
5 # Uh oh, this feels so strange that probably nobody uses it. But it seems to
6 # be the only way to reach the lower half of SuffExpandChildren.
7
8 # XXX: The -dv log says:
9 #       Var_Parse: ${UNDEF1} with VARE_UNDEFERR|VARE_WANTRES
10 # but no error message is generated for this line.
11 # The variable expression ${UNDEF1} simply expands to an empty string.
12 all: ${UNDEF1}
13
14 # Using a double dollar in order to circumvent immediate variable expansion
15 # feels like unintended behavior.  At least the manual page says nothing at
16 # all about defined or undefined variables in dependency lines.
17 #
18 # At the point where the expression ${DEF2} is expanded, the variable DEF2
19 # is defined, so everything's fine.
20 all: $${DEF2} a-$${DEF2}-b
21
22 # This variable is not defined at all.
23 # XXX: The -dv log says:
24 #       Var_Parse: ${UNDEF3} with VARE_UNDEFERR|VARE_WANTRES
25 # but no error message is generated for this line, just like for UNDEF1.
26 # The variable expression ${UNDEF3} simply expands to an empty string.
27 all: $${UNDEF3}
28
29 # Try out how many levels of indirection are really expanded in dependency
30 # lines.
31 #
32 # The first level of indirection is the $$ in the dependency line.
33 # When the dependency line is parsed, it is resolved to the string
34 # "${INDIRECT_1}".  At this point, the dollar is just an ordinary character,
35 # waiting to be expanded at some later point.
36 #
37 # Later, in SuffExpandChildren, that expression is expanded again by calling
38 # Var_Parse, and this time, the result is the string "1-2-${INDIRECT_2}-2-1".
39 #
40 # This string is not expanded anymore by Var_Parse.  But there is another
41 # effect.  Now DirExpandCurly comes into play and expands the curly braces
42 # in this filename pattern, resulting in the string "1-2-$INDIRECT_2-2-1".
43 # As of 2020-09-03, the test dir.mk contains further details on this topic.
44 #
45 # Finally, this string is assigned to the local ${.TARGET} variable.  This
46 # variable is expanded when the shell command is generated.  At that point,
47 # the $I is expanded.  Since the variable I is not defined, it expands to
48 # the empty string.  This way, the final output is the string
49 # "1-2-NDIRECT_2-2-1", which differs from the actual name of the target.
50 # For exactly this reason, it is not recommended to use dollar signs in
51 # target names.
52 #
53 # The number of actual expansions is way more than one might expect,
54 # therefore this feature is probably not widely used.
55 #
56 all: 1-$${INDIRECT_1}-1
57 INDIRECT_1=     2-$${INDIRECT_2}-2
58 INDIRECT_2=     3-$${INDIRECT_3}-3
59 INDIRECT_3=     indirect
60
61 UNDEF1= undef1
62 DEF2=   def2
63
64 # Cover the code in SuffExpandChildren that deals with malformed variable
65 # expressions.
66 #
67 # This seems to be an edge case that never happens in practice, and it would
68 # probably be appropriate to just error out in such a case.
69 #
70 # To trigger this piece of code, the variable name must contain "$)" or "$:"
71 # or "$)" or "$$".  Using "$:" does not work since the dependency line is
72 # fully expanded before parsing, therefore any ':' in a target or source name
73 # would be interpreted as a dependency operator instead.
74 all: $$$$)
75
76 # The $$INDIRECT in the following line is treated like the dependency of the
77 # "all" target, that is, the "$$I" is first expanded to "$I", and in a second
78 # round of expansion, the "$I" expands to nothing since the variable "I" is
79 # undefined.
80 #
81 # Since 2020-09-13, this generates a parse error in lint mode (-dL), but not
82 # in normal mode since ParseDoDependency does not handle any errors after
83 # calling Var_Parse.
84 undef1 def2 a-def2-b 1-2-$$INDIRECT_2-2-1 ${:U\$)}:
85         @echo ${.TARGET:Q}
86
87 # XXX: Why is the exit status still 0, even though Parse_Error is called
88 # with PARSE_FATAL in SuffExpandChildren?