1*1bbe5942SSimon J. Gerraty /* $NetBSD: make.h,v 1.92 2013/09/04 15:38:26 sjg Exp $ */ 23955d011SMarcel Moolenaar 33955d011SMarcel Moolenaar /* 43955d011SMarcel Moolenaar * Copyright (c) 1988, 1989, 1990, 1993 53955d011SMarcel Moolenaar * The Regents of the University of California. All rights reserved. 63955d011SMarcel Moolenaar * 73955d011SMarcel Moolenaar * This code is derived from software contributed to Berkeley by 83955d011SMarcel Moolenaar * Adam de Boor. 93955d011SMarcel Moolenaar * 103955d011SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 113955d011SMarcel Moolenaar * modification, are permitted provided that the following conditions 123955d011SMarcel Moolenaar * are met: 133955d011SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 143955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 153955d011SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 163955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 173955d011SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 183955d011SMarcel Moolenaar * 3. Neither the name of the University nor the names of its contributors 193955d011SMarcel Moolenaar * may be used to endorse or promote products derived from this software 203955d011SMarcel Moolenaar * without specific prior written permission. 213955d011SMarcel Moolenaar * 223955d011SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 233955d011SMarcel Moolenaar * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 243955d011SMarcel Moolenaar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 253955d011SMarcel Moolenaar * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 263955d011SMarcel Moolenaar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 273955d011SMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 283955d011SMarcel Moolenaar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 293955d011SMarcel Moolenaar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 303955d011SMarcel Moolenaar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 313955d011SMarcel Moolenaar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 323955d011SMarcel Moolenaar * SUCH DAMAGE. 333955d011SMarcel Moolenaar * 343955d011SMarcel Moolenaar * from: @(#)make.h 8.3 (Berkeley) 6/13/95 353955d011SMarcel Moolenaar */ 363955d011SMarcel Moolenaar 373955d011SMarcel Moolenaar /* 383955d011SMarcel Moolenaar * Copyright (c) 1989 by Berkeley Softworks 393955d011SMarcel Moolenaar * All rights reserved. 403955d011SMarcel Moolenaar * 413955d011SMarcel Moolenaar * This code is derived from software contributed to Berkeley by 423955d011SMarcel Moolenaar * Adam de Boor. 433955d011SMarcel Moolenaar * 443955d011SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 453955d011SMarcel Moolenaar * modification, are permitted provided that the following conditions 463955d011SMarcel Moolenaar * are met: 473955d011SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 483955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 493955d011SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 503955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 513955d011SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 523955d011SMarcel Moolenaar * 3. All advertising materials mentioning features or use of this software 533955d011SMarcel Moolenaar * must display the following acknowledgement: 543955d011SMarcel Moolenaar * This product includes software developed by the University of 553955d011SMarcel Moolenaar * California, Berkeley and its contributors. 563955d011SMarcel Moolenaar * 4. Neither the name of the University nor the names of its contributors 573955d011SMarcel Moolenaar * may be used to endorse or promote products derived from this software 583955d011SMarcel Moolenaar * without specific prior written permission. 593955d011SMarcel Moolenaar * 603955d011SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 613955d011SMarcel Moolenaar * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 623955d011SMarcel Moolenaar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 633955d011SMarcel Moolenaar * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 643955d011SMarcel Moolenaar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 653955d011SMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 663955d011SMarcel Moolenaar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 673955d011SMarcel Moolenaar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 683955d011SMarcel Moolenaar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 693955d011SMarcel Moolenaar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 703955d011SMarcel Moolenaar * SUCH DAMAGE. 713955d011SMarcel Moolenaar * 723955d011SMarcel Moolenaar * from: @(#)make.h 8.3 (Berkeley) 6/13/95 733955d011SMarcel Moolenaar */ 743955d011SMarcel Moolenaar 753955d011SMarcel Moolenaar /*- 763955d011SMarcel Moolenaar * make.h -- 773955d011SMarcel Moolenaar * The global definitions for pmake 783955d011SMarcel Moolenaar */ 793955d011SMarcel Moolenaar 803955d011SMarcel Moolenaar #ifndef _MAKE_H_ 813955d011SMarcel Moolenaar #define _MAKE_H_ 823955d011SMarcel Moolenaar 833955d011SMarcel Moolenaar #ifdef HAVE_CONFIG_H 843955d011SMarcel Moolenaar # include "config.h" 853955d011SMarcel Moolenaar #endif 863955d011SMarcel Moolenaar 873955d011SMarcel Moolenaar #include <sys/types.h> 883955d011SMarcel Moolenaar #include <sys/param.h> 893955d011SMarcel Moolenaar 903955d011SMarcel Moolenaar #include <ctype.h> 913955d011SMarcel Moolenaar #include <stdio.h> 923955d011SMarcel Moolenaar #include <stdlib.h> 933955d011SMarcel Moolenaar #ifdef HAVE_STRING_H 943955d011SMarcel Moolenaar #include <string.h> 953955d011SMarcel Moolenaar #else 963955d011SMarcel Moolenaar #include <strings.h> 973955d011SMarcel Moolenaar #endif 983955d011SMarcel Moolenaar #include <unistd.h> 993955d011SMarcel Moolenaar #include <sys/cdefs.h> 1003955d011SMarcel Moolenaar 1013955d011SMarcel Moolenaar #if defined(__GNUC__) 1023955d011SMarcel Moolenaar #define MAKE_GNUC_PREREQ(x, y) \ 1033955d011SMarcel Moolenaar ((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) || \ 1043955d011SMarcel Moolenaar (__GNUC__ > (x))) 1053955d011SMarcel Moolenaar #else /* defined(__GNUC__) */ 1061748de26SSimon J. Gerraty #define MAKE_GNUC_PREREQ(x, y) 0 1073955d011SMarcel Moolenaar #endif /* defined(__GNUC__) */ 1083955d011SMarcel Moolenaar 1093955d011SMarcel Moolenaar #if MAKE_GNUC_PREREQ(2, 7) 1103955d011SMarcel Moolenaar #define MAKE_ATTR_UNUSED __attribute__((__unused__)) 1113955d011SMarcel Moolenaar #else 1123955d011SMarcel Moolenaar #define MAKE_ATTR_UNUSED /* delete */ 1133955d011SMarcel Moolenaar #endif 1143955d011SMarcel Moolenaar 1153955d011SMarcel Moolenaar #if MAKE_GNUC_PREREQ(2, 5) 1163955d011SMarcel Moolenaar #define MAKE_ATTR_DEAD __attribute__((__noreturn__)) 1173955d011SMarcel Moolenaar #elif defined(__GNUC__) 1183955d011SMarcel Moolenaar #define MAKE_ATTR_DEAD __volatile 1193955d011SMarcel Moolenaar #else 1203955d011SMarcel Moolenaar #define MAKE_ATTR_DEAD /* delete */ 1213955d011SMarcel Moolenaar #endif 1223955d011SMarcel Moolenaar 1233955d011SMarcel Moolenaar #if MAKE_GNUC_PREREQ(2, 7) 1243955d011SMarcel Moolenaar #define MAKE_ATTR_PRINTFLIKE(fmtarg, firstvararg) \ 1253955d011SMarcel Moolenaar __attribute__((__format__ (__printf__, fmtarg, firstvararg))) 1263955d011SMarcel Moolenaar #else 1273955d011SMarcel Moolenaar #define MAKE_ATTR_PRINTFLIKE(fmtarg, firstvararg) /* delete */ 1283955d011SMarcel Moolenaar #endif 1293955d011SMarcel Moolenaar 1303955d011SMarcel Moolenaar #include "sprite.h" 1313955d011SMarcel Moolenaar #include "lst.h" 1323955d011SMarcel Moolenaar #include "hash.h" 1333955d011SMarcel Moolenaar #include "make-conf.h" 1343955d011SMarcel Moolenaar #include "buf.h" 1353955d011SMarcel Moolenaar #include "make_malloc.h" 1363955d011SMarcel Moolenaar 1373955d011SMarcel Moolenaar /* 1383955d011SMarcel Moolenaar * some vendors don't have this --sjg 1393955d011SMarcel Moolenaar */ 1403955d011SMarcel Moolenaar #if defined(S_IFDIR) && !defined(S_ISDIR) 1413955d011SMarcel Moolenaar # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 1423955d011SMarcel Moolenaar #endif 1433955d011SMarcel Moolenaar 1443955d011SMarcel Moolenaar #if defined(sun) && (defined(__svr4__) || defined(__SVR4)) 1453955d011SMarcel Moolenaar #define POSIX_SIGNALS 1463955d011SMarcel Moolenaar #endif 1473955d011SMarcel Moolenaar 1483955d011SMarcel Moolenaar /*- 1493955d011SMarcel Moolenaar * The structure for an individual graph node. Each node has several 1503955d011SMarcel Moolenaar * pieces of data associated with it. 1513955d011SMarcel Moolenaar * 1) the name of the target it describes 1523955d011SMarcel Moolenaar * 2) the location of the target file in the file system. 1533955d011SMarcel Moolenaar * 3) the type of operator used to define its sources (qv. parse.c) 1543955d011SMarcel Moolenaar * 4) whether it is involved in this invocation of make 1553955d011SMarcel Moolenaar * 5) whether the target has been remade 1563955d011SMarcel Moolenaar * 6) whether any of its children has been remade 1573955d011SMarcel Moolenaar * 7) the number of its children that are, as yet, unmade 1583955d011SMarcel Moolenaar * 8) its modification time 1593955d011SMarcel Moolenaar * 9) the modification time of its youngest child (qv. make.c) 1603955d011SMarcel Moolenaar * 10) a list of nodes for which this is a source (parents) 1613955d011SMarcel Moolenaar * 11) a list of nodes on which this depends (children) 1623955d011SMarcel Moolenaar * 12) a list of nodes that depend on this, as gleaned from the 1633955d011SMarcel Moolenaar * transformation rules (iParents) 1643955d011SMarcel Moolenaar * 13) a list of ancestor nodes, which includes parents, iParents, 1653955d011SMarcel Moolenaar * and recursive parents of parents 1663955d011SMarcel Moolenaar * 14) a list of nodes of the same name created by the :: operator 1673955d011SMarcel Moolenaar * 15) a list of nodes that must be made (if they're made) before 1683955d011SMarcel Moolenaar * this node can be, but that do not enter into the datedness of 1693955d011SMarcel Moolenaar * this node. 1703955d011SMarcel Moolenaar * 16) a list of nodes that must be made (if they're made) before 1713955d011SMarcel Moolenaar * this node or any child of this node can be, but that do not 1723955d011SMarcel Moolenaar * enter into the datedness of this node. 1733955d011SMarcel Moolenaar * 17) a list of nodes that must be made (if they're made) after 1743955d011SMarcel Moolenaar * this node is, but that do not depend on this node, in the 1753955d011SMarcel Moolenaar * normal sense. 1763955d011SMarcel Moolenaar * 18) a Lst of ``local'' variables that are specific to this target 1773955d011SMarcel Moolenaar * and this target only (qv. var.c [$@ $< $?, etc.]) 1783955d011SMarcel Moolenaar * 19) a Lst of strings that are commands to be given to a shell 1793955d011SMarcel Moolenaar * to create this target. 1803955d011SMarcel Moolenaar */ 1813955d011SMarcel Moolenaar typedef struct GNode { 1823955d011SMarcel Moolenaar char *name; /* The target's name */ 1833955d011SMarcel Moolenaar char *uname; /* The unexpanded name of a .USE node */ 1843955d011SMarcel Moolenaar char *path; /* The full pathname of the file */ 1853955d011SMarcel Moolenaar int type; /* Its type (see the OP flags, below) */ 1863955d011SMarcel Moolenaar 1873955d011SMarcel Moolenaar int flags; 1883955d011SMarcel Moolenaar #define REMAKE 0x1 /* this target needs to be (re)made */ 1893955d011SMarcel Moolenaar #define CHILDMADE 0x2 /* children of this target were made */ 1903955d011SMarcel Moolenaar #define FORCE 0x4 /* children don't exist, and we pretend made */ 1913955d011SMarcel Moolenaar #define DONE_WAIT 0x8 /* Set by Make_ProcessWait() */ 1923955d011SMarcel Moolenaar #define DONE_ORDER 0x10 /* Build requested by .ORDER processing */ 1933955d011SMarcel Moolenaar #define FROM_DEPEND 0x20 /* Node created from .depend */ 1943955d011SMarcel Moolenaar #define DONE_ALLSRC 0x40 /* We do it once only */ 1953955d011SMarcel Moolenaar #define CYCLE 0x1000 /* Used by MakePrintStatus */ 1963955d011SMarcel Moolenaar #define DONECYCLE 0x2000 /* Used by MakePrintStatus */ 1973955d011SMarcel Moolenaar enum enum_made { 1983955d011SMarcel Moolenaar UNMADE, DEFERRED, REQUESTED, BEINGMADE, 1993955d011SMarcel Moolenaar MADE, UPTODATE, ERROR, ABORTED 2003955d011SMarcel Moolenaar } made; /* Set to reflect the state of processing 2013955d011SMarcel Moolenaar * on this node: 2023955d011SMarcel Moolenaar * UNMADE - Not examined yet 2033955d011SMarcel Moolenaar * DEFERRED - Examined once (building child) 2043955d011SMarcel Moolenaar * REQUESTED - on toBeMade list 2053955d011SMarcel Moolenaar * BEINGMADE - Target is already being made. 2063955d011SMarcel Moolenaar * Indicates a cycle in the graph. 2073955d011SMarcel Moolenaar * MADE - Was out-of-date and has been made 2083955d011SMarcel Moolenaar * UPTODATE - Was already up-to-date 2093955d011SMarcel Moolenaar * ERROR - An error occurred while it was being 2103955d011SMarcel Moolenaar * made (used only in compat mode) 2113955d011SMarcel Moolenaar * ABORTED - The target was aborted due to 2123955d011SMarcel Moolenaar * an error making an inferior (compat). 2133955d011SMarcel Moolenaar */ 2143955d011SMarcel Moolenaar int unmade; /* The number of unmade children */ 2153955d011SMarcel Moolenaar 2163955d011SMarcel Moolenaar time_t mtime; /* Its modification time */ 2173955d011SMarcel Moolenaar struct GNode *cmgn; /* The youngest child */ 2183955d011SMarcel Moolenaar 2193955d011SMarcel Moolenaar Lst iParents; /* Links to parents for which this is an 2203955d011SMarcel Moolenaar * implied source, if any */ 2213955d011SMarcel Moolenaar Lst cohorts; /* Other nodes for the :: operator */ 2223955d011SMarcel Moolenaar Lst parents; /* Nodes that depend on this one */ 2233955d011SMarcel Moolenaar Lst children; /* Nodes on which this one depends */ 2243955d011SMarcel Moolenaar Lst order_pred; /* .ORDER nodes we need made */ 2253955d011SMarcel Moolenaar Lst order_succ; /* .ORDER nodes who need us */ 2263955d011SMarcel Moolenaar 2273955d011SMarcel Moolenaar char cohort_num[8]; /* #n for this cohort */ 2283955d011SMarcel Moolenaar int unmade_cohorts;/* # of unmade instances on the 2293955d011SMarcel Moolenaar cohorts list */ 2303955d011SMarcel Moolenaar struct GNode *centurion; /* Pointer to the first instance of a :: 2313955d011SMarcel Moolenaar node; only set when on a cohorts list */ 2323955d011SMarcel Moolenaar unsigned int checked; /* Last time we tried to makle this node */ 2333955d011SMarcel Moolenaar 2343955d011SMarcel Moolenaar Hash_Table context; /* The local variables */ 2353955d011SMarcel Moolenaar Lst commands; /* Creation commands */ 2363955d011SMarcel Moolenaar 2373955d011SMarcel Moolenaar struct _Suff *suffix; /* Suffix for the node (determined by 2383955d011SMarcel Moolenaar * Suff_FindDeps and opaque to everyone 2393955d011SMarcel Moolenaar * but the Suff module) */ 2403955d011SMarcel Moolenaar const char *fname; /* filename where the GNode got defined */ 2413955d011SMarcel Moolenaar int lineno; /* line number where the GNode got defined */ 2423955d011SMarcel Moolenaar } GNode; 2433955d011SMarcel Moolenaar 2443955d011SMarcel Moolenaar /* 2453955d011SMarcel Moolenaar * The OP_ constants are used when parsing a dependency line as a way of 2463955d011SMarcel Moolenaar * communicating to other parts of the program the way in which a target 2473955d011SMarcel Moolenaar * should be made. These constants are bitwise-OR'ed together and 2483955d011SMarcel Moolenaar * placed in the 'type' field of each node. Any node that has 2493955d011SMarcel Moolenaar * a 'type' field which satisfies the OP_NOP function was never never on 2503955d011SMarcel Moolenaar * the lefthand side of an operator, though it may have been on the 2513955d011SMarcel Moolenaar * righthand side... 2523955d011SMarcel Moolenaar */ 2533955d011SMarcel Moolenaar #define OP_DEPENDS 0x00000001 /* Execution of commands depends on 2543955d011SMarcel Moolenaar * kids (:) */ 2553955d011SMarcel Moolenaar #define OP_FORCE 0x00000002 /* Always execute commands (!) */ 2563955d011SMarcel Moolenaar #define OP_DOUBLEDEP 0x00000004 /* Execution of commands depends on kids 2573955d011SMarcel Moolenaar * per line (::) */ 2583955d011SMarcel Moolenaar #define OP_OPMASK (OP_DEPENDS|OP_FORCE|OP_DOUBLEDEP) 2593955d011SMarcel Moolenaar 2603955d011SMarcel Moolenaar #define OP_OPTIONAL 0x00000008 /* Don't care if the target doesn't 2613955d011SMarcel Moolenaar * exist and can't be created */ 2623955d011SMarcel Moolenaar #define OP_USE 0x00000010 /* Use associated commands for parents */ 2633955d011SMarcel Moolenaar #define OP_EXEC 0x00000020 /* Target is never out of date, but always 2643955d011SMarcel Moolenaar * execute commands anyway. Its time 2653955d011SMarcel Moolenaar * doesn't matter, so it has none...sort 2663955d011SMarcel Moolenaar * of */ 2673955d011SMarcel Moolenaar #define OP_IGNORE 0x00000040 /* Ignore errors when creating the node */ 2683955d011SMarcel Moolenaar #define OP_PRECIOUS 0x00000080 /* Don't remove the target when 2693955d011SMarcel Moolenaar * interrupted */ 2703955d011SMarcel Moolenaar #define OP_SILENT 0x00000100 /* Don't echo commands when executed */ 2713955d011SMarcel Moolenaar #define OP_MAKE 0x00000200 /* Target is a recursive make so its 2723955d011SMarcel Moolenaar * commands should always be executed when 2733955d011SMarcel Moolenaar * it is out of date, regardless of the 2743955d011SMarcel Moolenaar * state of the -n or -t flags */ 2753955d011SMarcel Moolenaar #define OP_JOIN 0x00000400 /* Target is out-of-date only if any of its 2763955d011SMarcel Moolenaar * children was out-of-date */ 2773955d011SMarcel Moolenaar #define OP_MADE 0x00000800 /* Assume the children of the node have 2783955d011SMarcel Moolenaar * been already made */ 2793955d011SMarcel Moolenaar #define OP_SPECIAL 0x00001000 /* Special .BEGIN, .END, .INTERRUPT */ 2803955d011SMarcel Moolenaar #define OP_USEBEFORE 0x00002000 /* Like .USE, only prepend commands */ 2813955d011SMarcel Moolenaar #define OP_INVISIBLE 0x00004000 /* The node is invisible to its parents. 2823955d011SMarcel Moolenaar * I.e. it doesn't show up in the parents's 2833955d011SMarcel Moolenaar * local variables. */ 2843955d011SMarcel Moolenaar #define OP_NOTMAIN 0x00008000 /* The node is exempt from normal 'main 2853955d011SMarcel Moolenaar * target' processing in parse.c */ 2863955d011SMarcel Moolenaar #define OP_PHONY 0x00010000 /* Not a file target; run always */ 2873955d011SMarcel Moolenaar #define OP_NOPATH 0x00020000 /* Don't search for file in the path */ 2883955d011SMarcel Moolenaar #define OP_WAIT 0x00040000 /* .WAIT phony node */ 2893955d011SMarcel Moolenaar #define OP_NOMETA 0x00080000 /* .NOMETA do not create a .meta file */ 2903955d011SMarcel Moolenaar #define OP_META 0x00100000 /* .META we _do_ want a .meta file */ 2913955d011SMarcel Moolenaar #define OP_NOMETA_CMP 0x00200000 /* Do not compare commands in .meta file */ 2923955d011SMarcel Moolenaar /* Attributes applied by PMake */ 2933955d011SMarcel Moolenaar #define OP_TRANSFORM 0x80000000 /* The node is a transformation rule */ 2943955d011SMarcel Moolenaar #define OP_MEMBER 0x40000000 /* Target is a member of an archive */ 2953955d011SMarcel Moolenaar #define OP_LIB 0x20000000 /* Target is a library */ 2963955d011SMarcel Moolenaar #define OP_ARCHV 0x10000000 /* Target is an archive construct */ 2973955d011SMarcel Moolenaar #define OP_HAS_COMMANDS 0x08000000 /* Target has all the commands it should. 2983955d011SMarcel Moolenaar * Used when parsing to catch multiple 2993955d011SMarcel Moolenaar * commands for a target */ 3003955d011SMarcel Moolenaar #define OP_SAVE_CMDS 0x04000000 /* Saving commands on .END (Compat) */ 3013955d011SMarcel Moolenaar #define OP_DEPS_FOUND 0x02000000 /* Already processed by Suff_FindDeps */ 3023955d011SMarcel Moolenaar #define OP_MARK 0x01000000 /* Node found while expanding .ALLSRC */ 3033955d011SMarcel Moolenaar 3043955d011SMarcel Moolenaar #define NoExecute(gn) ((gn->type & OP_MAKE) ? noRecursiveExecute : noExecute) 3053955d011SMarcel Moolenaar /* 3063955d011SMarcel Moolenaar * OP_NOP will return TRUE if the node with the given type was not the 3073955d011SMarcel Moolenaar * object of a dependency operator 3083955d011SMarcel Moolenaar */ 3093955d011SMarcel Moolenaar #define OP_NOP(t) (((t) & OP_OPMASK) == 0x00000000) 3103955d011SMarcel Moolenaar 3113955d011SMarcel Moolenaar #define OP_NOTARGET (OP_NOTMAIN|OP_USE|OP_EXEC|OP_TRANSFORM) 3123955d011SMarcel Moolenaar 3133955d011SMarcel Moolenaar /* 3143955d011SMarcel Moolenaar * The TARG_ constants are used when calling the Targ_FindNode and 3153955d011SMarcel Moolenaar * Targ_FindList functions in targ.c. They simply tell the functions what to 3163955d011SMarcel Moolenaar * do if the desired node(s) is (are) not found. If the TARG_CREATE constant 3173955d011SMarcel Moolenaar * is given, a new, empty node will be created for the target, placed in the 3183955d011SMarcel Moolenaar * table of all targets and its address returned. If TARG_NOCREATE is given, 3193955d011SMarcel Moolenaar * a NULL pointer will be returned. 3203955d011SMarcel Moolenaar */ 3213955d011SMarcel Moolenaar #define TARG_NOCREATE 0x00 /* don't create it */ 3223955d011SMarcel Moolenaar #define TARG_CREATE 0x01 /* create node if not found */ 3233955d011SMarcel Moolenaar #define TARG_NOHASH 0x02 /* don't look in/add to hash table */ 3243955d011SMarcel Moolenaar 3253955d011SMarcel Moolenaar /* 3263955d011SMarcel Moolenaar * These constants are all used by the Str_Concat function to decide how the 3273955d011SMarcel Moolenaar * final string should look. If STR_ADDSPACE is given, a space will be 3283955d011SMarcel Moolenaar * placed between the two strings. If STR_ADDSLASH is given, a '/' will 3293955d011SMarcel Moolenaar * be used instead of a space. If neither is given, no intervening characters 3303955d011SMarcel Moolenaar * will be placed between the two strings in the final output. If the 3313955d011SMarcel Moolenaar * STR_DOFREE bit is set, the two input strings will be freed before 3323955d011SMarcel Moolenaar * Str_Concat returns. 3333955d011SMarcel Moolenaar */ 3343955d011SMarcel Moolenaar #define STR_ADDSPACE 0x01 /* add a space when Str_Concat'ing */ 3353955d011SMarcel Moolenaar #define STR_ADDSLASH 0x02 /* add a slash when Str_Concat'ing */ 3363955d011SMarcel Moolenaar 3373955d011SMarcel Moolenaar /* 3383955d011SMarcel Moolenaar * Error levels for parsing. PARSE_FATAL means the process cannot continue 3393955d011SMarcel Moolenaar * once the makefile has been parsed. PARSE_WARNING means it can. Passed 3403955d011SMarcel Moolenaar * as the first argument to Parse_Error. 3413955d011SMarcel Moolenaar */ 3423955d011SMarcel Moolenaar #define PARSE_WARNING 2 3433955d011SMarcel Moolenaar #define PARSE_FATAL 1 3443955d011SMarcel Moolenaar 3453955d011SMarcel Moolenaar /* 3463955d011SMarcel Moolenaar * Values returned by Cond_Eval. 3473955d011SMarcel Moolenaar */ 3483955d011SMarcel Moolenaar #define COND_PARSE 0 /* Parse the next lines */ 3493955d011SMarcel Moolenaar #define COND_SKIP 1 /* Skip the next lines */ 3503955d011SMarcel Moolenaar #define COND_INVALID 2 /* Not a conditional statement */ 3513955d011SMarcel Moolenaar 3523955d011SMarcel Moolenaar /* 3533955d011SMarcel Moolenaar * Definitions for the "local" variables. Used only for clarity. 3543955d011SMarcel Moolenaar */ 3553955d011SMarcel Moolenaar #define TARGET "@" /* Target of dependency */ 3563955d011SMarcel Moolenaar #define OODATE "?" /* All out-of-date sources */ 3573955d011SMarcel Moolenaar #define ALLSRC ">" /* All sources */ 3583955d011SMarcel Moolenaar #define IMPSRC "<" /* Source implied by transformation */ 3593955d011SMarcel Moolenaar #define PREFIX "*" /* Common prefix */ 3603955d011SMarcel Moolenaar #define ARCHIVE "!" /* Archive in "archive(member)" syntax */ 3613955d011SMarcel Moolenaar #define MEMBER "%" /* Member in "archive(member)" syntax */ 3623955d011SMarcel Moolenaar 3633955d011SMarcel Moolenaar #define FTARGET "@F" /* file part of TARGET */ 3643955d011SMarcel Moolenaar #define DTARGET "@D" /* directory part of TARGET */ 3653955d011SMarcel Moolenaar #define FIMPSRC "<F" /* file part of IMPSRC */ 3663955d011SMarcel Moolenaar #define DIMPSRC "<D" /* directory part of IMPSRC */ 3673955d011SMarcel Moolenaar #define FPREFIX "*F" /* file part of PREFIX */ 3683955d011SMarcel Moolenaar #define DPREFIX "*D" /* directory part of PREFIX */ 3693955d011SMarcel Moolenaar 3703955d011SMarcel Moolenaar /* 3713955d011SMarcel Moolenaar * Global Variables 3723955d011SMarcel Moolenaar */ 3733955d011SMarcel Moolenaar extern Lst create; /* The list of target names specified on the 3743955d011SMarcel Moolenaar * command line. used to resolve #if 3753955d011SMarcel Moolenaar * make(...) statements */ 3763955d011SMarcel Moolenaar extern Lst dirSearchPath; /* The list of directories to search when 3773955d011SMarcel Moolenaar * looking for targets */ 3783955d011SMarcel Moolenaar 3793955d011SMarcel Moolenaar extern Boolean compatMake; /* True if we are make compatible */ 3803955d011SMarcel Moolenaar extern Boolean ignoreErrors; /* True if should ignore all errors */ 3813955d011SMarcel Moolenaar extern Boolean beSilent; /* True if should print no commands */ 3823955d011SMarcel Moolenaar extern Boolean noExecute; /* True if should execute nothing */ 3833955d011SMarcel Moolenaar extern Boolean noRecursiveExecute; /* True if should execute nothing */ 3843955d011SMarcel Moolenaar extern Boolean allPrecious; /* True if every target is precious */ 3853955d011SMarcel Moolenaar extern Boolean keepgoing; /* True if should continue on unaffected 3863955d011SMarcel Moolenaar * portions of the graph when have an error 3873955d011SMarcel Moolenaar * in one portion */ 3883955d011SMarcel Moolenaar extern Boolean touchFlag; /* TRUE if targets should just be 'touched' 3893955d011SMarcel Moolenaar * if out of date. Set by the -t flag */ 3903955d011SMarcel Moolenaar extern Boolean queryFlag; /* TRUE if we aren't supposed to really make 3913955d011SMarcel Moolenaar * anything, just see if the targets are out- 3923955d011SMarcel Moolenaar * of-date */ 3933955d011SMarcel Moolenaar extern Boolean doing_depend; /* TRUE if processing .depend */ 3943955d011SMarcel Moolenaar 3953955d011SMarcel Moolenaar extern Boolean checkEnvFirst; /* TRUE if environment should be searched for 3963955d011SMarcel Moolenaar * variables before the global context */ 3973955d011SMarcel Moolenaar extern Boolean jobServer; /* a jobServer already exists */ 3983955d011SMarcel Moolenaar 3993955d011SMarcel Moolenaar extern Boolean parseWarnFatal; /* TRUE if makefile parsing warnings are 4003955d011SMarcel Moolenaar * treated as errors */ 4013955d011SMarcel Moolenaar 4023955d011SMarcel Moolenaar extern Boolean varNoExportEnv; /* TRUE if we should not export variables 4033955d011SMarcel Moolenaar * set on the command line to the env. */ 4043955d011SMarcel Moolenaar 4053955d011SMarcel Moolenaar extern GNode *DEFAULT; /* .DEFAULT rule */ 4063955d011SMarcel Moolenaar 407*1bbe5942SSimon J. Gerraty extern GNode *VAR_INTERNAL; /* Variables defined internally by make 408*1bbe5942SSimon J. Gerraty * which should not override those set by 409*1bbe5942SSimon J. Gerraty * makefiles. 410*1bbe5942SSimon J. Gerraty */ 4113955d011SMarcel Moolenaar extern GNode *VAR_GLOBAL; /* Variables defined in a global context, e.g 4123955d011SMarcel Moolenaar * in the Makefile itself */ 4133955d011SMarcel Moolenaar extern GNode *VAR_CMD; /* Variables defined on the command line */ 4143955d011SMarcel Moolenaar extern GNode *VAR_FOR; /* Iteration variables */ 4153955d011SMarcel Moolenaar extern char var_Error[]; /* Value returned by Var_Parse when an error 4163955d011SMarcel Moolenaar * is encountered. It actually points to 4173955d011SMarcel Moolenaar * an empty string, so naive callers needn't 4183955d011SMarcel Moolenaar * worry about it. */ 4193955d011SMarcel Moolenaar 4203955d011SMarcel Moolenaar extern time_t now; /* The time at the start of this whole 4213955d011SMarcel Moolenaar * process */ 4223955d011SMarcel Moolenaar 4233955d011SMarcel Moolenaar extern Boolean oldVars; /* Do old-style variable substitution */ 4243955d011SMarcel Moolenaar 4253955d011SMarcel Moolenaar extern Lst sysIncPath; /* The system include path. */ 4263955d011SMarcel Moolenaar extern Lst defIncPath; /* The default include path. */ 4273955d011SMarcel Moolenaar 4283955d011SMarcel Moolenaar extern char curdir[]; /* Startup directory */ 4293955d011SMarcel Moolenaar extern char *progname; /* The program name */ 4303955d011SMarcel Moolenaar extern char *makeDependfile; /* .depend */ 4313955d011SMarcel Moolenaar extern char **savedEnv; /* if we replaced environ this will be non-NULL */ 4323955d011SMarcel Moolenaar 4333955d011SMarcel Moolenaar /* 4343955d011SMarcel Moolenaar * We cannot vfork() in a child of vfork(). 4353955d011SMarcel Moolenaar * Most systems do not enforce this but some do. 4363955d011SMarcel Moolenaar */ 4373955d011SMarcel Moolenaar #define vFork() ((getpid() == myPid) ? vfork() : fork()) 4383955d011SMarcel Moolenaar extern pid_t myPid; 4393955d011SMarcel Moolenaar 4403955d011SMarcel Moolenaar #define MAKEFLAGS ".MAKEFLAGS" 4413955d011SMarcel Moolenaar #define MAKEOVERRIDES ".MAKEOVERRIDES" 4423955d011SMarcel Moolenaar #define MAKE_JOB_PREFIX ".MAKE.JOB.PREFIX" /* prefix for job target output */ 4433955d011SMarcel Moolenaar #define MAKE_EXPORTED ".MAKE.EXPORTED" /* variables we export */ 4443955d011SMarcel Moolenaar #define MAKE_MAKEFILES ".MAKE.MAKEFILES" /* all the makefiles we read */ 4453955d011SMarcel Moolenaar #define MAKE_LEVEL ".MAKE.LEVEL" /* recursion level */ 4463955d011SMarcel Moolenaar #define MAKEFILE_PREFERENCE ".MAKE.MAKEFILE_PREFERENCE" 4473955d011SMarcel Moolenaar #define MAKE_DEPENDFILE ".MAKE.DEPENDFILE" /* .depend */ 4483955d011SMarcel Moolenaar #define MAKE_MODE ".MAKE.MODE" 44951ee2c1cSSimon J. Gerraty #ifndef MAKE_LEVEL_ENV 45051ee2c1cSSimon J. Gerraty # define MAKE_LEVEL_ENV "MAKELEVEL" 4513955d011SMarcel Moolenaar #endif 4523955d011SMarcel Moolenaar 4533955d011SMarcel Moolenaar /* 4543955d011SMarcel Moolenaar * debug control: 4553955d011SMarcel Moolenaar * There is one bit per module. It is up to the module what debug 4563955d011SMarcel Moolenaar * information to print. 4573955d011SMarcel Moolenaar */ 4583955d011SMarcel Moolenaar FILE *debug_file; /* Output written here - default stdout */ 4593955d011SMarcel Moolenaar extern int debug; 4603955d011SMarcel Moolenaar #define DEBUG_ARCH 0x00001 4613955d011SMarcel Moolenaar #define DEBUG_COND 0x00002 4623955d011SMarcel Moolenaar #define DEBUG_DIR 0x00004 4633955d011SMarcel Moolenaar #define DEBUG_GRAPH1 0x00008 4643955d011SMarcel Moolenaar #define DEBUG_GRAPH2 0x00010 4653955d011SMarcel Moolenaar #define DEBUG_JOB 0x00020 4663955d011SMarcel Moolenaar #define DEBUG_MAKE 0x00040 4673955d011SMarcel Moolenaar #define DEBUG_SUFF 0x00080 4683955d011SMarcel Moolenaar #define DEBUG_TARG 0x00100 4693955d011SMarcel Moolenaar #define DEBUG_VAR 0x00200 4703955d011SMarcel Moolenaar #define DEBUG_FOR 0x00400 4713955d011SMarcel Moolenaar #define DEBUG_SHELL 0x00800 4723955d011SMarcel Moolenaar #define DEBUG_ERROR 0x01000 4733955d011SMarcel Moolenaar #define DEBUG_LOUD 0x02000 4743955d011SMarcel Moolenaar #define DEBUG_META 0x04000 4753955d011SMarcel Moolenaar 4763955d011SMarcel Moolenaar #define DEBUG_GRAPH3 0x10000 4773955d011SMarcel Moolenaar #define DEBUG_SCRIPT 0x20000 4783955d011SMarcel Moolenaar #define DEBUG_PARSE 0x40000 4793955d011SMarcel Moolenaar #define DEBUG_CWD 0x80000 4803955d011SMarcel Moolenaar 4813955d011SMarcel Moolenaar #define CONCAT(a,b) a##b 4823955d011SMarcel Moolenaar 4833955d011SMarcel Moolenaar #define DEBUG(module) (debug & CONCAT(DEBUG_,module)) 4843955d011SMarcel Moolenaar 4853955d011SMarcel Moolenaar #include "nonints.h" 4863955d011SMarcel Moolenaar 4873955d011SMarcel Moolenaar int Make_TimeStamp(GNode *, GNode *); 4883955d011SMarcel Moolenaar Boolean Make_OODate(GNode *); 4893955d011SMarcel Moolenaar void Make_ExpandUse(Lst); 4903955d011SMarcel Moolenaar time_t Make_Recheck(GNode *); 4913955d011SMarcel Moolenaar void Make_HandleUse(GNode *, GNode *); 4923955d011SMarcel Moolenaar void Make_Update(GNode *); 4933955d011SMarcel Moolenaar void Make_DoAllVar(GNode *); 4943955d011SMarcel Moolenaar Boolean Make_Run(Lst); 4953955d011SMarcel Moolenaar char * Check_Cwd_Cmd(const char *); 4963955d011SMarcel Moolenaar void Check_Cwd(const char **); 4973955d011SMarcel Moolenaar void PrintOnError(GNode *, const char *); 4983955d011SMarcel Moolenaar void Main_ExportMAKEFLAGS(Boolean); 4993955d011SMarcel Moolenaar Boolean Main_SetObjdir(const char *); 5003955d011SMarcel Moolenaar int mkTempFile(const char *, char **); 5013955d011SMarcel Moolenaar int str2Lst_Append(Lst, char *, const char *); 5023955d011SMarcel Moolenaar 5033955d011SMarcel Moolenaar #ifdef __GNUC__ 5043955d011SMarcel Moolenaar #define UNCONST(ptr) ({ \ 5053955d011SMarcel Moolenaar union __unconst { \ 5063955d011SMarcel Moolenaar const void *__cp; \ 5073955d011SMarcel Moolenaar void *__p; \ 5083955d011SMarcel Moolenaar } __d; \ 5093955d011SMarcel Moolenaar __d.__cp = ptr, __d.__p; }) 5103955d011SMarcel Moolenaar #else 5113955d011SMarcel Moolenaar #define UNCONST(ptr) (void *)(ptr) 5123955d011SMarcel Moolenaar #endif 5133955d011SMarcel Moolenaar 5143955d011SMarcel Moolenaar #ifndef MIN 5153955d011SMarcel Moolenaar #define MIN(a, b) ((a < b) ? a : b) 5163955d011SMarcel Moolenaar #endif 5173955d011SMarcel Moolenaar #ifndef MAX 5183955d011SMarcel Moolenaar #define MAX(a, b) ((a > b) ? a : b) 5193955d011SMarcel Moolenaar #endif 5203955d011SMarcel Moolenaar 5213955d011SMarcel Moolenaar #endif /* _MAKE_H_ */ 522