Imported Upstream version 4.4
[platform/upstream/make.git] / tests / scripts / functions / eval
1 #                                                                    -*-perl-*-
2
3 $description = "Test the eval function.";
4
5 $details = "This is a test of the eval function in GNU make.
6 This function will evaluate inline makefile syntax and incorporate the
7 results into its internal database.\n";
8
9 open(MAKEFILE,"> $makefile");
10
11 print MAKEFILE <<'EOF';
12 define Y
13   all:: ; @echo $AA
14   A = B
15 endef
16
17 X = $(eval $(value Y))
18
19 $(eval $(shell echo A = A))
20 $(eval $(Y))
21 $(eval A = C)
22 $(eval $(X))
23 EOF
24
25 close(MAKEFILE);
26
27 &run_make_with_options($makefile, "", &get_logfile);
28
29 # Create the answer to what should be produced by this Makefile
30 $answer = "AA\nBA\n";
31
32 &compare_output($answer,&get_logfile(1));
33
34 # Test to make sure defining variables when we have extra scope pushed works
35 # as expected.
36
37 $makefile2 = &get_tmpfile;
38
39 open(MAKEFILE,"> $makefile2");
40
41 print MAKEFILE <<'EOF';
42 VARS = A B
43
44 VARSET = $(1) = $(2)
45
46 $(foreach v,$(VARS),$(eval $(call VARSET,$v,$v)))
47
48 all: ; @echo A = $(A) B = $(B)
49 EOF
50
51 close(MAKEFILE);
52
53 &run_make_with_options($makefile2, "", &get_logfile);
54
55 # Create the answer to what should be produced by this Makefile
56 $answer = "A = A B = B\n";
57
58 &compare_output($answer,&get_logfile(1));
59
60 # Test to make sure eval'ing inside conditionals works properly
61
62 $makefile3 = &get_tmpfile;
63
64 open(MAKEFILE,"> $makefile3");
65
66 print MAKEFILE <<'EOF';
67 FOO = foo
68
69 all:: ; @echo it
70
71 define Y
72   all:: ; @echo worked
73 endef
74
75 ifdef BAR
76 $(eval $(Y))
77 endif
78
79 EOF
80
81 close(MAKEFILE);
82
83 &run_make_with_options($makefile3, "", &get_logfile);
84 $answer = "it\n";
85 &compare_output($answer,&get_logfile(1));
86
87 &run_make_with_options($makefile3, "BAR=1", &get_logfile);
88 $answer = "it\nworked\n";
89 &compare_output($answer,&get_logfile(1));
90
91
92 # TEST very recursive invocation of eval
93
94 $makefile3 = &get_tmpfile;
95
96 open(MAKEFILE,"> $makefile3");
97
98 print MAKEFILE <<'EOF';
99 ..9 := 0 1 2 3 4 5 6 7 8 9
100 rev=$(eval res:=)$(foreach word,$1,$(eval res:=${word} ${res}))${res}
101 a:=$(call rev,${..9})
102 all: ; @echo '[$(a)]'
103
104 EOF
105
106 close(MAKEFILE);
107
108 &run_make_with_options($makefile3, "", &get_logfile);
109 $answer = "[         9 8 7 6 5 4 3 2 1 0 ]\n";
110 &compare_output($answer,&get_logfile(1));
111
112
113 # TEST eval with no filename context.
114 # The trick here is that because EVAR is taken from the environment, it must
115 # be evaluated before every command is invoked.  Make sure that works, when
116 # we have no file context for reading_file (bug # 6195)
117
118 $makefile4 = &get_tmpfile;
119
120 open(MAKEFILE,"> $makefile4");
121
122 print MAKEFILE <<'EOF';
123 EVAR = $(eval FOBAR = 1)
124 all: ; @echo "OK"
125
126 EOF
127
128 close(MAKEFILE);
129
130 $ENV{EVAR} = '1';
131 &run_make_with_options($makefile4, "", &get_logfile);
132 $answer = "OK\n";
133 &compare_output($answer,&get_logfile(1));
134
135
136 # Clean out previous information to allow new run_make_test() interface.
137 # If we ever convert all the above to run_make_test() we can remove this line.
138 $makefile = undef;
139
140 # Test handling of backslashes in strings to be evaled.
141
142 run_make_test('
143 define FOO
144 all: ; @echo hello \
145 world
146 endef
147 $(eval $(FOO))
148 ', '', 'hello world');
149
150 run_make_test('
151 define FOO
152 all: ; @echo '."'".'he\llo'."'".'
153         @echo world
154 endef
155 $(eval $(FOO))
156 ', '', 'he\llo
157 world');
158
159
160 # We don't allow new target/prerequisite relationships to be defined within a
161 # command script, because these are evaluated after snap_deps() and that
162 # causes lots of problems (like core dumps!)
163 # See Savannah bug # 12124.
164
165 run_make_test('deps: ; $(eval deps: foo)', '',
166               '#MAKEFILE#:1: *** prerequisites cannot be defined in recipes.  Stop.',
167               512);
168
169 1;