annotate libcpp/mkdeps.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /* Dependency generator for Makefile fragments.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2000-2020 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 Contributed by Zack Weinberg, Mar 2000
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 This program is free software; you can redistribute it and/or modify it
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 under the terms of the GNU General Public License as published by the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 Free Software Foundation; either version 3, or (at your option) any
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 later version.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 GNU General Public License for more details.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 along with this program; see the file COPYING3. If not see
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 <http://www.gnu.org/licenses/>.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 In other words, you are welcome to use, share and improve this program.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 You are forbidden to forbid anyone else to use, share and improve
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 what you give them. Help stamp out software-hoarding! */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 #include "config.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 #include "system.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 #include "mkdeps.h"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
27 /* Not set up to just include std::vector et al, here's a simple
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
28 implementation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
29
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 /* Keep this structure local to this file, so clients don't find it
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 easy to start making assumptions. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
32 class mkdeps
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
34 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
35 /* T has trivial cctor & dtor. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
36 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
37 class vec
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
38 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
39 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
40 T *ary;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
41 unsigned num;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
42 unsigned alloc;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
43
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
44 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
45 vec ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
46 : ary (NULL), num (0), alloc (0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
47 {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
48 ~vec ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
49 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
50 XDELETEVEC (ary);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
51 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
53 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
54 unsigned size () const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
55 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
56 return num;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
57 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
58 const T &operator[] (unsigned ix) const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
59 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
60 return ary[ix];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
61 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
62 T &operator[] (unsigned ix)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
63 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
64 return ary[ix];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
65 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
66 void push (const T &elt)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
67 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
68 if (num == alloc)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
69 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
70 alloc = alloc ? alloc * 2 : 16;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
71 ary = XRESIZEVEC (T, ary, alloc);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
72 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
73 ary[num++] = elt;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
74 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
75 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
76 struct velt
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
77 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
78 const char *str;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
79 size_t len;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
80 };
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
82 mkdeps ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
83 : quote_lwm (0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
84 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
85 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
86 ~mkdeps ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
87 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
88 unsigned int i;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
89
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
90 for (i = targets.size (); i--;)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
91 free (const_cast <char *> (targets[i]));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
92 for (i = deps.size (); i--;)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
93 free (const_cast <char *> (deps[i]));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
94 for (i = vpath.size (); i--;)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
95 XDELETEVEC (vpath[i].str);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
96 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
97
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
98 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
99 vec<const char *> targets;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
100 vec<const char *> deps;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
101 vec<velt> vpath;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
102
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
103 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
104 unsigned short quote_lwm;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
107 /* Apply Make quoting to STR, TRAIL etc. Note that it's not possible
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
108 to quote all such characters - e.g. \n, %, *, ?, [, \ (in some
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
109 contexts), and ~ are not properly handled. It isn't possible to
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
110 get this right in any current version of Make. (??? Still true?
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
111 Old comment referred to 3.76.1.) */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
112
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 static const char *
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
114 munge (const char *str, const char *trail = NULL, ...)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
116 static unsigned alloc;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
117 static char *buf;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
118 unsigned dst = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
119 va_list args;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
120 if (trail)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
121 va_start (args, trail);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
123 for (bool first = true; str; first = false)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
125 unsigned slashes = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
126 char c;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
127 for (const char *probe = str; (c = *probe++);)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
129 if (alloc < dst + 4 + slashes)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
130 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
131 alloc = alloc * 2 + 32;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
132 buf = XRESIZEVEC (char, buf, alloc);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
133 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
134
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
135 switch (c)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
136 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
137 case '\\':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
138 slashes++;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
139 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
140
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
141 case '$':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
142 buf[dst++] = '$';
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
143 goto def;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
145 case ' ':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
146 case '\t':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
147 /* GNU make uses a weird quoting scheme for white space.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
148 A space or tab preceded by 2N+1 backslashes
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
149 represents N backslashes followed by space; a space
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
150 or tab preceded by 2N backslashes represents N
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
151 backslashes at the end of a file name; and
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
152 backslashes in other contexts should not be
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
153 doubled. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
154 while (slashes--)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
155 buf[dst++] = '\\';
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
156 /* FALLTHROUGH */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
157
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
158 case '#':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
159 case ':':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
160 buf[dst++] = '\\';
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
161 /* FALLTHROUGH */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
162
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
163 default:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
164 def:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
165 slashes = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
166 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
167 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
168
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
169 buf[dst++] = c;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
172 if (first)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
173 str = trail;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
174 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
175 str = va_arg (args, const char *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
176 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
177 if (trail)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
178 va_end (args);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
180 buf[dst] = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
181 return buf;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
183
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 /* If T begins with any of the partial pathnames listed in d->vpathv,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 then advance T to point beyond that pathname. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 static const char *
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
187 apply_vpath (class mkdeps *d, const char *t)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
189 if (unsigned len = d->vpath.size ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
190 for (unsigned i = len; i--;)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
191 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
192 if (!filename_ncmp (d->vpath[i].str, t, d->vpath[i].len))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
193 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
194 const char *p = t + d->vpath[i].len;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
195 if (!IS_DIR_SEPARATOR (*p))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
196 goto not_this_one;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
198 /* Do not simplify $(vpath)/../whatever. ??? Might not
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
199 be necessary. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
200 if (p[1] == '.' && p[2] == '.' && IS_DIR_SEPARATOR (p[3]))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
201 goto not_this_one;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
202
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
203 /* found a match */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
204 t = t + d->vpath[i].len + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
205 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
206 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
207 not_this_one:;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
208 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
209
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
210 /* Remove leading ./ in any case. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 while (t[0] == '.' && IS_DIR_SEPARATOR (t[1]))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 t += 2;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
214 /* If we removed a leading ./, then also remove any /s after the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
215 first. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 while (IS_DIR_SEPARATOR (t[0]))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
217 ++t;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
218 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
219
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
220 return t;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
221 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
222
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
223 /* Public routines. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
224
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
225 class mkdeps *
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 deps_init (void)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
227 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
228 return new mkdeps ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
229 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
230
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
231 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
232 deps_free (class mkdeps *d)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
233 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
234 delete d;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
236
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 /* Adds a target T. We make a copy, so it need not be a permanent
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 string. QUOTE is true if the string should be quoted. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
240 deps_add_target (class mkdeps *d, const char *t, int quote)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
242 t = xstrdup (apply_vpath (d, t));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
243
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
244 if (!quote)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
246 /* Sometimes unquoted items are added after quoted ones.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
247 Swap out the lowest quoted. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
248 if (d->quote_lwm != d->targets.size ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
249 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
250 const char *lowest = d->targets[d->quote_lwm];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
251 d->targets[d->quote_lwm] = t;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
252 t = lowest;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
253 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
254 d->quote_lwm++;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
256
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
257 d->targets.push (t);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 /* Sets the default target if none has been given already. An empty
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 string as the default target in interpreted as stdin. The string
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 is quoted for MAKE. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
263 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
264 deps_add_default_target (class mkdeps *d, const char *tgt)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 /* Only if we have no targets. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
267 if (d->targets.size ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 return;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
269
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 if (tgt[0] == '\0')
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
271 d->targets.push (xstrdup ("-"));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 #ifndef TARGET_OBJECT_SUFFIX
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 # define TARGET_OBJECT_SUFFIX ".o"
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 #endif
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 const char *start = lbasename (tgt);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 char *o = (char *) alloca (strlen (start)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 + strlen (TARGET_OBJECT_SUFFIX) + 1);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 char *suffix;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
281
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
282 strcpy (o, start);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
283
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
284 suffix = strrchr (o, '.');
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
285 if (!suffix)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 suffix = o + strlen (o);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
287 strcpy (suffix, TARGET_OBJECT_SUFFIX);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
288
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
289 deps_add_target (d, o, 1);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
290 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
291 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
292
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
294 deps_add_dep (class mkdeps *d, const char *t)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
295 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
296 gcc_assert (*t);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
297
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
298 t = apply_vpath (d, t);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
299
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
300 d->deps.push (xstrdup (t));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
302
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
304 deps_add_vpath (class mkdeps *d, const char *vpath)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 const char *elem, *p;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
307
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 for (elem = vpath; *elem; elem = p)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
310 for (p = elem; *p && *p != ':'; p++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
311 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
312 mkdeps::velt elt;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
313 elt.len = p - elem;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
314 char *str = XNEWVEC (char, elt.len + 1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
315 elt.str = str;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
316 memcpy (str, elem, elt.len);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
317 str[elt.len] = '\0';
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 if (*p == ':')
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 p++;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
320
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
321 d->vpath.push (elt);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
322 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
323 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
324
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
325 /* Write NAME, with a leading space to FP, a Makefile. Advance COL as
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
326 appropriate, wrap at COLMAX, returning new column number. Iff
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
327 QUOTE apply quoting. Append TRAIL. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
328
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
329 static unsigned
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
330 make_write_name (const char *name, FILE *fp, unsigned col, unsigned colmax,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
331 bool quote = true, const char *trail = NULL)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
332 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
333 if (quote)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
334 name = munge (name, trail, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
335 unsigned size = strlen (name);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
336
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
337 if (col)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
338 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
339 if (colmax && col + size> colmax)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
340 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
341 fputs (" \\\n", fp);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
342 col = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
343 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
344 col++;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
345 fputs (" ", fp);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
346 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
347
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
348 col += size;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
349 fputs (name, fp);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
350
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
351 return col;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
352 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
353
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
354 /* Write all the names in VEC via make_write_name. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
355
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
356 static unsigned
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
357 make_write_vec (const mkdeps::vec<const char *> &vec, FILE *fp,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
358 unsigned col, unsigned colmax, unsigned quote_lwm = 0,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
359 const char *trail = NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
360 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
361 for (unsigned ix = 0; ix != vec.size (); ix++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
362 col = make_write_name (vec[ix], fp, col, colmax, ix >= quote_lwm, trail);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
363 return col;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
364 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
365
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
366 /* Write the dependencies to a Makefile. If PHONY is true, add
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
367 .PHONY targets for all the dependencies too. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
368
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
369 static void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
370 make_write (const class mkdeps *d, FILE *fp, bool phony, unsigned int colmax)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
371 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
372 unsigned column = 0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
373 if (colmax && colmax < 34)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
374 colmax = 34;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
375
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
376 if (d->deps.size ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
377 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
378 column = make_write_vec (d->targets, fp, 0, colmax, d->quote_lwm);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
379 fputs (":", fp);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
380 column++;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
381 make_write_vec (d->deps, fp, column, colmax);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
382 fputs ("\n", fp);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
383 if (phony)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
384 for (unsigned i = 1; i < d->deps.size (); i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
385 fprintf (fp, "%s:\n", munge (d->deps[i]));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
386 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
387 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
388
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
389 /* Write out dependencies according to the selected format (which is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
390 only Make at the moment). */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
391
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
392 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
393 deps_write (const class mkdeps *d, FILE *fp, bool phony, unsigned int colmax)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
394 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
395 make_write (d, fp, phony, colmax);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
396 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
397
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
398 /* Write out a deps buffer to a file, in a form that can be read back
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
399 with deps_restore. Returns nonzero on error, in which case the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
400 error number will be in errno. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
401
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
402 int
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
403 deps_save (class mkdeps *deps, FILE *f)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
404 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
405 unsigned int i;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
406 size_t size;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
407
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
408 /* The cppreader structure contains makefile dependences. Write out this
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
409 structure. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
410
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
411 /* The number of dependences. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
412 size = deps->deps.size ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
413 if (fwrite (&size, sizeof (size), 1, f) != 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
414 return -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
415
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
416 /* The length of each dependence followed by the string. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
417 for (i = 0; i < deps->deps.size (); i++)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
418 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
419 size = strlen (deps->deps[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
420 if (fwrite (&size, sizeof (size), 1, f) != 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
421 return -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
422 if (fwrite (deps->deps[i], size, 1, f) != 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
423 return -1;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
424 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
425
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
426 return 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
427 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
428
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
429 /* Read back dependency information written with deps_save into
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
430 the deps sizefer. The third argument may be NULL, in which case
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
431 the dependency information is just skipped, or it may be a filename,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
432 in which case that filename is skipped. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
433
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
434 int
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
435 deps_restore (class mkdeps *deps, FILE *fd, const char *self)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
436 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
437 size_t size;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
438 char *buf = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
439 size_t buf_size = 0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
440
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
441 /* Number of dependences. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
442 if (fread (&size, sizeof (size), 1, fd) != 1)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
443 return -1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
444
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
445 /* The length of each dependence string, followed by the string. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
446 for (unsigned i = size; i--;)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
447 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
448 /* Read in # bytes in string. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
449 if (fread (&size, sizeof (size), 1, fd) != 1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
450 return -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
451
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
452 if (size >= buf_size)
111
kono
parents: 0
diff changeset
453 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
454 buf_size = size + 512;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
455 buf = XRESIZEVEC (char, buf, buf_size);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
456 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
457 if (fread (buf, 1, size, fd) != size)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
458 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
459 XDELETEVEC (buf);
111
kono
parents: 0
diff changeset
460 return -1;
kono
parents: 0
diff changeset
461 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
462 buf[size] = 0;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
463
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
464 /* Generate makefile dependencies from .pch if -nopch-deps. */
111
kono
parents: 0
diff changeset
465 if (self != NULL && filename_cmp (buf, self) != 0)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 deps_add_dep (deps, buf);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
467 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
468
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
469 XDELETEVEC (buf);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
470 return 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
471 }