~ubuntu-branches/ubuntu/trusty/bmake/trusty-proposed

« back to all changes in this revision

Viewing changes to make.h

  • Committer: Package Import Robot
  • Author(s): Andrew Shadura
  • Date: 2013-09-22 16:07:33 UTC
  • Revision ID: package-import@ubuntu.com-20130922160733-9cvmsi7z0jswtrbi
Tags: upstream-20130904
ImportĀ upstreamĀ versionĀ 20130904

Show diffs side-by-side

added added

removed removed

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