Annotation of src/usr.bin/make/make.h, Revision 1.287
1.287 ! rillig 1: /* $NetBSD: make.h,v 1.286 2022/01/07 19:24:27 rillig Exp $ */
1.6 christos 2:
1.1 cgd 3: /*
1.6 christos 4: * Copyright (c) 1988, 1989, 1990, 1993
5: * The Regents of the University of California. All rights reserved.
1.47 agc 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. Neither the name of the University nor the names of its contributors
19: * may be used to endorse or promote products derived from this software
20: * without specific prior written permission.
21: *
22: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32: * SUCH DAMAGE.
33: *
34: * from: @(#)make.h 8.3 (Berkeley) 6/13/95
35: */
36:
37: /*
1.1 cgd 38: * Copyright (c) 1989 by Berkeley Softworks
39: * All rights reserved.
40: *
41: * This code is derived from software contributed to Berkeley by
42: * Adam de Boor.
43: *
44: * Redistribution and use in source and binary forms, with or without
45: * modification, are permitted provided that the following conditions
46: * are met:
47: * 1. Redistributions of source code must retain the above copyright
48: * notice, this list of conditions and the following disclaimer.
49: * 2. Redistributions in binary form must reproduce the above copyright
50: * notice, this list of conditions and the following disclaimer in the
51: * documentation and/or other materials provided with the distribution.
52: * 3. All advertising materials mentioning features or use of this software
53: * must display the following acknowledgement:
54: * This product includes software developed by the University of
55: * California, Berkeley and its contributors.
56: * 4. Neither the name of the University nor the names of its contributors
57: * may be used to endorse or promote products derived from this software
58: * without specific prior written permission.
59: *
60: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
61: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
62: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
63: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
64: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
65: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
66: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
67: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
68: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
69: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
70: * SUCH DAMAGE.
71: *
1.11 christos 72: * from: @(#)make.h 8.3 (Berkeley) 6/13/95
1.1 cgd 73: */
74:
1.244 rillig 75: /*
1.1 cgd 76: * make.h --
77: * The global definitions for pmake
78: */
79:
1.116 rillig 80: #ifndef MAKE_MAKE_H
81: #define MAKE_MAKE_H
1.1 cgd 82:
83: #include <sys/types.h>
1.13 christos 84: #include <sys/param.h>
1.135 rillig 85: #include <sys/stat.h>
1.44 wiz 86:
1.123 rillig 87: #include <assert.h>
1.44 wiz 88: #include <ctype.h>
1.97 christos 89: #include <fcntl.h>
1.150 rillig 90: #include <stdarg.h>
1.3 cgd 91: #include <stdio.h>
1.44 wiz 92: #include <stdlib.h>
1.1 cgd 93: #include <string.h>
1.44 wiz 94: #include <unistd.h>
1.12 christos 95:
1.19 tv 96: #ifdef BSD4_4
1.12 christos 97: # include <sys/cdefs.h>
1.4 glass 98: #endif
1.12 christos 99:
1.97 christos 100: #ifndef FD_CLOEXEC
101: #define FD_CLOEXEC 1
102: #endif
103:
1.259 rillig 104: #if defined(__GNUC__)
1.230 rillig 105: #define MAKE_GNUC_PREREQ(x, y) \
1.52 yamt 106: ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \
107: (__GNUC__ > (x)))
1.278 rillig 108: #else
1.230 rillig 109: #define MAKE_GNUC_PREREQ(x, y) 0
1.278 rillig 110: #endif
1.52 yamt 111:
1.89 joerg 112: #if MAKE_GNUC_PREREQ(2, 7)
1.230 rillig 113: #define MAKE_ATTR_UNUSED __attribute__((__unused__))
1.51 jmc 114: #else
1.230 rillig 115: #define MAKE_ATTR_UNUSED /* delete */
1.51 jmc 116: #endif
1.89 joerg 117:
118: #if MAKE_GNUC_PREREQ(2, 5)
1.230 rillig 119: #define MAKE_ATTR_DEAD __attribute__((__noreturn__))
1.89 joerg 120: #elif defined(__GNUC__)
1.230 rillig 121: #define MAKE_ATTR_DEAD __volatile
1.89 joerg 122: #else
1.230 rillig 123: #define MAKE_ATTR_DEAD /* delete */
1.51 jmc 124: #endif
1.44 wiz 125:
1.89 joerg 126: #if MAKE_GNUC_PREREQ(2, 7)
127: #define MAKE_ATTR_PRINTFLIKE(fmtarg, firstvararg) \
128: __attribute__((__format__ (__printf__, fmtarg, firstvararg)))
129: #else
130: #define MAKE_ATTR_PRINTFLIKE(fmtarg, firstvararg) /* delete */
1.87 joerg 131: #endif
132:
1.273 rillig 133: #if MAKE_GNUC_PREREQ(4, 0)
1.278 rillig 134: #define MAKE_ATTR_USE __attribute__((__warn_unused_result__))
1.273 rillig 135: #else
1.278 rillig 136: #define MAKE_ATTR_USE /* delete */
1.273 rillig 137: #endif
138:
1.205 rillig 139: #define MAKE_INLINE static inline MAKE_ATTR_UNUSED
1.264 rillig 140:
141: /* MAKE_STATIC marks a function that may or may not be inlined. */
142: #if defined(lint)
143: /* As of 2021-07-31, NetBSD lint ignores __attribute__((unused)). */
144: #define MAKE_STATIC MAKE_INLINE
145: #else
1.262 rillig 146: #define MAKE_STATIC static MAKE_ATTR_UNUSED
1.264 rillig 147: #endif
1.205 rillig 148:
1.257 rillig 149: #if __STDC_VERSION__ >= 199901L || defined(lint) || defined(USE_C99_BOOLEAN)
1.235 rillig 150: #include <stdbool.h>
1.265 rillig 151: #elif defined(__bool_true_false_are_defined)
152: /*
153: * All files of make must be compiled with the same definition of bool.
154: * Since one of the files includes <stdbool.h>, that means the header is
155: * available on this platform. Recompile everything with -DUSE_C99_BOOLEAN.
156: */
157: #error "<stdbool.h> is included in pre-C99 mode"
158: #elif defined(bool) || defined(true) || defined(false)
159: /*
160: * In pre-C99 mode, make does not expect that bool is already defined.
161: * You need to ensure that all translation units use the same definition for
162: * bool.
163: */
164: #error "bool/true/false is defined in pre-C99 mode"
1.130 rillig 165: #else
1.265 rillig 166: typedef unsigned char bool;
1.257 rillig 167: #define true 1
168: #define false 0
1.140 rillig 169: #endif
1.127 rillig 170:
1.1 cgd 171: #include "lst.h"
1.261 rillig 172: #include "make_malloc.h"
173: #include "str.h"
1.22 mycroft 174: #include "hash.h"
1.1 cgd 175: #include "config.h"
1.3 cgd 176: #include "buf.h"
1.1 cgd 177:
1.216 rillig 178: /*
179: * The typical flow of states is:
180: *
181: * The direct successful path:
182: * UNMADE -> BEINGMADE -> MADE.
183: *
184: * The direct error path:
185: * UNMADE -> BEINGMADE -> ERROR.
186: *
187: * The successful path when dependencies need to be made first:
188: * UNMADE -> DEFERRED -> REQUESTED -> BEINGMADE -> MADE.
189: *
190: * A node that has dependencies, and one of the dependencies cannot be made:
191: * UNMADE -> DEFERRED -> ABORTED.
192: *
193: * A node that turns out to be up-to-date:
194: * UNMADE -> BEINGMADE -> UPTODATE.
195: */
1.181 rillig 196: typedef enum GNodeMade {
1.219 rillig 197: /* Not examined yet. */
198: UNMADE,
1.277 rillig 199: /*
200: * The node has been examined but is not yet ready since its
201: * dependencies have to be made first.
202: */
1.219 rillig 203: DEFERRED,
204:
205: /* The node is on the toBeMade list. */
206: REQUESTED,
207:
1.277 rillig 208: /*
209: * The node is already being made. Trying to build a node in this
210: * state indicates a cycle in the graph.
211: */
1.219 rillig 212: BEINGMADE,
213:
214: /* Was out-of-date and has been made. */
215: MADE,
216: /* Was already up-to-date, does not need to be made. */
217: UPTODATE,
1.277 rillig 218: /*
219: * An error occurred while it was being made. Used only in compat
220: * mode.
221: */
1.219 rillig 222: ERROR,
1.277 rillig 223: /*
224: * The target was aborted due to an error making a dependency. Used
225: * only in compat mode.
226: */
1.219 rillig 227: ABORTED
1.119 rillig 228: } GNodeMade;
1.1 cgd 229:
1.241 rillig 230: /*
231: * The OP_ constants are used when parsing a dependency line as a way of
1.120 rillig 232: * communicating to other parts of the program the way in which a target
233: * should be made.
234: *
1.241 rillig 235: * Some of the OP_ constants can be combined, others cannot.
1.263 rillig 236: *
237: * See the tests depsrc-*.mk and deptgt-*.mk.
1.241 rillig 238: */
1.159 rillig 239: typedef enum GNodeType {
1.219 rillig 240: OP_NONE = 0,
1.209 rillig 241:
1.277 rillig 242: /*
243: * The dependency operator ':' is the most common one. The commands
244: * of this node are executed if any child is out-of-date.
245: */
1.219 rillig 246: OP_DEPENDS = 1 << 0,
1.277 rillig 247: /*
248: * The dependency operator '!' always executes its commands, even if
249: * its children are up-to-date.
250: */
1.219 rillig 251: OP_FORCE = 1 << 1,
1.277 rillig 252: /*
253: * The dependency operator '::' behaves like ':', except that it
1.219 rillig 254: * allows multiple dependency groups to be defined. Each of these
1.277 rillig 255: * groups is executed on its own, independently from the others. Each
256: * individual dependency group is called a cohort.
257: */
1.219 rillig 258: OP_DOUBLEDEP = 1 << 2,
259:
260: /* Matches the dependency operators ':', '!' and '::'. */
261: OP_OPMASK = OP_DEPENDS | OP_FORCE | OP_DOUBLEDEP,
262:
263: /* Don't care if the target doesn't exist and can't be created. */
264: OP_OPTIONAL = 1 << 3,
265: /* Use associated commands for parents. */
266: OP_USE = 1 << 4,
1.277 rillig 267: /*
268: * Target is never out of date, but always execute commands anyway.
269: * Its time doesn't matter, so it has none...sort of.
270: */
1.219 rillig 271: OP_EXEC = 1 << 5,
1.277 rillig 272: /*
273: * Ignore non-zero exit status from shell commands when creating the
274: * node.
275: */
1.219 rillig 276: OP_IGNORE = 1 << 6,
277: /* Don't remove the target when interrupted. */
278: OP_PRECIOUS = 1 << 7,
279: /* Don't echo commands when executed. */
280: OP_SILENT = 1 << 8,
1.277 rillig 281: /*
282: * Target is a recursive make so its commands should always be
283: * executed when it is out of date, regardless of the state of the -n
284: * or -t flags.
285: */
1.219 rillig 286: OP_MAKE = 1 << 9,
1.277 rillig 287: /*
288: * Target is out-of-date only if any of its children was out-of-date.
289: */
1.219 rillig 290: OP_JOIN = 1 << 10,
291: /* Assume the children of the node have been already made. */
292: OP_MADE = 1 << 11,
293: /* Special .BEGIN, .END or .INTERRUPT. */
294: OP_SPECIAL = 1 << 12,
295: /* Like .USE, only prepend commands. */
296: OP_USEBEFORE = 1 << 13,
1.277 rillig 297: /*
298: * The node is invisible to its parents. I.e. it doesn't show up in
299: * the parents' local variables (.IMPSRC, .ALLSRC).
300: */
1.219 rillig 301: OP_INVISIBLE = 1 << 14,
1.277 rillig 302: /*
303: * The node does not become the main target, even if it is the first
304: * target in the first makefile.
305: */
1.219 rillig 306: OP_NOTMAIN = 1 << 15,
307: /* Not a file target; run always. */
308: OP_PHONY = 1 << 16,
309: /* Don't search for the file in the path. */
310: OP_NOPATH = 1 << 17,
1.277 rillig 311: /*
312: * In a dependency line "target: source1 .WAIT source2", source1 is
1.219 rillig 313: * made first, including its children. Once that is finished,
314: * source2 is made, including its children. The .WAIT keyword may
1.277 rillig 315: * appear more than once in a single dependency declaration.
316: */
1.219 rillig 317: OP_WAIT = 1 << 18,
318: /* .NOMETA do not create a .meta file */
319: OP_NOMETA = 1 << 19,
320: /* .META we _do_ want a .meta file */
321: OP_META = 1 << 20,
322: /* Do not compare commands in .meta file */
323: OP_NOMETA_CMP = 1 << 21,
324: /* Possibly a submake node */
325: OP_SUBMAKE = 1 << 22,
326:
327: /* Attributes applied by PMake */
328:
329: /* The node is a transformation rule, such as ".c.o". */
330: OP_TRANSFORM = 1 << 30,
331: /* Target is a member of an archive */
332: /* XXX: How does this differ from OP_ARCHV? */
333: OP_MEMBER = 1 << 29,
1.277 rillig 334: /*
335: * The node is a library, its name has the form "-l<libname>".
336: */
1.219 rillig 337: OP_LIB = 1 << 28,
1.277 rillig 338: /*
339: * The node is an archive member, its name has the form
340: * "archive(member)".
341: */
1.219 rillig 342: /* XXX: How does this differ from OP_MEMBER? */
343: OP_ARCHV = 1 << 27,
1.277 rillig 344: /*
345: * Target has all the commands it should. Used when parsing to catch
1.219 rillig 346: * multiple command groups for a target. Only applies to the
1.277 rillig 347: * dependency operators ':' and '!', but not to '::'.
348: */
1.219 rillig 349: OP_HAS_COMMANDS = 1 << 26,
1.277 rillig 350: /*
351: * The special command "..." has been seen. All further commands from
352: * this node will be saved on the .END node instead, to be executed
353: * at the very end.
354: */
1.219 rillig 355: OP_SAVE_CMDS = 1 << 25,
1.277 rillig 356: /*
357: * Already processed by Suff_FindDeps, to find dependencies from
358: * suffix transformation rules.
359: */
1.219 rillig 360: OP_DEPS_FOUND = 1 << 24,
361: /* Node found while expanding .ALLSRC */
362: OP_MARK = 1 << 23,
1.120 rillig 363: } GNodeType;
364:
1.269 rillig 365: typedef struct GNodeFlags {
1.219 rillig 366: /* this target needs to be (re)made */
1.268 rillig 367: bool remake:1;
1.219 rillig 368: /* children of this target were made */
1.268 rillig 369: bool childMade:1;
1.219 rillig 370: /* children don't exist, and we pretend made */
1.268 rillig 371: bool force:1;
1.219 rillig 372: /* Set by Make_ProcessWait() */
1.268 rillig 373: bool doneWait:1;
1.219 rillig 374: /* Build requested by .ORDER processing */
1.268 rillig 375: bool doneOrder:1;
1.219 rillig 376: /* Node created from .depend */
1.268 rillig 377: bool fromDepend:1;
1.219 rillig 378: /* We do it once only */
1.268 rillig 379: bool doneAllsrc:1;
1.219 rillig 380: /* Used by MakePrintStatus */
1.268 rillig 381: bool cycle:1;
1.219 rillig 382: /* Used by MakePrintStatus */
1.268 rillig 383: bool doneCycle:1;
1.119 rillig 384: } GNodeFlags;
1.1 cgd 385:
1.143 rillig 386: typedef struct List StringList;
387: typedef struct ListNode StringListNode;
1.144 rillig 388:
1.143 rillig 389: typedef struct List GNodeList;
390: typedef struct ListNode GNodeListNode;
391:
1.246 rillig 392: typedef struct SearchPath {
393: List /* of CachedDir */ dirs;
394: } SearchPath;
1.144 rillig 395:
1.241 rillig 396: /*
397: * A graph node represents a target that can possibly be made, including its
398: * relation to other targets and a lot of other details.
399: */
1.119 rillig 400: typedef struct GNode {
1.219 rillig 401: /* The target's name, such as "clean" or "make.c" */
402: char *name;
403: /* The unexpanded name of a .USE node */
404: char *uname;
1.277 rillig 405: /*
406: * The full pathname of the file belonging to the target.
407: *
1.219 rillig 408: * XXX: What about .PHONY targets? These don't have an associated
1.277 rillig 409: * path.
410: */
1.219 rillig 411: char *path;
412:
1.277 rillig 413: /*
414: * The type of operator used to define the sources (see the OP flags
1.219 rillig 415: * below).
1.277 rillig 416: *
417: * XXX: This looks like a wild mixture of type and flags.
418: */
1.219 rillig 419: GNodeType type;
420: GNodeFlags flags;
421:
422: /* The state of processing on this node */
423: GNodeMade made;
424: /* The number of unmade children */
425: int unmade;
426:
1.277 rillig 427: /*
428: * The modification time; 0 means the node does not have a
429: * corresponding file; see GNode_IsOODate.
430: */
1.219 rillig 431: time_t mtime;
432: struct GNode *youngestChild;
433:
1.277 rillig 434: /*
435: * The GNodes for which this node is an implied source. May be empty.
436: * For example, when there is an inference rule for .c.o, the node
437: * for file.c has the node for file.o in this list.
438: */
1.225 rillig 439: GNodeList implicitParents;
1.219 rillig 440:
1.277 rillig 441: /*
442: * The nodes that depend on this one, or in other words, the nodes
443: * for which this is a source.
444: */
1.222 rillig 445: GNodeList parents;
1.219 rillig 446: /* The nodes on which this one depends. */
1.222 rillig 447: GNodeList children;
1.219 rillig 448:
1.277 rillig 449: /*
450: * .ORDER nodes we need made. The nodes that must be made (if they're
1.219 rillig 451: * made) before this node can be made, but that do not enter into the
1.277 rillig 452: * datedness of this node.
453: */
1.223 rillig 454: GNodeList order_pred;
1.277 rillig 455: /*
456: * .ORDER nodes who need us. The nodes that must be made (if they're
1.219 rillig 457: * made at all) after this node is made, but that do not depend on
1.277 rillig 458: * this node, in the normal sense.
459: */
1.223 rillig 460: GNodeList order_succ;
1.219 rillig 461:
1.245 rillig 462: /*
463: * Other nodes of the same name, for targets that were defined using
464: * the '::' dependency operator (OP_DOUBLEDEP).
465: */
1.224 rillig 466: GNodeList cohorts;
1.219 rillig 467: /* The "#n" suffix for this cohort, or "" for other nodes */
468: char cohort_num[8];
469: /* The number of unmade instances on the cohorts list */
470: int unmade_cohorts;
1.277 rillig 471: /*
472: * Pointer to the first instance of a '::' node; only set when on a
473: * cohorts list
474: */
1.219 rillig 475: struct GNode *centurion;
476:
477: /* Last time (sequence number) we tried to make this node */
478: unsigned int checked_seqno;
479:
1.252 rillig 480: /*
481: * The "local" variables that are specific to this target and this
1.219 rillig 482: * target only, such as $@, $<, $?.
483: *
1.252 rillig 484: * Also used for the global variable scopes SCOPE_GLOBAL,
485: * SCOPE_CMDLINE, SCOPE_INTERNAL, which contain variables with
486: * arbitrary names.
487: */
1.219 rillig 488: HashTable /* of Var pointer */ vars;
489:
490: /* The commands to be given to a shell to create this target. */
1.221 rillig 491: StringList commands;
1.219 rillig 492:
1.277 rillig 493: /*
494: * Suffix for the node (determined by Suff_FindDeps and opaque to
495: * everyone but the Suff module)
496: */
1.219 rillig 497: struct Suffix *suffix;
498:
1.271 rillig 499: /* Filename where the GNode got defined, unlimited lifetime */
1.219 rillig 500: const char *fname;
1.285 rillig 501: /* Line number where the GNode got defined, 1-based */
1.219 rillig 502: int lineno;
1.1 cgd 503: } GNode;
504:
1.188 rillig 505: /* Error levels for diagnostics during parsing. */
1.167 rillig 506: typedef enum ParseErrorLevel {
1.277 rillig 507: /*
508: * Exit when the current top-level makefile has been parsed
509: * completely.
510: */
1.219 rillig 511: PARSE_FATAL = 1,
512: /* Print "warning"; may be upgraded to fatal by the -w option. */
513: PARSE_WARNING,
514: /* Informational, mainly used during development of makefiles. */
515: PARSE_INFO
1.167 rillig 516: } ParseErrorLevel;
1.1 cgd 517:
518: /*
1.141 rillig 519: * Values returned by Cond_EvalLine and Cond_EvalCondition.
1.1 cgd 520: */
1.284 rillig 521: typedef enum CondResult {
1.283 rillig 522: CR_TRUE, /* Parse the next lines */
523: CR_FALSE, /* Skip the next lines */
524: CR_ERROR /* Unknown directive or parse error */
1.284 rillig 525: } CondResult;
1.1 cgd 526:
1.190 rillig 527: /* Names of the variables that are "local" to a specific target. */
1.277 rillig 528: #define TARGET "@" /* Target of dependency */
529: #define OODATE "?" /* All out-of-date sources */
530: #define ALLSRC ">" /* All sources */
531: #define IMPSRC "<" /* Source implied by transformation */
532: #define PREFIX "*" /* Common prefix */
533: #define ARCHIVE "!" /* Archive in "archive(member)" syntax */
534: #define MEMBER "%" /* Member in "archive(member)" syntax */
1.148 rillig 535:
1.1 cgd 536: /*
1.11 christos 537: * Global Variables
1.1 cgd 538: */
539:
1.190 rillig 540: /* True if every target is precious */
1.257 rillig 541: extern bool allPrecious;
1.190 rillig 542: /* True if failed targets should be deleted */
1.257 rillig 543: extern bool deleteOnError;
544: /* true while processing .depend */
545: extern bool doing_depend;
1.190 rillig 546: /* .DEFAULT rule */
1.207 rillig 547: extern GNode *defaultNode;
1.190 rillig 548:
1.241 rillig 549: /*
550: * Variables defined internally by make which should not override those set
551: * by makefiles.
552: */
1.252 rillig 553: extern GNode *SCOPE_INTERNAL;
1.255 rillig 554: /* Variables defined in a global scope, e.g in the makefile itself. */
1.252 rillig 555: extern GNode *SCOPE_GLOBAL;
1.190 rillig 556: /* Variables defined on the command line. */
1.252 rillig 557: extern GNode *SCOPE_CMDLINE;
1.190 rillig 558:
1.241 rillig 559: /*
560: * Value returned by Var_Parse when an error is encountered. It actually
561: * points to an empty string, so naive callers needn't worry about it.
562: */
1.190 rillig 563: extern char var_Error[];
564:
565: /* The time at the start of this whole process */
566: extern time_t now;
1.1 cgd 567:
1.241 rillig 568: /*
569: * The list of directories to search when looking for targets (set by the
570: * special target .PATH).
571: */
1.229 rillig 572: extern SearchPath dirSearchPath;
1.186 rillig 573: /* Used for .include "...". */
574: extern SearchPath *parseIncPath;
1.241 rillig 575: /*
1.249 rillig 576: * Used for .include <...>, for the built-in sys.mk and for makefiles from
577: * the command line arguments.
1.241 rillig 578: */
1.186 rillig 579: extern SearchPath *sysIncPath;
580: /* The default for sysIncPath. */
581: extern SearchPath *defSysIncPath;
1.32 christos 582:
1.191 rillig 583: /* Startup directory */
584: extern char curdir[];
585: /* The basename of the program name, suffixed with [n] for sub-makes. */
1.234 rillig 586: extern const char *progname;
1.248 rillig 587: extern int makelevel;
1.191 rillig 588: /* Name of the .depend makefile */
589: extern char *makeDependfile;
1.187 rillig 590: /* If we replaced environ, this will be non-NULL. */
591: extern char **savedEnv;
1.287 ! rillig 592: extern GNode *mainNode;
1.30 sommerfe 593:
1.190 rillig 594: extern pid_t myPid;
1.82 sjg 595:
1.219 rillig 596: #define MAKEFLAGS ".MAKEFLAGS"
597: #define MAKEOVERRIDES ".MAKEOVERRIDES"
598: /* prefix when printing the target of a job */
599: #define MAKE_JOB_PREFIX ".MAKE.JOB.PREFIX"
600: #define MAKE_EXPORTED ".MAKE.EXPORTED" /* exported variables */
601: #define MAKE_MAKEFILES ".MAKE.MAKEFILES" /* all loaded makefiles */
602: #define MAKE_LEVEL ".MAKE.LEVEL" /* recursion level */
1.185 rillig 603: #define MAKE_MAKEFILE_PREFERENCE ".MAKE.MAKEFILE_PREFERENCE"
1.215 rillig 604: #define MAKE_DEPENDFILE ".MAKE.DEPENDFILE" /* .depend */
1.80 sjg 605: #define MAKE_MODE ".MAKE.MODE"
1.91 sjg 606: #ifndef MAKE_LEVEL_ENV
607: # define MAKE_LEVEL_ENV "MAKELEVEL"
608: #endif
1.1 cgd 609:
1.272 rillig 610: typedef struct DebugFlags {
1.275 rillig 611: bool DEBUG_ARCH:1;
612: bool DEBUG_COND:1;
613: bool DEBUG_CWD:1;
614: bool DEBUG_DIR:1;
615: bool DEBUG_ERROR:1;
616: bool DEBUG_FOR:1;
617: bool DEBUG_GRAPH1:1;
618: bool DEBUG_GRAPH2:1;
619: bool DEBUG_GRAPH3:1;
620: bool DEBUG_HASH:1;
621: bool DEBUG_JOB:1;
622: bool DEBUG_LOUD:1;
623: bool DEBUG_MAKE:1;
624: bool DEBUG_META:1;
625: bool DEBUG_PARSE:1;
626: bool DEBUG_SCRIPT:1;
627: bool DEBUG_SHELL:1;
628: bool DEBUG_SUFF:1;
629: bool DEBUG_TARG:1;
630: bool DEBUG_VAR:1;
1.170 rillig 631: } DebugFlags;
632:
1.219 rillig 633: #define CONCAT(a, b) a##b
1.1 cgd 634:
1.272 rillig 635: #define DEBUG(module) (opts.debug.CONCAT(DEBUG_, module))
1.1 cgd 636:
1.151 rillig 637: void debug_printf(const char *, ...) MAKE_ATTR_PRINTFLIKE(1, 2);
1.150 rillig 638:
1.232 rillig 639: #define DEBUG_IMPL(module, args) \
640: do { \
641: if (DEBUG(module)) \
642: debug_printf args; \
1.266 rillig 643: } while (false)
1.232 rillig 644:
1.149 rillig 645: #define DEBUG0(module, text) \
1.232 rillig 646: DEBUG_IMPL(module, ("%s", text))
1.149 rillig 647: #define DEBUG1(module, fmt, arg1) \
1.232 rillig 648: DEBUG_IMPL(module, (fmt, arg1))
1.149 rillig 649: #define DEBUG2(module, fmt, arg1, arg2) \
1.232 rillig 650: DEBUG_IMPL(module, (fmt, arg1, arg2))
1.149 rillig 651: #define DEBUG3(module, fmt, arg1, arg2, arg3) \
1.232 rillig 652: DEBUG_IMPL(module, (fmt, arg1, arg2, arg3))
1.149 rillig 653: #define DEBUG4(module, fmt, arg1, arg2, arg3, arg4) \
1.232 rillig 654: DEBUG_IMPL(module, (fmt, arg1, arg2, arg3, arg4))
1.149 rillig 655: #define DEBUG5(module, fmt, arg1, arg2, arg3, arg4, arg5) \
1.232 rillig 656: DEBUG_IMPL(module, (fmt, arg1, arg2, arg3, arg4, arg5))
1.149 rillig 657:
1.173 rillig 658: typedef enum PrintVarsMode {
1.219 rillig 659: PVM_NONE,
660: PVM_UNEXPANDED,
661: PVM_EXPANDED
1.173 rillig 662: } PrintVarsMode;
663:
664: /* Command line options */
665: typedef struct CmdOpts {
1.219 rillig 666: /* -B: whether we are make compatible */
1.257 rillig 667: bool compatMake;
1.173 rillig 668:
1.277 rillig 669: /*
670: * -d: debug control: There is one bit per module. It is up to the
671: * module what debug information to print.
672: */
1.219 rillig 673: DebugFlags debug;
1.173 rillig 674:
1.219 rillig 675: /* -df: debug output is written here - default stderr */
676: FILE *debug_file;
1.173 rillig 677:
1.277 rillig 678: /*
679: * -dL: lint mode
1.219 rillig 680: *
681: * Runs make in strict mode, with additional checks and better error
1.277 rillig 682: * handling.
683: */
1.257 rillig 684: bool strict;
1.204 rillig 685:
1.219 rillig 686: /* -dV: for the -V option, print unexpanded variable values */
1.257 rillig 687: bool debugVflag;
1.174 rillig 688:
1.219 rillig 689: /* -e: check environment variables before global variables */
1.257 rillig 690: bool checkEnvFirst;
1.173 rillig 691:
1.219 rillig 692: /* -f: the makefiles to read */
1.226 rillig 693: StringList makefiles;
1.173 rillig 694:
1.219 rillig 695: /* -i: if true, ignore all errors from shell commands */
1.257 rillig 696: bool ignoreErrors;
1.173 rillig 697:
1.277 rillig 698: /*
699: * -j: the maximum number of jobs that can run in parallel; this is
700: * coordinated with the submakes
701: */
1.219 rillig 702: int maxJobs;
1.173 rillig 703:
1.277 rillig 704: /*
705: * -k: if true and an error occurs while making a node, continue
706: * making nodes that do not depend on the erroneous node
707: */
1.257 rillig 708: bool keepgoing;
1.173 rillig 709:
1.219 rillig 710: /* -N: execute no commands from the targets */
1.257 rillig 711: bool noRecursiveExecute;
1.173 rillig 712:
1.219 rillig 713: /* -n: execute almost no commands from the targets */
1.257 rillig 714: bool noExecute;
1.173 rillig 715:
1.250 rillig 716: /*
717: * -q: if true, do not really make anything, just see if the targets
718: * are out-of-date
719: */
1.279 rillig 720: bool query;
1.173 rillig 721:
1.250 rillig 722: /* -r: raw mode, do not load the builtin rules. */
1.257 rillig 723: bool noBuiltins;
1.173 rillig 724:
1.219 rillig 725: /* -s: don't echo the shell commands before executing them */
1.279 rillig 726: bool silent;
1.173 rillig 727:
1.277 rillig 728: /*
729: * -t: touch the targets if they are out-of-date, but don't actually
730: * make them
731: */
1.279 rillig 732: bool touch;
1.173 rillig 733:
1.219 rillig 734: /* -[Vv]: print expanded or unexpanded selected variables */
735: PrintVarsMode printVars;
736: /* -[Vv]: the variables to print */
1.227 rillig 737: StringList variables;
1.173 rillig 738:
1.219 rillig 739: /* -W: if true, makefile parsing warnings are treated as errors */
1.257 rillig 740: bool parseWarnFatal;
1.173 rillig 741:
1.250 rillig 742: /* -w: print 'Entering' and 'Leaving' for submakes */
1.257 rillig 743: bool enterFlag;
1.173 rillig 744:
1.277 rillig 745: /*
746: * -X: if true, do not export variables set on the command line to
747: * the environment.
748: */
1.257 rillig 749: bool varNoExportEnv;
1.173 rillig 750:
1.277 rillig 751: /*
752: * The target names specified on the command line. Used to resolve
753: * .if make(...) statements.
754: */
1.228 rillig 755: StringList create;
1.173 rillig 756:
757: } CmdOpts;
758:
759: extern CmdOpts opts;
760:
1.1 cgd 761: #include "nonints.h"
762:
1.199 rillig 763: void GNode_UpdateYoungestChild(GNode *, GNode *);
1.274 rillig 764: bool GNode_IsOODate(GNode *) MAKE_ATTR_USE;
1.144 rillig 765: void Make_ExpandUse(GNodeList *);
1.274 rillig 766: time_t Make_Recheck(GNode *) MAKE_ATTR_USE;
1.44 wiz 767: void Make_HandleUse(GNode *, GNode *);
768: void Make_Update(GNode *);
1.260 rillig 769: void GNode_SetLocalVars(GNode *);
1.257 rillig 770: bool Make_Run(GNodeList *);
1.274 rillig 771: bool shouldDieQuietly(GNode *, int) MAKE_ATTR_USE;
1.80 sjg 772: void PrintOnError(GNode *, const char *);
1.257 rillig 773: void Main_ExportMAKEFLAGS(bool);
774: bool Main_SetObjdir(bool, const char *, ...) MAKE_ATTR_PRINTFLIKE(2, 3);
1.274 rillig 775: int mkTempFile(const char *, char *, size_t) MAKE_ATTR_USE;
1.208 rillig 776: int str2Lst_Append(StringList *, char *);
1.126 rillig 777: void GNode_FprintDetails(FILE *, const char *, const GNode *, const char *);
1.274 rillig 778: bool GNode_ShouldExecute(GNode *gn) MAKE_ATTR_USE;
1.155 rillig 779:
1.164 rillig 780: /* See if the node was seen on the left-hand side of a dependency operator. */
1.274 rillig 781: MAKE_INLINE bool MAKE_ATTR_USE
1.164 rillig 782: GNode_IsTarget(const GNode *gn)
1.155 rillig 783: {
1.270 rillig 784: return (gn->type & OP_OPMASK) != OP_NONE;
1.155 rillig 785: }
786:
1.274 rillig 787: MAKE_INLINE const char * MAKE_ATTR_USE
1.172 rillig 788: GNode_Path(const GNode *gn)
789: {
1.219 rillig 790: return gn->path != NULL ? gn->path : gn->name;
1.172 rillig 791: }
792:
1.274 rillig 793: MAKE_INLINE bool MAKE_ATTR_USE
1.218 rillig 794: GNode_IsWaitingFor(const GNode *gn)
795: {
1.268 rillig 796: return gn->flags.remake && gn->made <= REQUESTED;
1.218 rillig 797: }
798:
1.274 rillig 799: MAKE_INLINE bool MAKE_ATTR_USE
1.218 rillig 800: GNode_IsReady(const GNode *gn)
801: {
802: return gn->made > DEFERRED;
803: }
804:
1.274 rillig 805: MAKE_INLINE bool MAKE_ATTR_USE
1.218 rillig 806: GNode_IsDone(const GNode *gn)
807: {
808: return gn->made >= MADE;
809: }
810:
1.274 rillig 811: MAKE_INLINE bool MAKE_ATTR_USE
1.217 rillig 812: GNode_IsError(const GNode *gn)
813: {
814: return gn->made == ERROR || gn->made == ABORTED;
815: }
816:
1.280 rillig 817: MAKE_INLINE bool MAKE_ATTR_USE
818: GNode_IsMainCandidate(const GNode *gn)
819: {
1.281 rillig 820: return (gn->type & (OP_NOTMAIN | OP_USE | OP_USEBEFORE |
821: OP_EXEC | OP_TRANSFORM)) == 0;
1.280 rillig 822: }
823:
1.286 rillig 824: /* Return whether the target file should be preserved on interrupt. */
825: MAKE_INLINE bool MAKE_ATTR_USE
826: GNode_IsPrecious(const GNode *gn)
827: {
828: /* XXX: Why are '::' targets precious? */
829: return allPrecious || gn->type & (OP_PRECIOUS | OP_DOUBLEDEP);
830: }
831:
1.274 rillig 832: MAKE_INLINE const char * MAKE_ATTR_USE
1.254 rillig 833: GNode_VarTarget(GNode *gn) { return GNode_ValueDirect(gn, TARGET); }
1.274 rillig 834: MAKE_INLINE const char * MAKE_ATTR_USE
1.254 rillig 835: GNode_VarOodate(GNode *gn) { return GNode_ValueDirect(gn, OODATE); }
1.274 rillig 836: MAKE_INLINE const char * MAKE_ATTR_USE
1.254 rillig 837: GNode_VarAllsrc(GNode *gn) { return GNode_ValueDirect(gn, ALLSRC); }
1.274 rillig 838: MAKE_INLINE const char * MAKE_ATTR_USE
1.254 rillig 839: GNode_VarImpsrc(GNode *gn) { return GNode_ValueDirect(gn, IMPSRC); }
1.274 rillig 840: MAKE_INLINE const char * MAKE_ATTR_USE
1.254 rillig 841: GNode_VarPrefix(GNode *gn) { return GNode_ValueDirect(gn, PREFIX); }
1.274 rillig 842: MAKE_INLINE const char * MAKE_ATTR_USE
1.254 rillig 843: GNode_VarArchive(GNode *gn) { return GNode_ValueDirect(gn, ARCHIVE); }
1.274 rillig 844: MAKE_INLINE const char * MAKE_ATTR_USE
1.254 rillig 845: GNode_VarMember(GNode *gn) { return GNode_ValueDirect(gn, MEMBER); }
1.178 rillig 846:
1.274 rillig 847: MAKE_INLINE void * MAKE_ATTR_USE
1.264 rillig 848: UNCONST(const void *ptr)
849: {
850: void *ret;
851: memcpy(&ret, &ptr, sizeof(ret));
852: return ret;
853: }
1.49 sjg 854:
1.96 pooka 855: /* At least GNU/Hurd systems lack hardcoded MAXPATHLEN/PATH_MAX */
856: #include <limits.h>
857: #ifndef MAXPATHLEN
858: #define MAXPATHLEN 4096
859: #endif
860: #ifndef PATH_MAX
861: #define PATH_MAX MAXPATHLEN
862: #endif
863:
1.103 sjg 864: #if defined(SYSV)
1.219 rillig 865: #define KILLPG(pid, sig) kill(-(pid), (sig))
1.103 sjg 866: #else
1.219 rillig 867: #define KILLPG(pid, sig) killpg((pid), (sig))
1.103 sjg 868: #endif
869:
1.274 rillig 870: MAKE_INLINE bool MAKE_ATTR_USE
1.195 rillig 871: ch_isalnum(char ch) { return isalnum((unsigned char)ch) != 0; }
1.274 rillig 872: MAKE_INLINE bool MAKE_ATTR_USE
1.195 rillig 873: ch_isalpha(char ch) { return isalpha((unsigned char)ch) != 0; }
1.274 rillig 874: MAKE_INLINE bool MAKE_ATTR_USE
1.195 rillig 875: ch_isdigit(char ch) { return isdigit((unsigned char)ch) != 0; }
1.274 rillig 876: MAKE_INLINE bool MAKE_ATTR_USE
1.195 rillig 877: ch_isspace(char ch) { return isspace((unsigned char)ch) != 0; }
1.274 rillig 878: MAKE_INLINE bool MAKE_ATTR_USE
1.195 rillig 879: ch_isupper(char ch) { return isupper((unsigned char)ch) != 0; }
1.274 rillig 880: MAKE_INLINE char MAKE_ATTR_USE
1.195 rillig 881: ch_tolower(char ch) { return (char)tolower((unsigned char)ch); }
1.274 rillig 882: MAKE_INLINE char MAKE_ATTR_USE
1.195 rillig 883: ch_toupper(char ch) { return (char)toupper((unsigned char)ch); }
1.139 rillig 884:
1.205 rillig 885: MAKE_INLINE void
1.155 rillig 886: cpp_skip_whitespace(const char **pp)
887: {
1.219 rillig 888: while (ch_isspace(**pp))
889: (*pp)++;
1.155 rillig 890: }
891:
1.205 rillig 892: MAKE_INLINE void
1.196 rillig 893: cpp_skip_hspace(const char **pp)
894: {
1.219 rillig 895: while (**pp == ' ' || **pp == '\t')
896: (*pp)++;
1.196 rillig 897: }
898:
1.205 rillig 899: MAKE_INLINE void
1.155 rillig 900: pp_skip_whitespace(char **pp)
901: {
1.219 rillig 902: while (ch_isspace(**pp))
903: (*pp)++;
1.155 rillig 904: }
905:
1.205 rillig 906: MAKE_INLINE void
1.197 rillig 907: pp_skip_hspace(char **pp)
908: {
1.219 rillig 909: while (**pp == ' ' || **pp == '\t')
910: (*pp)++;
1.197 rillig 911: }
912:
1.238 rillig 913: #if defined(lint)
1.249 rillig 914: # define MAKE_RCSID(id) extern void do_not_define_rcsid(void)
1.238 rillig 915: #elif defined(MAKE_NATIVE)
1.249 rillig 916: # include <sys/cdefs.h>
917: # define MAKE_RCSID(id) __RCSID(id)
1.238 rillig 918: #elif defined(MAKE_ALL_IN_ONE) && defined(__COUNTER__)
1.249 rillig 919: # define MAKE_RCSID_CONCAT(x, y) CONCAT(x, y)
920: # define MAKE_RCSID(id) static volatile char \
1.238 rillig 921: MAKE_RCSID_CONCAT(rcsid_, __COUNTER__)[] = id
1.220 rillig 922: #elif defined(MAKE_ALL_IN_ONE)
1.249 rillig 923: # define MAKE_RCSID(id) extern void do_not_define_rcsid(void)
1.142 rillig 924: #else
1.249 rillig 925: # define MAKE_RCSID(id) static volatile char rcsid[] = id
1.142 rillig 926: #endif
927:
1.276 rillig 928: #endif
CVSweb <webmaster@jp.NetBSD.org>