VirtualBox

source: kBuild/trunk/src/kmk/make.h@ 25

Last change on this file since 25 was 25, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r24,
which included commits to RCS files with non-trunk default branches.

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

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette