1*3955d011SMarcel Moolenaar /* $NetBSD: make.h,v 1.89 2012/06/12 19:21:51 joerg Exp $ */ 2*3955d011SMarcel Moolenaar 3*3955d011SMarcel Moolenaar /* 4*3955d011SMarcel Moolenaar * Copyright (c) 1988, 1989, 1990, 1993 5*3955d011SMarcel Moolenaar * The Regents of the University of California. All rights reserved. 6*3955d011SMarcel Moolenaar * 7*3955d011SMarcel Moolenaar * This code is derived from software contributed to Berkeley by 8*3955d011SMarcel Moolenaar * Adam de Boor. 9*3955d011SMarcel Moolenaar * 10*3955d011SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 11*3955d011SMarcel Moolenaar * modification, are permitted provided that the following conditions 12*3955d011SMarcel Moolenaar * are met: 13*3955d011SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 14*3955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 15*3955d011SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 16*3955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 17*3955d011SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 18*3955d011SMarcel Moolenaar * 3. Neither the name of the University nor the names of its contributors 19*3955d011SMarcel Moolenaar * may be used to endorse or promote products derived from this software 20*3955d011SMarcel Moolenaar * without specific prior written permission. 21*3955d011SMarcel Moolenaar * 22*3955d011SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23*3955d011SMarcel Moolenaar * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24*3955d011SMarcel Moolenaar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25*3955d011SMarcel Moolenaar * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26*3955d011SMarcel Moolenaar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27*3955d011SMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28*3955d011SMarcel Moolenaar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29*3955d011SMarcel Moolenaar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30*3955d011SMarcel Moolenaar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31*3955d011SMarcel Moolenaar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32*3955d011SMarcel Moolenaar * SUCH DAMAGE. 33*3955d011SMarcel Moolenaar * 34*3955d011SMarcel Moolenaar * from: @(#)make.h 8.3 (Berkeley) 6/13/95 35*3955d011SMarcel Moolenaar */ 36*3955d011SMarcel Moolenaar 37*3955d011SMarcel Moolenaar /* 38*3955d011SMarcel Moolenaar * Copyright (c) 1989 by Berkeley Softworks 39*3955d011SMarcel Moolenaar * All rights reserved. 40*3955d011SMarcel Moolenaar * 41*3955d011SMarcel Moolenaar * This code is derived from software contributed to Berkeley by 42*3955d011SMarcel Moolenaar * Adam de Boor. 43*3955d011SMarcel Moolenaar * 44*3955d011SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 45*3955d011SMarcel Moolenaar * modification, are permitted provided that the following conditions 46*3955d011SMarcel Moolenaar * are met: 47*3955d011SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 48*3955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 49*3955d011SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 50*3955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 51*3955d011SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 52*3955d011SMarcel Moolenaar * 3. All advertising materials mentioning features or use of this software 53*3955d011SMarcel Moolenaar * must display the following acknowledgement: 54*3955d011SMarcel Moolenaar * This product includes software developed by the University of 55*3955d011SMarcel Moolenaar * California, Berkeley and its contributors. 56*3955d011SMarcel Moolenaar * 4. Neither the name of the University nor the names of its contributors 57*3955d011SMarcel Moolenaar * may be used to endorse or promote products derived from this software 58*3955d011SMarcel Moolenaar * without specific prior written permission. 59*3955d011SMarcel Moolenaar * 60*3955d011SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 61*3955d011SMarcel Moolenaar * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 62*3955d011SMarcel Moolenaar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 63*3955d011SMarcel Moolenaar * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 64*3955d011SMarcel Moolenaar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 65*3955d011SMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 66*3955d011SMarcel Moolenaar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 67*3955d011SMarcel Moolenaar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 68*3955d011SMarcel Moolenaar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 69*3955d011SMarcel Moolenaar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 70*3955d011SMarcel Moolenaar * SUCH DAMAGE. 71*3955d011SMarcel Moolenaar * 72*3955d011SMarcel Moolenaar * from: @(#)make.h 8.3 (Berkeley) 6/13/95 73*3955d011SMarcel Moolenaar */ 74*3955d011SMarcel Moolenaar 75*3955d011SMarcel Moolenaar /*- 76*3955d011SMarcel Moolenaar * make.h -- 77*3955d011SMarcel Moolenaar * The global definitions for pmake 78*3955d011SMarcel Moolenaar */ 79*3955d011SMarcel Moolenaar 80*3955d011SMarcel Moolenaar #ifndef _MAKE_H_ 81*3955d011SMarcel Moolenaar #define _MAKE_H_ 82*3955d011SMarcel Moolenaar 83*3955d011SMarcel Moolenaar #ifdef HAVE_CONFIG_H 84*3955d011SMarcel Moolenaar # include "config.h" 85*3955d011SMarcel Moolenaar #endif 86*3955d011SMarcel Moolenaar 87*3955d011SMarcel Moolenaar #include <sys/types.h> 88*3955d011SMarcel Moolenaar #include <sys/param.h> 89*3955d011SMarcel Moolenaar 90*3955d011SMarcel Moolenaar #include <ctype.h> 91*3955d011SMarcel Moolenaar #include <stdio.h> 92*3955d011SMarcel Moolenaar #include <stdlib.h> 93*3955d011SMarcel Moolenaar #ifdef HAVE_STRING_H 94*3955d011SMarcel Moolenaar #include <string.h> 95*3955d011SMarcel Moolenaar #else 96*3955d011SMarcel Moolenaar #include <strings.h> 97*3955d011SMarcel Moolenaar #endif 98*3955d011SMarcel Moolenaar #include <unistd.h> 99*3955d011SMarcel Moolenaar #include <sys/cdefs.h> 100*3955d011SMarcel Moolenaar 101*3955d011SMarcel Moolenaar #if defined(__GNUC__) 102*3955d011SMarcel Moolenaar #define MAKE_GNUC_PREREQ(x, y) \ 103*3955d011SMarcel Moolenaar ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \ 104*3955d011SMarcel Moolenaar (__GNUC__ > (x))) 105*3955d011SMarcel Moolenaar #else /* defined(__GNUC__) */ 106*3955d011SMarcel Moolenaar #define MAKE_GNUC_PREREQx, y) 0 107*3955d011SMarcel Moolenaar #endif /* defined(__GNUC__) */ 108*3955d011SMarcel Moolenaar 109*3955d011SMarcel Moolenaar #if MAKE_GNUC_PREREQ(2, 7) 110*3955d011SMarcel Moolenaar #define MAKE_ATTR_UNUSED __attribute__((__unused__)) 111*3955d011SMarcel Moolenaar #else 112*3955d011SMarcel Moolenaar #define MAKE_ATTR_UNUSED /* delete */ 113*3955d011SMarcel Moolenaar #endif 114*3955d011SMarcel Moolenaar 115*3955d011SMarcel Moolenaar #if MAKE_GNUC_PREREQ(2, 5) 116*3955d011SMarcel Moolenaar #define MAKE_ATTR_DEAD __attribute__((__noreturn__)) 117*3955d011SMarcel Moolenaar #elif defined(__GNUC__) 118*3955d011SMarcel Moolenaar #define MAKE_ATTR_DEAD __volatile 119*3955d011SMarcel Moolenaar #else 120*3955d011SMarcel Moolenaar #define MAKE_ATTR_DEAD /* delete */ 121*3955d011SMarcel Moolenaar #endif 122*3955d011SMarcel Moolenaar 123*3955d011SMarcel Moolenaar #if MAKE_GNUC_PREREQ(2, 7) 124*3955d011SMarcel Moolenaar #define MAKE_ATTR_PRINTFLIKE(fmtarg, firstvararg) \ 125*3955d011SMarcel Moolenaar __attribute__((__format__ (__printf__, fmtarg, firstvararg))) 126*3955d011SMarcel Moolenaar #else 127*3955d011SMarcel Moolenaar #define MAKE_ATTR_PRINTFLIKE(fmtarg, firstvararg) /* delete */ 128*3955d011SMarcel Moolenaar #endif 129*3955d011SMarcel Moolenaar 130*3955d011SMarcel Moolenaar #include "sprite.h" 131*3955d011SMarcel Moolenaar #include "lst.h" 132*3955d011SMarcel Moolenaar #include "hash.h" 133*3955d011SMarcel Moolenaar #include "make-conf.h" 134*3955d011SMarcel Moolenaar #include "buf.h" 135*3955d011SMarcel Moolenaar #include "make_malloc.h" 136*3955d011SMarcel Moolenaar 137*3955d011SMarcel Moolenaar /* 138*3955d011SMarcel Moolenaar * some vendors don't have this --sjg 139*3955d011SMarcel Moolenaar */ 140*3955d011SMarcel Moolenaar #if defined(S_IFDIR) && !defined(S_ISDIR) 141*3955d011SMarcel Moolenaar # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 142*3955d011SMarcel Moolenaar #endif 143*3955d011SMarcel Moolenaar 144*3955d011SMarcel Moolenaar #if defined(sun) && (defined(__svr4__) || defined(__SVR4)) 145*3955d011SMarcel Moolenaar #define POSIX_SIGNALS 146*3955d011SMarcel Moolenaar #endif 147*3955d011SMarcel Moolenaar 148*3955d011SMarcel Moolenaar /*- 149*3955d011SMarcel Moolenaar * The structure for an individual graph node. Each node has several 150*3955d011SMarcel Moolenaar * pieces of data associated with it. 151*3955d011SMarcel Moolenaar * 1) the name of the target it describes 152*3955d011SMarcel Moolenaar * 2) the location of the target file in the file system. 153*3955d011SMarcel Moolenaar * 3) the type of operator used to define its sources (qv. parse.c) 154*3955d011SMarcel Moolenaar * 4) whether it is involved in this invocation of make 155*3955d011SMarcel Moolenaar * 5) whether the target has been remade 156*3955d011SMarcel Moolenaar * 6) whether any of its children has been remade 157*3955d011SMarcel Moolenaar * 7) the number of its children that are, as yet, unmade 158*3955d011SMarcel Moolenaar * 8) its modification time 159*3955d011SMarcel Moolenaar * 9) the modification time of its youngest child (qv. make.c) 160*3955d011SMarcel Moolenaar * 10) a list of nodes for which this is a source (parents) 161*3955d011SMarcel Moolenaar * 11) a list of nodes on which this depends (children) 162*3955d011SMarcel Moolenaar * 12) a list of nodes that depend on this, as gleaned from the 163*3955d011SMarcel Moolenaar * transformation rules (iParents) 164*3955d011SMarcel Moolenaar * 13) a list of ancestor nodes, which includes parents, iParents, 165*3955d011SMarcel Moolenaar * and recursive parents of parents 166*3955d011SMarcel Moolenaar * 14) a list of nodes of the same name created by the :: operator 167*3955d011SMarcel Moolenaar * 15) a list of nodes that must be made (if they're made) before 168*3955d011SMarcel Moolenaar * this node can be, but that do not enter into the datedness of 169*3955d011SMarcel Moolenaar * this node. 170*3955d011SMarcel Moolenaar * 16) a list of nodes that must be made (if they're made) before 171*3955d011SMarcel Moolenaar * this node or any child of this node can be, but that do not 172*3955d011SMarcel Moolenaar * enter into the datedness of this node. 173*3955d011SMarcel Moolenaar * 17) a list of nodes that must be made (if they're made) after 174*3955d011SMarcel Moolenaar * this node is, but that do not depend on this node, in the 175*3955d011SMarcel Moolenaar * normal sense. 176*3955d011SMarcel Moolenaar * 18) a Lst of ``local'' variables that are specific to this target 177*3955d011SMarcel Moolenaar * and this target only (qv. var.c [$@ $< $?, etc.]) 178*3955d011SMarcel Moolenaar * 19) a Lst of strings that are commands to be given to a shell 179*3955d011SMarcel Moolenaar * to create this target. 180*3955d011SMarcel Moolenaar */ 181*3955d011SMarcel Moolenaar typedef struct GNode { 182*3955d011SMarcel Moolenaar char *name; /* The target's name */ 183*3955d011SMarcel Moolenaar char *uname; /* The unexpanded name of a .USE node */ 184*3955d011SMarcel Moolenaar char *path; /* The full pathname of the file */ 185*3955d011SMarcel Moolenaar int type; /* Its type (see the OP flags, below) */ 186*3955d011SMarcel Moolenaar 187*3955d011SMarcel Moolenaar int flags; 188*3955d011SMarcel Moolenaar #define REMAKE 0x1 /* this target needs to be (re)made */ 189*3955d011SMarcel Moolenaar #define CHILDMADE 0x2 /* children of this target were made */ 190*3955d011SMarcel Moolenaar #define FORCE 0x4 /* children don't exist, and we pretend made */ 191*3955d011SMarcel Moolenaar #define DONE_WAIT 0x8 /* Set by Make_ProcessWait() */ 192*3955d011SMarcel Moolenaar #define DONE_ORDER 0x10 /* Build requested by .ORDER processing */ 193*3955d011SMarcel Moolenaar #define FROM_DEPEND 0x20 /* Node created from .depend */ 194*3955d011SMarcel Moolenaar #define DONE_ALLSRC 0x40 /* We do it once only */ 195*3955d011SMarcel Moolenaar #define CYCLE 0x1000 /* Used by MakePrintStatus */ 196*3955d011SMarcel Moolenaar #define DONECYCLE 0x2000 /* Used by MakePrintStatus */ 197*3955d011SMarcel Moolenaar enum enum_made { 198*3955d011SMarcel Moolenaar UNMADE, DEFERRED, REQUESTED, BEINGMADE, 199*3955d011SMarcel Moolenaar MADE, UPTODATE, ERROR, ABORTED 200*3955d011SMarcel Moolenaar } made; /* Set to reflect the state of processing 201*3955d011SMarcel Moolenaar * on this node: 202*3955d011SMarcel Moolenaar * UNMADE - Not examined yet 203*3955d011SMarcel Moolenaar * DEFERRED - Examined once (building child) 204*3955d011SMarcel Moolenaar * REQUESTED - on toBeMade list 205*3955d011SMarcel Moolenaar * BEINGMADE - Target is already being made. 206*3955d011SMarcel Moolenaar * Indicates a cycle in the graph. 207*3955d011SMarcel Moolenaar * MADE - Was out-of-date and has been made 208*3955d011SMarcel Moolenaar * UPTODATE - Was already up-to-date 209*3955d011SMarcel Moolenaar * ERROR - An error occurred while it was being 210*3955d011SMarcel Moolenaar * made (used only in compat mode) 211*3955d011SMarcel Moolenaar * ABORTED - The target was aborted due to 212*3955d011SMarcel Moolenaar * an error making an inferior (compat). 213*3955d011SMarcel Moolenaar */ 214*3955d011SMarcel Moolenaar int unmade; /* The number of unmade children */ 215*3955d011SMarcel Moolenaar 216*3955d011SMarcel Moolenaar time_t mtime; /* Its modification time */ 217*3955d011SMarcel Moolenaar struct GNode *cmgn; /* The youngest child */ 218*3955d011SMarcel Moolenaar 219*3955d011SMarcel Moolenaar Lst iParents; /* Links to parents for which this is an 220*3955d011SMarcel Moolenaar * implied source, if any */ 221*3955d011SMarcel Moolenaar Lst cohorts; /* Other nodes for the :: operator */ 222*3955d011SMarcel Moolenaar Lst parents; /* Nodes that depend on this one */ 223*3955d011SMarcel Moolenaar Lst children; /* Nodes on which this one depends */ 224*3955d011SMarcel Moolenaar Lst order_pred; /* .ORDER nodes we need made */ 225*3955d011SMarcel Moolenaar Lst order_succ; /* .ORDER nodes who need us */ 226*3955d011SMarcel Moolenaar 227*3955d011SMarcel Moolenaar char cohort_num[8]; /* #n for this cohort */ 228*3955d011SMarcel Moolenaar int unmade_cohorts;/* # of unmade instances on the 229*3955d011SMarcel Moolenaar cohorts list */ 230*3955d011SMarcel Moolenaar struct GNode *centurion; /* Pointer to the first instance of a :: 231*3955d011SMarcel Moolenaar node; only set when on a cohorts list */ 232*3955d011SMarcel Moolenaar unsigned int checked; /* Last time we tried to makle this node */ 233*3955d011SMarcel Moolenaar 234*3955d011SMarcel Moolenaar Hash_Table context; /* The local variables */ 235*3955d011SMarcel Moolenaar Lst commands; /* Creation commands */ 236*3955d011SMarcel Moolenaar 237*3955d011SMarcel Moolenaar struct _Suff *suffix; /* Suffix for the node (determined by 238*3955d011SMarcel Moolenaar * Suff_FindDeps and opaque to everyone 239*3955d011SMarcel Moolenaar * but the Suff module) */ 240*3955d011SMarcel Moolenaar const char *fname; /* filename where the GNode got defined */ 241*3955d011SMarcel Moolenaar int lineno; /* line number where the GNode got defined */ 242*3955d011SMarcel Moolenaar } GNode; 243*3955d011SMarcel Moolenaar 244*3955d011SMarcel Moolenaar /* 245*3955d011SMarcel Moolenaar * The OP_ constants are used when parsing a dependency line as a way of 246*3955d011SMarcel Moolenaar * communicating to other parts of the program the way in which a target 247*3955d011SMarcel Moolenaar * should be made. These constants are bitwise-OR'ed together and 248*3955d011SMarcel Moolenaar * placed in the 'type' field of each node. Any node that has 249*3955d011SMarcel Moolenaar * a 'type' field which satisfies the OP_NOP function was never never on 250*3955d011SMarcel Moolenaar * the lefthand side of an operator, though it may have been on the 251*3955d011SMarcel Moolenaar * righthand side... 252*3955d011SMarcel Moolenaar */ 253*3955d011SMarcel Moolenaar #define OP_DEPENDS 0x00000001 /* Execution of commands depends on 254*3955d011SMarcel Moolenaar * kids (:) */ 255*3955d011SMarcel Moolenaar #define OP_FORCE 0x00000002 /* Always execute commands (!) */ 256*3955d011SMarcel Moolenaar #define OP_DOUBLEDEP 0x00000004 /* Execution of commands depends on kids 257*3955d011SMarcel Moolenaar * per line (::) */ 258*3955d011SMarcel Moolenaar #define OP_OPMASK (OP_DEPENDS|OP_FORCE|OP_DOUBLEDEP) 259*3955d011SMarcel Moolenaar 260*3955d011SMarcel Moolenaar #define OP_OPTIONAL 0x00000008 /* Don't care if the target doesn't 261*3955d011SMarcel Moolenaar * exist and can't be created */ 262*3955d011SMarcel Moolenaar #define OP_USE 0x00000010 /* Use associated commands for parents */ 263*3955d011SMarcel Moolenaar #define OP_EXEC 0x00000020 /* Target is never out of date, but always 264*3955d011SMarcel Moolenaar * execute commands anyway. Its time 265*3955d011SMarcel Moolenaar * doesn't matter, so it has none...sort 266*3955d011SMarcel Moolenaar * of */ 267*3955d011SMarcel Moolenaar #define OP_IGNORE 0x00000040 /* Ignore errors when creating the node */ 268*3955d011SMarcel Moolenaar #define OP_PRECIOUS 0x00000080 /* Don't remove the target when 269*3955d011SMarcel Moolenaar * interrupted */ 270*3955d011SMarcel Moolenaar #define OP_SILENT 0x00000100 /* Don't echo commands when executed */ 271*3955d011SMarcel Moolenaar #define OP_MAKE 0x00000200 /* Target is a recursive make so its 272*3955d011SMarcel Moolenaar * commands should always be executed when 273*3955d011SMarcel Moolenaar * it is out of date, regardless of the 274*3955d011SMarcel Moolenaar * state of the -n or -t flags */ 275*3955d011SMarcel Moolenaar #define OP_JOIN 0x00000400 /* Target is out-of-date only if any of its 276*3955d011SMarcel Moolenaar * children was out-of-date */ 277*3955d011SMarcel Moolenaar #define OP_MADE 0x00000800 /* Assume the children of the node have 278*3955d011SMarcel Moolenaar * been already made */ 279*3955d011SMarcel Moolenaar #define OP_SPECIAL 0x00001000 /* Special .BEGIN, .END, .INTERRUPT */ 280*3955d011SMarcel Moolenaar #define OP_USEBEFORE 0x00002000 /* Like .USE, only prepend commands */ 281*3955d011SMarcel Moolenaar #define OP_INVISIBLE 0x00004000 /* The node is invisible to its parents. 282*3955d011SMarcel Moolenaar * I.e. it doesn't show up in the parents's 283*3955d011SMarcel Moolenaar * local variables. */ 284*3955d011SMarcel Moolenaar #define OP_NOTMAIN 0x00008000 /* The node is exempt from normal 'main 285*3955d011SMarcel Moolenaar * target' processing in parse.c */ 286*3955d011SMarcel Moolenaar #define OP_PHONY 0x00010000 /* Not a file target; run always */ 287*3955d011SMarcel Moolenaar #define OP_NOPATH 0x00020000 /* Don't search for file in the path */ 288*3955d011SMarcel Moolenaar #define OP_WAIT 0x00040000 /* .WAIT phony node */ 289*3955d011SMarcel Moolenaar #define OP_NOMETA 0x00080000 /* .NOMETA do not create a .meta file */ 290*3955d011SMarcel Moolenaar #define OP_META 0x00100000 /* .META we _do_ want a .meta file */ 291*3955d011SMarcel Moolenaar #define OP_NOMETA_CMP 0x00200000 /* Do not compare commands in .meta file */ 292*3955d011SMarcel Moolenaar /* Attributes applied by PMake */ 293*3955d011SMarcel Moolenaar #define OP_TRANSFORM 0x80000000 /* The node is a transformation rule */ 294*3955d011SMarcel Moolenaar #define OP_MEMBER 0x40000000 /* Target is a member of an archive */ 295*3955d011SMarcel Moolenaar #define OP_LIB 0x20000000 /* Target is a library */ 296*3955d011SMarcel Moolenaar #define OP_ARCHV 0x10000000 /* Target is an archive construct */ 297*3955d011SMarcel Moolenaar #define OP_HAS_COMMANDS 0x08000000 /* Target has all the commands it should. 298*3955d011SMarcel Moolenaar * Used when parsing to catch multiple 299*3955d011SMarcel Moolenaar * commands for a target */ 300*3955d011SMarcel Moolenaar #define OP_SAVE_CMDS 0x04000000 /* Saving commands on .END (Compat) */ 301*3955d011SMarcel Moolenaar #define OP_DEPS_FOUND 0x02000000 /* Already processed by Suff_FindDeps */ 302*3955d011SMarcel Moolenaar #define OP_MARK 0x01000000 /* Node found while expanding .ALLSRC */ 303*3955d011SMarcel Moolenaar 304*3955d011SMarcel Moolenaar #define NoExecute(gn) ((gn->type & OP_MAKE) ? noRecursiveExecute : noExecute) 305*3955d011SMarcel Moolenaar /* 306*3955d011SMarcel Moolenaar * OP_NOP will return TRUE if the node with the given type was not the 307*3955d011SMarcel Moolenaar * object of a dependency operator 308*3955d011SMarcel Moolenaar */ 309*3955d011SMarcel Moolenaar #define OP_NOP(t) (((t) & OP_OPMASK) == 0x00000000) 310*3955d011SMarcel Moolenaar 311*3955d011SMarcel Moolenaar #define OP_NOTARGET (OP_NOTMAIN|OP_USE|OP_EXEC|OP_TRANSFORM) 312*3955d011SMarcel Moolenaar 313*3955d011SMarcel Moolenaar /* 314*3955d011SMarcel Moolenaar * The TARG_ constants are used when calling the Targ_FindNode and 315*3955d011SMarcel Moolenaar * Targ_FindList functions in targ.c. They simply tell the functions what to 316*3955d011SMarcel Moolenaar * do if the desired node(s) is (are) not found. If the TARG_CREATE constant 317*3955d011SMarcel Moolenaar * is given, a new, empty node will be created for the target, placed in the 318*3955d011SMarcel Moolenaar * table of all targets and its address returned. If TARG_NOCREATE is given, 319*3955d011SMarcel Moolenaar * a NULL pointer will be returned. 320*3955d011SMarcel Moolenaar */ 321*3955d011SMarcel Moolenaar #define TARG_NOCREATE 0x00 /* don't create it */ 322*3955d011SMarcel Moolenaar #define TARG_CREATE 0x01 /* create node if not found */ 323*3955d011SMarcel Moolenaar #define TARG_NOHASH 0x02 /* don't look in/add to hash table */ 324*3955d011SMarcel Moolenaar 325*3955d011SMarcel Moolenaar /* 326*3955d011SMarcel Moolenaar * These constants are all used by the Str_Concat function to decide how the 327*3955d011SMarcel Moolenaar * final string should look. If STR_ADDSPACE is given, a space will be 328*3955d011SMarcel Moolenaar * placed between the two strings. If STR_ADDSLASH is given, a '/' will 329*3955d011SMarcel Moolenaar * be used instead of a space. If neither is given, no intervening characters 330*3955d011SMarcel Moolenaar * will be placed between the two strings in the final output. If the 331*3955d011SMarcel Moolenaar * STR_DOFREE bit is set, the two input strings will be freed before 332*3955d011SMarcel Moolenaar * Str_Concat returns. 333*3955d011SMarcel Moolenaar */ 334*3955d011SMarcel Moolenaar #define STR_ADDSPACE 0x01 /* add a space when Str_Concat'ing */ 335*3955d011SMarcel Moolenaar #define STR_ADDSLASH 0x02 /* add a slash when Str_Concat'ing */ 336*3955d011SMarcel Moolenaar 337*3955d011SMarcel Moolenaar /* 338*3955d011SMarcel Moolenaar * Error levels for parsing. PARSE_FATAL means the process cannot continue 339*3955d011SMarcel Moolenaar * once the makefile has been parsed. PARSE_WARNING means it can. Passed 340*3955d011SMarcel Moolenaar * as the first argument to Parse_Error. 341*3955d011SMarcel Moolenaar */ 342*3955d011SMarcel Moolenaar #define PARSE_WARNING 2 343*3955d011SMarcel Moolenaar #define PARSE_FATAL 1 344*3955d011SMarcel Moolenaar 345*3955d011SMarcel Moolenaar /* 346*3955d011SMarcel Moolenaar * Values returned by Cond_Eval. 347*3955d011SMarcel Moolenaar */ 348*3955d011SMarcel Moolenaar #define COND_PARSE 0 /* Parse the next lines */ 349*3955d011SMarcel Moolenaar #define COND_SKIP 1 /* Skip the next lines */ 350*3955d011SMarcel Moolenaar #define COND_INVALID 2 /* Not a conditional statement */ 351*3955d011SMarcel Moolenaar 352*3955d011SMarcel Moolenaar /* 353*3955d011SMarcel Moolenaar * Definitions for the "local" variables. Used only for clarity. 354*3955d011SMarcel Moolenaar */ 355*3955d011SMarcel Moolenaar #define TARGET "@" /* Target of dependency */ 356*3955d011SMarcel Moolenaar #define OODATE "?" /* All out-of-date sources */ 357*3955d011SMarcel Moolenaar #define ALLSRC ">" /* All sources */ 358*3955d011SMarcel Moolenaar #define IMPSRC "<" /* Source implied by transformation */ 359*3955d011SMarcel Moolenaar #define PREFIX "*" /* Common prefix */ 360*3955d011SMarcel Moolenaar #define ARCHIVE "!" /* Archive in "archive(member)" syntax */ 361*3955d011SMarcel Moolenaar #define MEMBER "%" /* Member in "archive(member)" syntax */ 362*3955d011SMarcel Moolenaar 363*3955d011SMarcel Moolenaar #define FTARGET "@F" /* file part of TARGET */ 364*3955d011SMarcel Moolenaar #define DTARGET "@D" /* directory part of TARGET */ 365*3955d011SMarcel Moolenaar #define FIMPSRC "<F" /* file part of IMPSRC */ 366*3955d011SMarcel Moolenaar #define DIMPSRC "<D" /* directory part of IMPSRC */ 367*3955d011SMarcel Moolenaar #define FPREFIX "*F" /* file part of PREFIX */ 368*3955d011SMarcel Moolenaar #define DPREFIX "*D" /* directory part of PREFIX */ 369*3955d011SMarcel Moolenaar 370*3955d011SMarcel Moolenaar /* 371*3955d011SMarcel Moolenaar * Global Variables 372*3955d011SMarcel Moolenaar */ 373*3955d011SMarcel Moolenaar extern Lst create; /* The list of target names specified on the 374*3955d011SMarcel Moolenaar * command line. used to resolve #if 375*3955d011SMarcel Moolenaar * make(...) statements */ 376*3955d011SMarcel Moolenaar extern Lst dirSearchPath; /* The list of directories to search when 377*3955d011SMarcel Moolenaar * looking for targets */ 378*3955d011SMarcel Moolenaar 379*3955d011SMarcel Moolenaar extern Boolean compatMake; /* True if we are make compatible */ 380*3955d011SMarcel Moolenaar extern Boolean ignoreErrors; /* True if should ignore all errors */ 381*3955d011SMarcel Moolenaar extern Boolean beSilent; /* True if should print no commands */ 382*3955d011SMarcel Moolenaar extern Boolean noExecute; /* True if should execute nothing */ 383*3955d011SMarcel Moolenaar extern Boolean noRecursiveExecute; /* True if should execute nothing */ 384*3955d011SMarcel Moolenaar extern Boolean allPrecious; /* True if every target is precious */ 385*3955d011SMarcel Moolenaar extern Boolean keepgoing; /* True if should continue on unaffected 386*3955d011SMarcel Moolenaar * portions of the graph when have an error 387*3955d011SMarcel Moolenaar * in one portion */ 388*3955d011SMarcel Moolenaar extern Boolean touchFlag; /* TRUE if targets should just be 'touched' 389*3955d011SMarcel Moolenaar * if out of date. Set by the -t flag */ 390*3955d011SMarcel Moolenaar extern Boolean queryFlag; /* TRUE if we aren't supposed to really make 391*3955d011SMarcel Moolenaar * anything, just see if the targets are out- 392*3955d011SMarcel Moolenaar * of-date */ 393*3955d011SMarcel Moolenaar extern Boolean doing_depend; /* TRUE if processing .depend */ 394*3955d011SMarcel Moolenaar 395*3955d011SMarcel Moolenaar extern Boolean checkEnvFirst; /* TRUE if environment should be searched for 396*3955d011SMarcel Moolenaar * variables before the global context */ 397*3955d011SMarcel Moolenaar extern Boolean jobServer; /* a jobServer already exists */ 398*3955d011SMarcel Moolenaar 399*3955d011SMarcel Moolenaar extern Boolean parseWarnFatal; /* TRUE if makefile parsing warnings are 400*3955d011SMarcel Moolenaar * treated as errors */ 401*3955d011SMarcel Moolenaar 402*3955d011SMarcel Moolenaar extern Boolean varNoExportEnv; /* TRUE if we should not export variables 403*3955d011SMarcel Moolenaar * set on the command line to the env. */ 404*3955d011SMarcel Moolenaar 405*3955d011SMarcel Moolenaar extern GNode *DEFAULT; /* .DEFAULT rule */ 406*3955d011SMarcel Moolenaar 407*3955d011SMarcel Moolenaar extern GNode *VAR_GLOBAL; /* Variables defined in a global context, e.g 408*3955d011SMarcel Moolenaar * in the Makefile itself */ 409*3955d011SMarcel Moolenaar extern GNode *VAR_CMD; /* Variables defined on the command line */ 410*3955d011SMarcel Moolenaar extern GNode *VAR_FOR; /* Iteration variables */ 411*3955d011SMarcel Moolenaar extern char var_Error[]; /* Value returned by Var_Parse when an error 412*3955d011SMarcel Moolenaar * is encountered. It actually points to 413*3955d011SMarcel Moolenaar * an empty string, so naive callers needn't 414*3955d011SMarcel Moolenaar * worry about it. */ 415*3955d011SMarcel Moolenaar 416*3955d011SMarcel Moolenaar extern time_t now; /* The time at the start of this whole 417*3955d011SMarcel Moolenaar * process */ 418*3955d011SMarcel Moolenaar 419*3955d011SMarcel Moolenaar extern Boolean oldVars; /* Do old-style variable substitution */ 420*3955d011SMarcel Moolenaar 421*3955d011SMarcel Moolenaar extern Lst sysIncPath; /* The system include path. */ 422*3955d011SMarcel Moolenaar extern Lst defIncPath; /* The default include path. */ 423*3955d011SMarcel Moolenaar 424*3955d011SMarcel Moolenaar extern char curdir[]; /* Startup directory */ 425*3955d011SMarcel Moolenaar extern char *progname; /* The program name */ 426*3955d011SMarcel Moolenaar extern char *makeDependfile; /* .depend */ 427*3955d011SMarcel Moolenaar extern char **savedEnv; /* if we replaced environ this will be non-NULL */ 428*3955d011SMarcel Moolenaar 429*3955d011SMarcel Moolenaar /* 430*3955d011SMarcel Moolenaar * We cannot vfork() in a child of vfork(). 431*3955d011SMarcel Moolenaar * Most systems do not enforce this but some do. 432*3955d011SMarcel Moolenaar */ 433*3955d011SMarcel Moolenaar #define vFork() ((getpid() == myPid) ? vfork() : fork()) 434*3955d011SMarcel Moolenaar extern pid_t myPid; 435*3955d011SMarcel Moolenaar 436*3955d011SMarcel Moolenaar #define MAKEFLAGS ".MAKEFLAGS" 437*3955d011SMarcel Moolenaar #define MAKEOVERRIDES ".MAKEOVERRIDES" 438*3955d011SMarcel Moolenaar #define MAKE_JOB_PREFIX ".MAKE.JOB.PREFIX" /* prefix for job target output */ 439*3955d011SMarcel Moolenaar #define MAKE_EXPORTED ".MAKE.EXPORTED" /* variables we export */ 440*3955d011SMarcel Moolenaar #define MAKE_MAKEFILES ".MAKE.MAKEFILES" /* all the makefiles we read */ 441*3955d011SMarcel Moolenaar #define MAKE_LEVEL ".MAKE.LEVEL" /* recursion level */ 442*3955d011SMarcel Moolenaar #define MAKEFILE_PREFERENCE ".MAKE.MAKEFILE_PREFERENCE" 443*3955d011SMarcel Moolenaar #define MAKE_DEPENDFILE ".MAKE.DEPENDFILE" /* .depend */ 444*3955d011SMarcel Moolenaar #define MAKE_MODE ".MAKE.MODE" 445*3955d011SMarcel Moolenaar 446*3955d011SMarcel Moolenaar #ifdef NEED_MAKE_LEVEL_SAFE 447*3955d011SMarcel Moolenaar # define MAKE_LEVEL_SAFE "_MAKE_LEVEL" /* some shells will not pass .MAKE. */ 448*3955d011SMarcel Moolenaar #endif 449*3955d011SMarcel Moolenaar 450*3955d011SMarcel Moolenaar /* 451*3955d011SMarcel Moolenaar * debug control: 452*3955d011SMarcel Moolenaar * There is one bit per module. It is up to the module what debug 453*3955d011SMarcel Moolenaar * information to print. 454*3955d011SMarcel Moolenaar */ 455*3955d011SMarcel Moolenaar FILE *debug_file; /* Output written here - default stdout */ 456*3955d011SMarcel Moolenaar extern int debug; 457*3955d011SMarcel Moolenaar #define DEBUG_ARCH 0x00001 458*3955d011SMarcel Moolenaar #define DEBUG_COND 0x00002 459*3955d011SMarcel Moolenaar #define DEBUG_DIR 0x00004 460*3955d011SMarcel Moolenaar #define DEBUG_GRAPH1 0x00008 461*3955d011SMarcel Moolenaar #define DEBUG_GRAPH2 0x00010 462*3955d011SMarcel Moolenaar #define DEBUG_JOB 0x00020 463*3955d011SMarcel Moolenaar #define DEBUG_MAKE 0x00040 464*3955d011SMarcel Moolenaar #define DEBUG_SUFF 0x00080 465*3955d011SMarcel Moolenaar #define DEBUG_TARG 0x00100 466*3955d011SMarcel Moolenaar #define DEBUG_VAR 0x00200 467*3955d011SMarcel Moolenaar #define DEBUG_FOR 0x00400 468*3955d011SMarcel Moolenaar #define DEBUG_SHELL 0x00800 469*3955d011SMarcel Moolenaar #define DEBUG_ERROR 0x01000 470*3955d011SMarcel Moolenaar #define DEBUG_LOUD 0x02000 471*3955d011SMarcel Moolenaar #define DEBUG_META 0x04000 472*3955d011SMarcel Moolenaar 473*3955d011SMarcel Moolenaar #define DEBUG_GRAPH3 0x10000 474*3955d011SMarcel Moolenaar #define DEBUG_SCRIPT 0x20000 475*3955d011SMarcel Moolenaar #define DEBUG_PARSE 0x40000 476*3955d011SMarcel Moolenaar #define DEBUG_CWD 0x80000 477*3955d011SMarcel Moolenaar 478*3955d011SMarcel Moolenaar #define CONCAT(a,b) a##b 479*3955d011SMarcel Moolenaar 480*3955d011SMarcel Moolenaar #define DEBUG(module) (debug & CONCAT(DEBUG_,module)) 481*3955d011SMarcel Moolenaar 482*3955d011SMarcel Moolenaar #include "nonints.h" 483*3955d011SMarcel Moolenaar 484*3955d011SMarcel Moolenaar int Make_TimeStamp(GNode *, GNode *); 485*3955d011SMarcel Moolenaar Boolean Make_OODate(GNode *); 486*3955d011SMarcel Moolenaar void Make_ExpandUse(Lst); 487*3955d011SMarcel Moolenaar time_t Make_Recheck(GNode *); 488*3955d011SMarcel Moolenaar void Make_HandleUse(GNode *, GNode *); 489*3955d011SMarcel Moolenaar void Make_Update(GNode *); 490*3955d011SMarcel Moolenaar void Make_DoAllVar(GNode *); 491*3955d011SMarcel Moolenaar Boolean Make_Run(Lst); 492*3955d011SMarcel Moolenaar char * Check_Cwd_Cmd(const char *); 493*3955d011SMarcel Moolenaar void Check_Cwd(const char **); 494*3955d011SMarcel Moolenaar void PrintOnError(GNode *, const char *); 495*3955d011SMarcel Moolenaar void Main_ExportMAKEFLAGS(Boolean); 496*3955d011SMarcel Moolenaar Boolean Main_SetObjdir(const char *); 497*3955d011SMarcel Moolenaar int mkTempFile(const char *, char **); 498*3955d011SMarcel Moolenaar int str2Lst_Append(Lst, char *, const char *); 499*3955d011SMarcel Moolenaar 500*3955d011SMarcel Moolenaar #ifdef __GNUC__ 501*3955d011SMarcel Moolenaar #define UNCONST(ptr) ({ \ 502*3955d011SMarcel Moolenaar union __unconst { \ 503*3955d011SMarcel Moolenaar const void *__cp; \ 504*3955d011SMarcel Moolenaar void *__p; \ 505*3955d011SMarcel Moolenaar } __d; \ 506*3955d011SMarcel Moolenaar __d.__cp = ptr, __d.__p; }) 507*3955d011SMarcel Moolenaar #else 508*3955d011SMarcel Moolenaar #define UNCONST(ptr) (void *)(ptr) 509*3955d011SMarcel Moolenaar #endif 510*3955d011SMarcel Moolenaar 511*3955d011SMarcel Moolenaar #ifndef MIN 512*3955d011SMarcel Moolenaar #define MIN(a, b) ((a < b) ? a : b) 513*3955d011SMarcel Moolenaar #endif 514*3955d011SMarcel Moolenaar #ifndef MAX 515*3955d011SMarcel Moolenaar #define MAX(a, b) ((a > b) ? a : b) 516*3955d011SMarcel Moolenaar #endif 517*3955d011SMarcel Moolenaar 518*3955d011SMarcel Moolenaar #endif /* _MAKE_H_ */ 519