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 | $extraENV{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 command scripts. Stop.',
|
---|
167 | 512);
|
---|
168 |
|
---|
169 | 1;
|
---|