home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 May / W2KPRK.iso / apps / posix / source / MAKE / MAKE.H < prev    next >
C/C++ Source or Header  |  1999-11-17  |  15KB  |  347 lines

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