Blame


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