[BACK]Return to make.h CVS log [TXT][DIR] Up to [local] / src / usr.bin / make

Annotation of src/usr.bin/make/make.h, Revision 1.1

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