Blame


1 76193d7c 2003-09-30 devnull #include "mk.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull static Rule *lr, *lmr;
4 76193d7c 2003-09-30 devnull static int rcmp(Rule *r, char *target, Word *tail);
5 76193d7c 2003-09-30 devnull static int nrules = 0;
6 76193d7c 2003-09-30 devnull
7 76193d7c 2003-09-30 devnull void
8 76193d7c 2003-09-30 devnull addrule(char *head, Word *tail, char *body, Word *ahead, int attr, int hline, char *prog)
9 76193d7c 2003-09-30 devnull {
10 76193d7c 2003-09-30 devnull Rule *r;
11 76193d7c 2003-09-30 devnull Rule *rr;
12 76193d7c 2003-09-30 devnull Symtab *sym;
13 76193d7c 2003-09-30 devnull int reuse;
14 76193d7c 2003-09-30 devnull
15 76193d7c 2003-09-30 devnull r = 0;
16 76193d7c 2003-09-30 devnull reuse = 0;
17 76193d7c 2003-09-30 devnull if(sym = symlook(head, S_TARGET, 0)){
18 3fe9465a 2006-04-20 devnull for(r = sym->u.ptr; r; r = r->chain)
19 76193d7c 2003-09-30 devnull if(rcmp(r, head, tail) == 0){
20 76193d7c 2003-09-30 devnull reuse = 1;
21 76193d7c 2003-09-30 devnull break;
22 76193d7c 2003-09-30 devnull }
23 76193d7c 2003-09-30 devnull }
24 76193d7c 2003-09-30 devnull if(r == 0)
25 76193d7c 2003-09-30 devnull r = (Rule *)Malloc(sizeof(Rule));
26 9aa1c92f 2005-01-04 devnull r->shellt = shellt;
27 9aa1c92f 2005-01-04 devnull r->shellcmd = shellcmd;
28 76193d7c 2003-09-30 devnull r->target = head;
29 76193d7c 2003-09-30 devnull r->tail = tail;
30 76193d7c 2003-09-30 devnull r->recipe = body;
31 76193d7c 2003-09-30 devnull r->line = hline;
32 76193d7c 2003-09-30 devnull r->file = infile;
33 76193d7c 2003-09-30 devnull r->attr = attr;
34 76193d7c 2003-09-30 devnull r->alltargets = ahead;
35 76193d7c 2003-09-30 devnull r->prog = prog;
36 76193d7c 2003-09-30 devnull r->rule = nrules++;
37 76193d7c 2003-09-30 devnull if(!reuse){
38 3fe9465a 2006-04-20 devnull rr = symlook(head, S_TARGET, (void *)r)->u.ptr;
39 76193d7c 2003-09-30 devnull if(rr != r){
40 76193d7c 2003-09-30 devnull r->chain = rr->chain;
41 76193d7c 2003-09-30 devnull rr->chain = r;
42 76193d7c 2003-09-30 devnull } else
43 76193d7c 2003-09-30 devnull r->chain = 0;
44 76193d7c 2003-09-30 devnull }
45 76193d7c 2003-09-30 devnull if(!reuse)
46 76193d7c 2003-09-30 devnull r->next = 0;
47 9aa1c92f 2005-01-04 devnull if((attr&REGEXP) || shellt->charin(head, "%&")){
48 76193d7c 2003-09-30 devnull r->attr |= META;
49 76193d7c 2003-09-30 devnull if(reuse)
50 76193d7c 2003-09-30 devnull return;
51 76193d7c 2003-09-30 devnull if(attr&REGEXP){
52 76193d7c 2003-09-30 devnull patrule = r;
53 76193d7c 2003-09-30 devnull r->pat = regcomp(head);
54 76193d7c 2003-09-30 devnull }
55 76193d7c 2003-09-30 devnull if(metarules == 0)
56 76193d7c 2003-09-30 devnull metarules = lmr = r;
57 76193d7c 2003-09-30 devnull else {
58 76193d7c 2003-09-30 devnull lmr->next = r;
59 76193d7c 2003-09-30 devnull lmr = r;
60 76193d7c 2003-09-30 devnull }
61 76193d7c 2003-09-30 devnull } else {
62 76193d7c 2003-09-30 devnull if(reuse)
63 76193d7c 2003-09-30 devnull return;
64 76193d7c 2003-09-30 devnull r->pat = 0;
65 76193d7c 2003-09-30 devnull if(rules == 0)
66 76193d7c 2003-09-30 devnull rules = lr = r;
67 76193d7c 2003-09-30 devnull else {
68 76193d7c 2003-09-30 devnull lr->next = r;
69 76193d7c 2003-09-30 devnull lr = r;
70 76193d7c 2003-09-30 devnull }
71 76193d7c 2003-09-30 devnull }
72 76193d7c 2003-09-30 devnull }
73 76193d7c 2003-09-30 devnull
74 76193d7c 2003-09-30 devnull void
75 76193d7c 2003-09-30 devnull dumpr(char *s, Rule *r)
76 76193d7c 2003-09-30 devnull {
77 dc6f9f03 2006-10-12 devnull if(r == nil)
78 dc6f9f03 2006-10-12 devnull return;
79 fa325e9b 2020-01-10 cross Bprint(&bout, "%s: start=%ld shelltype=%s shellcmd=%s\n",
80 9aa1c92f 2005-01-04 devnull s, r, r->shellt->name, wtos(r->shellcmd, ' '));
81 76193d7c 2003-09-30 devnull for(; r; r = r->next){
82 76193d7c 2003-09-30 devnull Bprint(&bout, "\tRule %ld: %s[%d] attr=%x next=%ld chain=%ld alltarget='%s'",
83 76193d7c 2003-09-30 devnull r, r->file, r->line, r->attr, r->next, r->chain, wtos(r->alltargets, ' '));
84 76193d7c 2003-09-30 devnull if(r->prog)
85 76193d7c 2003-09-30 devnull Bprint(&bout, " prog='%s'", r->prog);
86 76193d7c 2003-09-30 devnull Bprint(&bout, "\n\ttarget=%s: %s\n", r->target, wtos(r->tail, ' '));
87 76193d7c 2003-09-30 devnull Bprint(&bout, "\trecipe@%ld='%s'\n", r->recipe, r->recipe);
88 76193d7c 2003-09-30 devnull }
89 76193d7c 2003-09-30 devnull }
90 76193d7c 2003-09-30 devnull
91 76193d7c 2003-09-30 devnull static int
92 76193d7c 2003-09-30 devnull rcmp(Rule *r, char *target, Word *tail)
93 76193d7c 2003-09-30 devnull {
94 76193d7c 2003-09-30 devnull Word *w;
95 76193d7c 2003-09-30 devnull
96 76193d7c 2003-09-30 devnull if(strcmp(r->target, target))
97 76193d7c 2003-09-30 devnull return 1;
98 76193d7c 2003-09-30 devnull for(w = r->tail; w && tail; w = w->next, tail = tail->next)
99 76193d7c 2003-09-30 devnull if(strcmp(w->s, tail->s))
100 76193d7c 2003-09-30 devnull return 1;
101 76193d7c 2003-09-30 devnull return(w || tail);
102 76193d7c 2003-09-30 devnull }
103 76193d7c 2003-09-30 devnull
104 76193d7c 2003-09-30 devnull char *
105 76193d7c 2003-09-30 devnull rulecnt(void)
106 76193d7c 2003-09-30 devnull {
107 76193d7c 2003-09-30 devnull char *s;
108 76193d7c 2003-09-30 devnull
109 76193d7c 2003-09-30 devnull s = Malloc(nrules);
110 76193d7c 2003-09-30 devnull memset(s, 0, nrules);
111 76193d7c 2003-09-30 devnull return(s);
112 76193d7c 2003-09-30 devnull }