123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- #include <u.h>
- #include <libc.h>
- #include <bio.h>
- #include <regexp.h>
- extern Biobuf bout;
- typedef struct Bufblock
- {
- struct Bufblock *next;
- char *start;
- char *end;
- char *current;
- } Bufblock;
- typedef struct Word
- {
- char *s;
- struct Word *next;
- } Word;
- typedef struct Envy
- {
- char *name;
- Word *values;
- } Envy;
- extern Envy *envy;
- typedef struct Rule
- {
- char *target; /* one target */
- Word *tail; /* constituents of targets */
- char *recipe; /* do it ! */
- short attr; /* attributes */
- short line; /* source line */
- char *file; /* source file */
- Word *alltargets; /* all the targets */
- int rule; /* rule number */
- Reprog *pat; /* reg exp goo */
- char *prog; /* to use in out of date */
- struct Rule *chain; /* hashed per target */
- struct Rule *next;
- } Rule;
- extern Rule *rules, *metarules, *patrule;
- /* Rule.attr */
- #define META 0x0001
- #define UNUSED 0x0002
- #define UPD 0x0004
- #define QUIET 0x0008
- #define VIR 0x0010
- #define REGEXP 0x0020
- #define NOREC 0x0040
- #define DEL 0x0080
- #define NOVIRT 0x0100
- #define NREGEXP 10
- typedef struct Arc
- {
- short flag;
- struct Node *n;
- Rule *r;
- char *stem;
- char *prog;
- char *match[NREGEXP];
- struct Arc *next;
- } Arc;
- /* Arc.flag */
- #define TOGO 1
- typedef struct Node
- {
- char *name;
- long time;
- unsigned short flags;
- Arc *prereqs;
- struct Node *next; /* list for a rule */
- } Node;
- /* Node.flags */
- #define VIRTUAL 0x0001
- #define CYCLE 0x0002
- #define READY 0x0004
- #define CANPRETEND 0x0008
- #define PRETENDING 0x0010
- #define NOTMADE 0x0020
- #define BEINGMADE 0x0040
- #define MADE 0x0080
- #define MADESET(n,m) n->flags = (n->flags&~(NOTMADE|BEINGMADE|MADE))|(m)
- #define PROBABLE 0x0100
- #define VACUOUS 0x0200
- #define NORECIPE 0x0400
- #define DELETE 0x0800
- #define NOMINUSE 0x1000
- typedef struct Job
- {
- Rule *r; /* master rule for job */
- Node *n; /* list of node targets */
- char *stem;
- char **match;
- Word *p; /* prerequistes */
- Word *np; /* new prerequistes */
- Word *t; /* targets */
- Word *at; /* all targets */
- int nproc; /* slot number */
- struct Job *next;
- } Job;
- extern Job *jobs;
- typedef struct Symtab
- {
- short space;
- char *name;
- void *value;
- struct Symtab *next;
- } Symtab;
- enum {
- S_VAR, /* variable -> value */
- S_TARGET, /* target -> rule */
- S_TIME, /* file -> time */
- S_PID, /* pid -> products */
- S_NODE, /* target name -> node */
- S_AGG, /* aggregate -> time */
- S_BITCH, /* bitched about aggregate not there */
- S_NOEXPORT, /* var -> noexport */
- S_OVERRIDE, /* can't override */
- S_OUTOFDATE, /* n1\377n2 -> 2(outofdate) or 1(not outofdate) */
- S_MAKEFILE, /* target -> node */
- S_MAKEVAR, /* dumpable mk variable */
- S_EXPORTED, /* var -> current exported value */
- S_BULKED, /* we have bulked this dir */
- S_WESET, /* variable; we set in the mkfile */
- S_INTERNAL, /* an internal mk variable (e.g., stem, target) */
- };
- extern int debug;
- extern int nflag, tflag, iflag, kflag, aflag, mflag;
- extern int mkinline;
- extern char *infile;
- extern int nreps;
- extern char *explain;
- extern char *termchars;
- extern char *shell;
- extern char *shellname;
- extern char *shflags;
- extern int IWS;
- #define SYNERR(l) (fprint(2, "mk: %s:%d: syntax error; ", infile, ((l)>=0)?(l):mkinline))
- #define RERR(r) (fprint(2, "mk: %s:%d: rule error; ", (r)->file, (r)->line))
- #define NAMEBLOCK 1000
- #define BIGBLOCK 20000
- #define SEP(c) (((c)==' ')||((c)=='\t')||((c)=='\n'))
- #define WORDCHR(r) ((r) > ' ' && !utfrune("!\"#$%&'()*+,-./:;<=>?@[\\]^`{|}~", (r)))
- #define DEBUG(x) (debug&(x))
- #define D_PARSE 0x01
- #define D_GRAPH 0x02
- #define D_EXEC 0x04
- #define LSEEK(f,o,p) seek(f,o,p)
- #define PERCENT(ch) (((ch) == '%') || ((ch) == '&'))
- #include "fns.h"
|