Imported Upstream version 4.0
[platform/upstream/make.git] / tests / scripts / features / vpathplus
1 #                                                                    -*-perl-*-
2 $description = "Tests the new VPATH+ functionality added in 3.76.";
3
4 $details = "";
5
6 $VP = "$workdir$pathsep";
7
8 open(MAKEFILE,"> $makefile");
9
10 # The Contents of the MAKEFILE ...
11
12 print MAKEFILE "VPATH = $VP\n";
13
14 print MAKEFILE <<'EOMAKE';
15
16 SHELL = /bin/sh
17
18 .SUFFIXES: .a .b .c .d
19 .PHONY: general rename notarget intermediate
20
21 %.a:
22 %.b:
23 %.c:
24 %.d:
25
26 %.a : %.b
27         cat $^ > $@
28 %.b : %.c
29         cat $^ > $@ 2>/dev/null || exit 1
30 %.c :: %.d
31         cat $^ > $@
32
33 # General testing info:
34
35 general: foo.b
36 foo.b: foo.c bar.c
37
38 # Rename testing info:
39
40 rename: $(VPATH)/foo.c foo.d
41
42 # Target not made testing info:
43
44 notarget: notarget.b
45 notarget.c: notarget.d
46         -@echo "not creating $@ from $^"
47
48 # Intermediate files:
49
50 intermediate: inter.a
51
52 EOMAKE
53
54 close(MAKEFILE);
55
56 @touchedfiles = ();
57
58 $off = -500;
59
60 sub touchfiles {
61   foreach (@_) {
62     &utouch($off, $_);
63     $off += 10;
64     push(@touchedfiles, $_);
65   }
66 }
67
68 # Run the general-case test
69
70 &touchfiles("$VP/foo.d", "$VP/bar.d", "$VP/foo.c", "$VP/bar.c", "foo.b", "bar.d");
71
72 &run_make_with_options($makefile,"general",&get_logfile);
73
74 push(@touchedfiles, "bar.c");
75
76 $answer = "cat bar.d > bar.c
77 cat ${VP}foo.c bar.c > foo.b 2>/dev/null || exit 1
78 ";
79 &compare_output($answer,&get_logfile(1));
80
81 # Test rules that don't make the target correctly
82
83 &touchfiles("$VP/notarget.c", "notarget.b", "notarget.d");
84
85 &run_make_with_options($makefile,"notarget",&get_logfile,512);
86
87 $answer = "not creating notarget.c from notarget.d
88 cat notarget.c > notarget.b 2>/dev/null || exit 1
89 $makefile:16: recipe for target 'notarget.b' failed
90 $make_name: *** [notarget.b] Error 1
91 ";
92
93 &compare_output($answer,&get_logfile(1));
94
95 # Test intermediate file handling (part 1)
96
97 &touchfiles("$VP/inter.d");
98
99 &run_make_with_options($makefile,"intermediate",&get_logfile);
100
101 push(@touchedfiles, "inter.a", "inter.b");
102
103 $answer = "cat ${VP}inter.d > inter.c
104 cat inter.c > inter.b 2>/dev/null || exit 1
105 cat inter.b > inter.a
106 rm inter.b inter.c
107 ";
108 &compare_output($answer,&get_logfile(1));
109
110 # Test intermediate file handling (part 2)
111
112 &utouch(-20, "inter.a");
113 &utouch(-10, "$VP/inter.b");
114 &touch("$VP/inter.d");
115
116 push(@touchedfiles, "$VP/inter.b", "$VP/inter.d");
117
118 &run_make_with_options($makefile,"intermediate",&get_logfile);
119
120 $answer = "cat ${VP}inter.d > inter.c
121 cat inter.c > inter.b 2>/dev/null || exit 1
122 cat inter.b > inter.a
123 rm inter.c
124 ";
125 &compare_output($answer,&get_logfile(1));
126
127 unlink @touchedfiles unless $keep;
128
129 1;