Blob


1 #include "mk.h"
3 int
4 dorecipe(Node *node)
5 {
6 char buf[BIGBLOCK];
7 register Node *n;
8 Rule *r = 0;
9 Arc *a, *aa;
10 Word head, ahead, lp, ln, *w, *ww, *aw;
11 Symtab *s;
12 int did = 0;
14 aa = 0;
15 /*
16 pick up the rule
17 */
18 for(a = node->prereqs; a; a = a->next)
19 if(*a->r->recipe)
20 r = (aa = a)->r;
21 /*
22 no recipe? go to buggery!
23 */
24 if(r == 0){
25 if(!(node->flags&VIRTUAL) && !(node->flags&NORECIPE)){
26 fprint(2, "mk: no recipe to make '%s'\n", node->name);
27 Exit();
28 }
29 if(strchr(node->name, '(') && node->time == 0)
30 MADESET(node, MADE);
31 else
32 update(0, node);
33 if(tflag){
34 if(!(node->flags&VIRTUAL))
35 touch(node->name);
36 else if(explain)
37 Bprint(&bout, "no touch of virtual '%s'\n", node->name);
38 }
39 return(did);
40 }
41 /*
42 build the node list
43 */
44 node->next = 0;
45 head.next = 0;
46 ww = &head;
47 ahead.next = 0;
48 aw = &ahead;
49 if(r->attr&REGEXP){
50 ww->next = newword(node->name);
51 aw->next = newword(node->name);
52 } else {
53 for(w = r->alltargets; w; w = w->next){
54 if(r->attr&META)
55 subst(aa->stem, w->s, buf);
56 else
57 strcpy(buf, w->s);
58 aw->next = newword(buf);
59 aw = aw->next;
60 if((s = symlook(buf, S_NODE, 0)) == 0)
61 continue; /* not a node we are interested in */
62 n = s->u.ptr;
63 if(aflag == 0 && n->time) {
64 for(a = n->prereqs; a; a = a->next)
65 if(a->n && outofdate(n, a, 0))
66 break;
67 if(a == 0)
68 continue;
69 }
70 ww->next = newword(buf);
71 ww = ww->next;
72 if(n == node) continue;
73 if((n->flags&ONLIST) != 0)
74 continue;
75 n->flags |= ONLIST;
76 n->next = node->next;
77 node->next = n;
78 }
79 }
80 for(n = node->next; n; n = n->next)
81 n->flags &= ~ONLIST;
82 for(n = node; n; n = n->next)
83 if((n->flags&READY) == 0)
84 return(did);
85 /*
86 gather the params for the job
87 */
88 lp.next = ln.next = 0;
89 for(n = node; n; n = n->next){
90 for(a = n->prereqs; a; a = a->next){
91 if(a->n){
92 addw(&lp, a->n->name);
93 if(outofdate(n, a, 0)){
94 addw(&ln, a->n->name);
95 if(explain)
96 fprint(1, "%s(%ld) < %s(%ld)\n",
97 n->name, n->time, a->n->name, a->n->time);
98 }
99 } else {
100 if(explain)
101 fprint(1, "%s has no prerequisites\n",
102 n->name);
105 MADESET(n, BEINGMADE);
107 /*print("lt=%s ln=%s lp=%s\n",wtos(head.next, ' '),wtos(ln.next, ' '),wtos(lp.next, ' '));*/
108 run(newjob(r, node, aa->stem, aa->match, lp.next, ln.next, head.next, ahead.next));
109 return(1);
112 void
113 addw(Word *w, char *s)
115 Word *lw;
117 for(lw = w; w = w->next; lw = w){
118 if(strcmp(s, w->s) == 0)
119 return;
121 lw->next = newword(s);