Commit | Line | Data |
---|---|---|
e72c71e5 WJ |
1 | /* |
2 | * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. | |
3 | * Copyright (c) 1988, 1989 by Adam de Boor | |
4 | * Copyright (c) 1989 by Berkeley Softworks | |
5 | * All rights reserved. | |
6 | * | |
7 | * This code is derived from software contributed to Berkeley by | |
8 | * Adam de Boor. | |
9 | * | |
10 | * Redistribution and use in source and binary forms, with or without | |
11 | * modification, are permitted provided that the following conditions | |
12 | * are met: | |
13 | * 1. Redistributions of source code must retain the above copyright | |
14 | * notice, this list of conditions and the following disclaimer. | |
15 | * 2. Redistributions in binary form must reproduce the above copyright | |
16 | * notice, this list of conditions and the following disclaimer in the | |
17 | * documentation and/or other materials provided with the distribution. | |
18 | * 3. All advertising materials mentioning features or use of this software | |
19 | * must display the following acknowledgement: | |
20 | * This product includes software developed by the University of | |
21 | * California, Berkeley and its contributors. | |
22 | * 4. Neither the name of the University nor the names of its contributors | |
23 | * may be used to endorse or promote products derived from this software | |
24 | * without specific prior written permission. | |
25 | * | |
26 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
27 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
28 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
29 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
30 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
31 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
32 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
33 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
34 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
35 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
36 | * SUCH DAMAGE. | |
37 | * | |
38 | * @(#)make.h 5.13 (Berkeley) 3/1/91 | |
39 | */ | |
40 | ||
41 | /*- | |
42 | * make.h -- | |
43 | * The global definitions for pmake | |
44 | */ | |
45 | ||
46 | #ifndef _MAKE_H_ | |
47 | #define _MAKE_H_ | |
48 | ||
49 | #include <sys/types.h> | |
50 | #include <string.h> | |
51 | #include <ctype.h> | |
52 | #include "sprite.h" | |
53 | #include "lst.h" | |
54 | #include "config.h" | |
55 | ||
56 | /*- | |
57 | * The structure for an individual graph node. Each node has several | |
58 | * pieces of data associated with it. | |
59 | * 1) the name of the target it describes | |
60 | * 2) the location of the target file in the file system. | |
61 | * 3) the type of operator used to define its sources (qv. parse.c) | |
62 | * 4) whether it is involved in this invocation of make | |
63 | * 5) whether the target has been remade | |
64 | * 6) whether any of its children has been remade | |
65 | * 7) the number of its children that are, as yet, unmade | |
66 | * 8) its modification time | |
67 | * 9) the modification time of its youngest child (qv. make.c) | |
68 | * 10) a list of nodes for which this is a source | |
69 | * 11) a list of nodes on which this depends | |
70 | * 12) a list of nodes that depend on this, as gleaned from the | |
71 | * transformation rules. | |
72 | * 13) a list of nodes of the same name created by the :: operator | |
73 | * 14) a list of nodes that must be made (if they're made) before | |
74 | * this node can be, but that do no enter into the datedness of | |
75 | * this node. | |
76 | * 15) a list of nodes that must be made (if they're made) after | |
77 | * this node is, but that do not depend on this node, in the | |
78 | * normal sense. | |
79 | * 16) a Lst of ``local'' variables that are specific to this target | |
80 | * and this target only (qv. var.c [$@ $< $?, etc.]) | |
81 | * 17) a Lst of strings that are commands to be given to a shell | |
82 | * to create this target. | |
83 | */ | |
84 | typedef struct GNode { | |
85 | char *name; /* The target's name */ | |
86 | char *path; /* The full pathname of the file */ | |
87 | int type; /* Its type (see the OP flags, below) */ | |
88 | ||
89 | Boolean make; /* TRUE if this target needs to be remade */ | |
90 | enum { | |
91 | UNMADE, BEINGMADE, MADE, UPTODATE, ERROR, ABORTED, | |
92 | CYCLE, ENDCYCLE, | |
93 | } made; /* Set to reflect the state of processing | |
94 | * on this node: | |
95 | * UNMADE - Not examined yet | |
96 | * BEINGMADE - Target is already being made. | |
97 | * Indicates a cycle in the graph. (compat | |
98 | * mode only) | |
99 | * MADE - Was out-of-date and has been made | |
100 | * UPTODATE - Was already up-to-date | |
101 | * ERROR - An error occured while it was being | |
102 | * made (used only in compat mode) | |
103 | * ABORTED - The target was aborted due to | |
104 | * an error making an inferior (compat). | |
105 | * CYCLE - Marked as potentially being part of | |
106 | * a graph cycle. If we come back to a | |
107 | * node marked this way, it is printed | |
108 | * and 'made' is changed to ENDCYCLE. | |
109 | * ENDCYCLE - the cycle has been completely | |
110 | * printed. Go back and unmark all its | |
111 | * members. | |
112 | */ | |
113 | Boolean childMade; /* TRUE if one of this target's children was | |
114 | * made */ | |
115 | int unmade; /* The number of unmade children */ | |
116 | ||
117 | int mtime; /* Its modification time */ | |
118 | int cmtime; /* The modification time of its youngest | |
119 | * child */ | |
120 | ||
121 | Lst iParents; /* Links to parents for which this is an | |
122 | * implied source, if any */ | |
123 | Lst cohorts; /* Other nodes for the :: operator */ | |
124 | Lst parents; /* Nodes that depend on this one */ | |
125 | Lst children; /* Nodes on which this one depends */ | |
126 | Lst successors; /* Nodes that must be made after this one */ | |
127 | Lst preds; /* Nodes that must be made before this one */ | |
128 | ||
129 | Lst context; /* The local variables */ | |
130 | Lst commands; /* Creation commands */ | |
131 | ||
132 | struct _Suff *suffix; /* Suffix for the node (determined by | |
133 | * Suff_FindDeps and opaque to everyone | |
134 | * but the Suff module) */ | |
135 | } GNode; | |
136 | ||
137 | /* | |
138 | * Manifest constants | |
139 | */ | |
140 | #define NILGNODE ((GNode *) NIL) | |
141 | ||
142 | /* | |
143 | * The OP_ constants are used when parsing a dependency line as a way of | |
144 | * communicating to other parts of the program the way in which a target | |
145 | * should be made. These constants are bitwise-OR'ed together and | |
146 | * placed in the 'type' field of each node. Any node that has | |
147 | * a 'type' field which satisfies the OP_NOP function was never never on | |
148 | * the lefthand side of an operator, though it may have been on the | |
149 | * righthand side... | |
150 | */ | |
151 | #define OP_DEPENDS 0x00000001 /* Execution of commands depends on | |
152 | * kids (:) */ | |
153 | #define OP_FORCE 0x00000002 /* Always execute commands (!) */ | |
154 | #define OP_DOUBLEDEP 0x00000004 /* Execution of commands depends on kids | |
155 | * per line (::) */ | |
156 | #define OP_OPMASK (OP_DEPENDS|OP_FORCE|OP_DOUBLEDEP) | |
157 | ||
158 | #define OP_OPTIONAL 0x00000008 /* Don't care if the target doesn't | |
159 | * exist and can't be created */ | |
160 | #define OP_USE 0x00000010 /* Use associated commands for parents */ | |
161 | #define OP_EXEC 0x00000020 /* Target is never out of date, but always | |
162 | * execute commands anyway. Its time | |
163 | * doesn't matter, so it has none...sort | |
164 | * of */ | |
165 | #define OP_IGNORE 0x00000040 /* Ignore errors when creating the node */ | |
166 | #define OP_PRECIOUS 0x00000080 /* Don't remove the target when | |
167 | * interrupted */ | |
168 | #define OP_SILENT 0x00000100 /* Don't echo commands when executed */ | |
169 | #define OP_MAKE 0x00000200 /* Target is a recurrsive make so its | |
170 | * commands should always be executed when | |
171 | * it is out of date, regardless of the | |
172 | * state of the -n or -t flags */ | |
173 | #define OP_JOIN 0x00000400 /* Target is out-of-date only if any of its | |
174 | * children was out-of-date */ | |
175 | #define OP_INVISIBLE 0x00004000 /* The node is invisible to its parents. | |
176 | * I.e. it doesn't show up in the parents's | |
177 | * local variables. */ | |
178 | #define OP_NOTMAIN 0x00008000 /* The node is exempt from normal 'main | |
179 | * target' processing in parse.c */ | |
180 | /* Attributes applied by PMake */ | |
181 | #define OP_TRANSFORM 0x80000000 /* The node is a transformation rule */ | |
182 | #define OP_MEMBER 0x40000000 /* Target is a member of an archive */ | |
183 | #define OP_LIB 0x20000000 /* Target is a library */ | |
184 | #define OP_ARCHV 0x10000000 /* Target is an archive construct */ | |
185 | #define OP_HAS_COMMANDS 0x08000000 /* Target has all the commands it should. | |
186 | * Used when parsing to catch multiple | |
187 | * commands for a target */ | |
188 | #define OP_SAVE_CMDS 0x04000000 /* Saving commands on .END (Compat) */ | |
189 | #define OP_DEPS_FOUND 0x02000000 /* Already processed by Suff_FindDeps */ | |
190 | ||
191 | /* | |
192 | * OP_NOP will return TRUE if the node with the given type was not the | |
193 | * object of a dependency operator | |
194 | */ | |
195 | #define OP_NOP(t) (((t) & OP_OPMASK) == 0x00000000) | |
196 | ||
197 | /* | |
198 | * The TARG_ constants are used when calling the Targ_FindNode and | |
199 | * Targ_FindList functions in targ.c. They simply tell the functions what to | |
200 | * do if the desired node(s) is (are) not found. If the TARG_CREATE constant | |
201 | * is given, a new, empty node will be created for the target, placed in the | |
202 | * table of all targets and its address returned. If TARG_NOCREATE is given, | |
203 | * a NIL pointer will be returned. | |
204 | */ | |
205 | #define TARG_CREATE 0x01 /* create node if not found */ | |
206 | #define TARG_NOCREATE 0x00 /* don't create it */ | |
207 | ||
208 | /* | |
209 | * There are several places where expandable buffers are used (parse.c and | |
210 | * var.c). This constant is merely the starting point for those buffers. If | |
211 | * lines tend to be much shorter than this, it would be best to reduce BSIZE. | |
212 | * If longer, it should be increased. Reducing it will cause more copying to | |
213 | * be done for longer lines, but will save space for shorter ones. In any | |
214 | * case, it ought to be a power of two simply because most storage allocation | |
215 | * schemes allocate in powers of two. | |
216 | */ | |
217 | #define BSIZE 256 /* starting size for expandable buffers */ | |
218 | ||
219 | /* | |
220 | * These constants are all used by the Str_Concat function to decide how the | |
221 | * final string should look. If STR_ADDSPACE is given, a space will be | |
222 | * placed between the two strings. If STR_ADDSLASH is given, a '/' will | |
223 | * be used instead of a space. If neither is given, no intervening characters | |
224 | * will be placed between the two strings in the final output. If the | |
225 | * STR_DOFREE bit is set, the two input strings will be freed before | |
226 | * Str_Concat returns. | |
227 | */ | |
228 | #define STR_ADDSPACE 0x01 /* add a space when Str_Concat'ing */ | |
229 | #define STR_DOFREE 0x02 /* free source strings after concatenation */ | |
230 | #define STR_ADDSLASH 0x04 /* add a slash when Str_Concat'ing */ | |
231 | ||
232 | /* | |
233 | * Error levels for parsing. PARSE_FATAL means the process cannot continue | |
234 | * once the makefile has been parsed. PARSE_WARNING means it can. Passed | |
235 | * as the first argument to Parse_Error. | |
236 | */ | |
237 | #define PARSE_WARNING 2 | |
238 | #define PARSE_FATAL 1 | |
239 | ||
240 | /* | |
241 | * Values returned by Cond_Eval. | |
242 | */ | |
243 | #define COND_PARSE 0 /* Parse the next lines */ | |
244 | #define COND_SKIP 1 /* Skip the next lines */ | |
245 | #define COND_INVALID 2 /* Not a conditional statement */ | |
246 | ||
247 | /* | |
248 | * Definitions for the "local" variables. Used only for clarity. | |
249 | */ | |
250 | #define TARGET "@" /* Target of dependency */ | |
251 | #define OODATE "?" /* All out-of-date sources */ | |
252 | #define ALLSRC ">" /* All sources */ | |
253 | #define IMPSRC "<" /* Source implied by transformation */ | |
254 | #define PREFIX "*" /* Common prefix */ | |
255 | #define ARCHIVE "!" /* Archive in "archive(member)" syntax */ | |
256 | #define MEMBER "%" /* Member in "archive(member)" syntax */ | |
257 | ||
258 | #define FTARGET "@F" /* file part of TARGET */ | |
259 | #define DTARGET "@D" /* directory part of TARGET */ | |
260 | #define FIMPSRC "<F" /* file part of IMPSRC */ | |
261 | #define DIMPSRC "<D" /* directory part of IMPSRC */ | |
262 | #define FPREFIX "*F" /* file part of PREFIX */ | |
263 | #define DPREFIX "*D" /* directory part of PREFIX */ | |
264 | ||
265 | /* | |
266 | * Global Variables | |
267 | */ | |
268 | extern Lst create; /* The list of target names specified on the | |
269 | * command line. used to resolve #if | |
270 | * make(...) statements */ | |
271 | extern Lst dirSearchPath; /* The list of directories to search when | |
272 | * looking for targets */ | |
273 | ||
274 | extern Boolean ignoreErrors; /* True if should ignore all errors */ | |
275 | extern Boolean beSilent; /* True if should print no commands */ | |
276 | extern Boolean noExecute; /* True if should execute nothing */ | |
277 | extern Boolean allPrecious; /* True if every target is precious */ | |
278 | extern Boolean keepgoing; /* True if should continue on unaffected | |
279 | * portions of the graph when have an error | |
280 | * in one portion */ | |
281 | extern Boolean touchFlag; /* TRUE if targets should just be 'touched' | |
282 | * if out of date. Set by the -t flag */ | |
283 | extern Boolean usePipes; /* TRUE if should capture the output of | |
284 | * subshells by means of pipes. Otherwise it | |
285 | * is routed to temporary files from which it | |
286 | * is retrieved when the shell exits */ | |
287 | extern Boolean queryFlag; /* TRUE if we aren't supposed to really make | |
288 | * anything, just see if the targets are out- | |
289 | * of-date */ | |
290 | ||
291 | extern Boolean checkEnvFirst; /* TRUE if environment should be searched for | |
292 | * variables before the global context */ | |
293 | ||
294 | extern GNode *DEFAULT; /* .DEFAULT rule */ | |
295 | ||
296 | extern GNode *VAR_GLOBAL; /* Variables defined in a global context, e.g | |
297 | * in the Makefile itself */ | |
298 | extern GNode *VAR_CMD; /* Variables defined on the command line */ | |
299 | extern char var_Error[]; /* Value returned by Var_Parse when an error | |
300 | * is encountered. It actually points to | |
301 | * an empty string, so naive callers needn't | |
302 | * worry about it. */ | |
303 | ||
304 | extern time_t now; /* The time at the start of this whole | |
305 | * process */ | |
306 | ||
307 | extern Boolean oldVars; /* Do old-style variable substitution */ | |
308 | ||
309 | /* | |
310 | * debug control: | |
311 | * There is one bit per module. It is up to the module what debug | |
312 | * information to print. | |
313 | */ | |
314 | extern int debug; | |
315 | #define DEBUG_ARCH 0x0001 | |
316 | #define DEBUG_COND 0x0002 | |
317 | #define DEBUG_DIR 0x0004 | |
318 | #define DEBUG_GRAPH1 0x0008 | |
319 | #define DEBUG_GRAPH2 0x0010 | |
320 | #define DEBUG_JOB 0x0020 | |
321 | #define DEBUG_MAKE 0x0040 | |
322 | #define DEBUG_SUFF 0x0080 | |
323 | #define DEBUG_TARG 0x0100 | |
324 | #define DEBUG_VAR 0x0200 | |
325 | ||
326 | #ifdef __STDC__ | |
327 | #define CONCAT(a,b) a##b | |
328 | #else | |
329 | #define I(a) a | |
330 | #define CONCAT(a,b) I(a)b | |
331 | #endif /* __STDC__ */ | |
332 | ||
333 | #define DEBUG(module) (debug & CONCAT(DEBUG_,module)) | |
334 | ||
335 | /* | |
336 | * Since there are so many, all functions that return non-integer values are | |
337 | * extracted by means of a sed script or two and stuck in the file "nonints.h" | |
338 | */ | |
339 | #include "nonints.h" | |
340 | ||
341 | #endif _MAKE_H_ |