1#                                                                    -*-perl-*-
2
3$description = "Test various flavors of make variable setting.";
4
5$details = "";
6
7open(MAKEFILE, "> $makefile");
8
9# The Contents of the MAKEFILE ...
10
11print MAKEFILE <<'EOF';
12foo = $(bar)
13bar = ${ugh}
14ugh = Hello
15
16all: multi ; @echo $(foo)
17
18multi: ; $(multi)
19
20x := foo
21y := $(x) bar
22x := later
23
24nullstring :=
25space := $(nullstring) $(nullstring)
26
27next: ; @echo $x$(space)$y
28
29define multi
30@echo hi
31echo there
32endef
33
34ifdef BOGUS
35define
36@echo error
37endef
38endif
39
40define outer
41 define inner
42  A = B
43 endef
44endef
45
46$(eval $(outer))
47
48outer: ; @echo $(inner)
49
50EOF
51
52# END of Contents of MAKEFILE
53
54close(MAKEFILE);
55
56# TEST #1
57# -------
58
59&run_make_with_options($makefile, "", &get_logfile);
60$answer = "hi\necho there\nthere\nHello\n";
61&compare_output($answer, &get_logfile(1));
62
63# TEST #2
64# -------
65
66&run_make_with_options($makefile, "next", &get_logfile);
67$answer = "later foo bar\n";
68&compare_output($answer, &get_logfile(1));
69
70# TEST #3
71# -------
72
73&run_make_with_options($makefile, "BOGUS=true", &get_logfile, 512);
74$answer = "$makefile:24: *** empty variable name.  Stop.\n";
75&compare_output($answer, &get_logfile(1));
76
77# TEST #4
78# -------
79
80&run_make_with_options($makefile, "outer", &get_logfile);
81$answer = "A = B\n";
82&compare_output($answer, &get_logfile(1));
83
84# Clean up from "old style" testing.  If all the above tests are converted to
85# run_make_test() syntax than this line can be removed.
86$makefile = undef;
87
88# -------------------------
89# Make sure that prefix characters apply properly to define/endef values.
90#
91# There's a bit of oddness here if you try to use a variable to hold the
92# prefix character for a define.  Even though something like this:
93#
94#       define foo
95#       echo bar
96#       endef
97#
98#       all: ; $(V)$(foo)
99#
100# (where V=@) can be seen by the user to be obviously different than this:
101#
102#       define foo
103#       $(V)echo bar
104#       endef
105#
106#       all: ; $(foo)
107#
108# and the user thinks it should behave the same as when the "@" is literal
109# instead of in a variable, that can't happen because by the time make
110# expands the variables for the command line and sees it begins with a "@" it
111# can't know anymore whether the prefix character came before the variable
112# reference or was included in the first line of the variable reference.
113
114# TEST #5
115# -------
116
117run_make_test('
118define FOO
119$(V1)echo hello
120$(V2)echo world
121endef
122all: ; @$(FOO)
123', '', 'hello
124world');
125
126# TEST #6
127# -------
128
129run_make_test(undef, 'V1=@ V2=@', 'hello
130world');
131
132# TEST #7
133# -------
134
135run_make_test('
136define FOO
137$(V1)echo hello
138$(V2)echo world
139endef
140all: ; $(FOO)
141', 'V1=@', 'hello
142echo world
143world');
144
145# TEST #8
146# -------
147
148run_make_test(undef, 'V2=@', 'echo hello
149hello
150world');
151
152# TEST #9
153# -------
154
155run_make_test(undef, 'V1=@ V2=@', 'hello
156world');
157
158# TEST #10
159# -------
160# Test the basics; a "@" internally to the variable applies to only one line.
161# A "@" before the variable applies to the entire variable.
162
163run_make_test('
164define FOO
165@echo hello
166echo world
167endef
168define BAR
169echo hello
170echo world
171endef
172
173all: foo bar
174foo: ; $(FOO)
175bar: ; @$(BAR)
176', '', 'hello
177echo world
178world
179hello
180world
181');
182
1831;
184