Imported Upstream version 4.4
[platform/upstream/make.git] / tests / scripts / variables / automatic
1 #                                                                    -*-perl-*-
2
3 $description = "Test automatic variable setting.";
4
5 $details = "";
6
7 use Cwd;
8
9 $dir = cwd;
10 $dir =~ s,.*/([^/]+)$,../$1,;
11
12 open(MAKEFILE, "> $makefile");
13 print MAKEFILE "dir = $dir\n";
14 print MAKEFILE <<'EOF';
15 .SUFFIXES:
16 .SUFFIXES: .x .y .z
17 $(dir)/foo.x : baz.z $(dir)/bar.y baz.z
18         @echo '$$@ = $@, $$(@D) = $(@D), $$(@F) = $(@F)'
19         @echo '$$* = $*, $$(*D) = $(*D), $$(*F) = $(*F)'
20         @echo '$$< = $<, $$(<D) = $(<D), $$(<F) = $(<F)'
21         @echo '$$^ = $^, $$(^D) = $(^D), $$(^F) = $(^F)'
22         @echo '$$+ = $+, $$(+D) = $(+D), $$(+F) = $(+F)'
23         @echo '$$? = $?, $$(?D) = $(?D), $$(?F) = $(?F)'
24         touch $@
25
26 $(dir)/bar.y baz.z : ; touch $@
27 EOF
28 close(MAKEFILE);
29
30 # TEST #0 -- simple test
31 # -------
32
33 # Touch these into the past
34 &utouch(-10, qw(foo.x baz.z));
35
36 &run_make_with_options($makefile, "", &get_logfile);
37 $answer = "touch $dir/bar.y
38 \$\@ = $dir/foo.x, \$(\@D) = $dir, \$(\@F) = foo.x
39 \$* = $dir/foo, \$(*D) = $dir, \$(*F) = foo
40 \$< = baz.z, \$(<D) = ., \$(<F) = baz.z
41 \$^ = baz.z $dir/bar.y, \$(^D) = . $dir, \$(^F) = baz.z bar.y
42 \$+ = baz.z $dir/bar.y baz.z, \$(+D) = . $dir ., \$(+F) = baz.z bar.y baz.z
43 \$? = $dir/bar.y, \$(?D) = $dir, \$(?F) = bar.y
44 touch $dir/foo.x\n";
45 &compare_output($answer, &get_logfile(1));
46
47 unlink(qw(foo.x bar.y baz.z));
48
49 # TEST #1 -- test the SysV emulation of $$@ etc.
50 # -------
51
52 $makefile2 = &get_tmpfile;
53
54 open(MAKEFILE, "> $makefile2");
55 print MAKEFILE "dir = $dir\n";
56 print MAKEFILE <<'EOF';
57 .SECONDEXPANSION:
58 .SUFFIXES:
59 .DEFAULT: ; @echo '$@'
60
61 $(dir)/foo $(dir)/bar: $@.x $$@.x $$$@.x $$$$@.x $$(@D).x $$(@F).x
62
63 $(dir)/x.z $(dir)/y.z: $(dir)/%.z : $@.% $$@.% $$$@.% $$$$@.% $$(@D).% $$(@F).%
64
65 $(dir)/biz: $$(@).x $${@}.x $${@D}.x $${@F}.x
66 EOF
67
68 close(MAKEFILE);
69
70 &run_make_with_options($makefile2, "$dir/foo $dir/bar", &get_logfile);
71 $answer = ".x\n$dir/foo.x\nx\n\$@.x\n$dir.x\nfoo.x\n$dir/bar.x\nbar.x\n";
72 &compare_output($answer, &get_logfile(1));
73
74 &run_make_with_options($makefile2, "$dir/x.z $dir/y.z", &get_logfile);
75 $answer = ".x\n$dir/x.z.x\nx\n\$@.x\n$dir.x\nx.z.x\n.y\n$dir/y.z.y\ny\n\$@.y\n$dir.y\ny.z.y\n";
76 &compare_output($answer, &get_logfile(1));
77
78 &run_make_with_options($makefile2, "$dir/biz", &get_logfile);
79 $answer = "$dir/biz.x\n$dir.x\nbiz.x\n";
80 &compare_output($answer, &get_logfile(1));
81
82 # TEST #2 -- test for Savannah bug #12320.
83 #
84 run_make_test('
85 .SUFFIXES: .b .src
86
87 mbr.b: mbr.src
88         @echo $*
89
90 mbr.src: ; @:',
91               '',
92               'mbr');
93
94 # Same as above with second expansion.
95 #
96 run_make_test('
97 .SECONDEXPANSION:
98 .SUFFIXES: .b .src
99
100 p:=mbr.src
101 mbr.b: $$p
102         @echo $*
103
104 mbr.src: ; @:',
105               '',
106               'mbr');
107
108 # Test that $* is set to empty string for unknown suffixes.
109
110 run_make_test('
111 mbr.b: mbr.src
112         @echo star=$*
113
114 mbr.src: ; @:',
115               '',
116               "star=\n");
117
118 # TEST #3 -- test for Savannah bug #8154
119 # Make sure that nonexistent prerequisites are listed in $?, since they are
120 # considered reasons for the target to be rebuilt.
121 #
122 # See also Savannah bugs #16002 and #16051.
123
124 touch('foo');
125
126 run_make_test('
127 foo: bar ; @echo "\$$? = $?"
128 bar: ;',
129               '',
130               '$? = bar');
131
132 unlink('foo');
133
134 # TEST #4: ensure prereq ordering is correct when the command target has none
135 # See Savannah bug #21198
136
137 run_make_test('
138 all : A B
139 all : ; @echo $@ -- $^ -- $<
140 all : C D
141 all : E F
142 A B C D E F G H : ; @:
143 ',
144               '', "all -- A B C D E F -- A\n");
145
146 1;