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