summaryrefslogtreecommitdiff
path: root/tests/scripts/functions/eval
blob: 90513bdd29277ce51a5650bd27d1f4e96611bd63 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#                                                                    -*-perl-*-

$description = "Test the eval function.";

$details = "This is a test of the eval function in GNU make.
This function will evaluate inline makefile syntax and incorporate the
results into its internal database.\n";

open(MAKEFILE,"> $makefile");

print MAKEFILE <<'EOF';
define Y
  all:: ; @echo $AA
  A = B
endef

X = $(eval $(value Y))

$(eval $(shell echo A = A))
$(eval $(Y))
$(eval A = C)
$(eval $(X))
EOF

close(MAKEFILE);

&run_make_with_options($makefile, "", &get_logfile);

# Create the answer to what should be produced by this Makefile
$answer = "AA\nBA\n";

&compare_output($answer,&get_logfile(1));

# Test to make sure defining variables when we have extra scope pushed works
# as expected.

$makefile2 = &get_tmpfile;

open(MAKEFILE,"> $makefile2");

print MAKEFILE <<'EOF';
VARS = A B

VARSET = $(1) = $(2)

$(foreach v,$(VARS),$(eval $(call VARSET,$v,$v)))

all: ; @echo A = $(A) B = $(B)
EOF

close(MAKEFILE);

&run_make_with_options($makefile2, "", &get_logfile);

# Create the answer to what should be produced by this Makefile
$answer = "A = A B = B\n";

&compare_output($answer,&get_logfile(1));

# Test to make sure eval'ing inside conditionals works properly

$makefile3 = &get_tmpfile;

open(MAKEFILE,"> $makefile3");

print MAKEFILE <<'EOF';
FOO = foo

all:: ; @echo it

define Y
  all:: ; @echo worked
endef

ifdef BAR
$(eval $(Y))
endif

EOF

close(MAKEFILE);

&run_make_with_options($makefile3, "", &get_logfile);
$answer = "it\n";
&compare_output($answer,&get_logfile(1));

&run_make_with_options($makefile3, "BAR=1", &get_logfile);
$answer = "it\nworked\n";
&compare_output($answer,&get_logfile(1));


# TEST very recursive invocation of eval

$makefile3 = &get_tmpfile;

open(MAKEFILE,"> $makefile3");

print MAKEFILE <<'EOF';
..9 := 0 1 2 3 4 5 6 7 8 9
rev=$(eval res:=)$(foreach word,$1,$(eval res:=${word} ${res}))${res}
a:=$(call rev,${..9})
all: ; @echo '[$(a)]'

EOF

close(MAKEFILE);

&run_make_with_options($makefile3, "", &get_logfile);
$answer = "[         9 8 7 6 5 4 3 2 1 0 ]\n";
&compare_output($answer,&get_logfile(1));


# TEST eval with no filename context.
# The trick here is that because EVAR is taken from the environment, it must
# be evaluated before every command is invoked.  Make sure that works, when
# we have no file context for reading_file (bug # 6195)

$makefile4 = &get_tmpfile;

open(MAKEFILE,"> $makefile4");

print MAKEFILE <<'EOF';
EVAR = $(eval FOBAR = 1)
all: ; @echo "OK"

EOF

close(MAKEFILE);

$extraENV{EVAR} = '1';
&run_make_with_options($makefile4, "", &get_logfile);
$answer = "OK\n";
&compare_output($answer,&get_logfile(1));


# Clean out previous information to allow new run_make_test() interface.
# If we ever convert all the above to run_make_test() we can remove this line.
$makefile = undef;

# Test handling of backslashes in strings to be evaled.

run_make_test('
define FOO
all: ; @echo hello \
world
endef
$(eval $(FOO))
', '', 'hello world');

run_make_test('
define FOO
all: ; @echo '."'".'he\llo'."'".'
	@echo world
endef
$(eval $(FOO))
', '', 'he\llo
world');


# We don't allow new target/prerequisite relationships to be defined within a
# command script, because these are evaluated after snap_deps() and that
# causes lots of problems (like core dumps!)
# See Savannah bug # 12124.

run_make_test('deps: ; $(eval deps: foo)', '',
              '#MAKEFILE#:1: *** prerequisites cannot be defined in recipes.  Stop.',
              512);

1;