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 76193d7c 2003-09-30 devnull n->next = node->next;
74 76193d7c 2003-09-30 devnull node->next = n;
75 76193d7c 2003-09-30 devnull }
76 76193d7c 2003-09-30 devnull }
77 76193d7c 2003-09-30 devnull for(n = node; n; n = n->next)
78 76193d7c 2003-09-30 devnull if((n->flags&READY) == 0)
79 76193d7c 2003-09-30 devnull return(did);
80 76193d7c 2003-09-30 devnull /*
81 76193d7c 2003-09-30 devnull gather the params for the job
82 76193d7c 2003-09-30 devnull */
83 76193d7c 2003-09-30 devnull lp.next = ln.next = 0;
84 76193d7c 2003-09-30 devnull for(n = node; n; n = n->next){
85 76193d7c 2003-09-30 devnull for(a = n->prereqs; a; a = a->next){
86 76193d7c 2003-09-30 devnull if(a->n){
87 76193d7c 2003-09-30 devnull addw(&lp, a->n->name);
88 76193d7c 2003-09-30 devnull if(outofdate(n, a, 0)){
89 76193d7c 2003-09-30 devnull addw(&ln, a->n->name);
90 76193d7c 2003-09-30 devnull if(explain)
91 76193d7c 2003-09-30 devnull fprint(1, "%s(%ld) < %s(%ld)\n",
92 76193d7c 2003-09-30 devnull n->name, n->time, a->n->name, a->n->time);
93 76193d7c 2003-09-30 devnull }
94 76193d7c 2003-09-30 devnull } else {
95 76193d7c 2003-09-30 devnull if(explain)
96 76193d7c 2003-09-30 devnull fprint(1, "%s has no prerequisites\n",
97 76193d7c 2003-09-30 devnull n->name);
98 76193d7c 2003-09-30 devnull }
99 76193d7c 2003-09-30 devnull }
100 76193d7c 2003-09-30 devnull MADESET(n, BEINGMADE);
101 76193d7c 2003-09-30 devnull }
102 cbeb0b26 2006-04-01 devnull /*print("lt=%s ln=%s lp=%s\n",wtos(head.next, ' '),wtos(ln.next, ' '),wtos(lp.next, ' '));*/
103 76193d7c 2003-09-30 devnull run(newjob(r, node, aa->stem, aa->match, lp.next, ln.next, head.next, ahead.next));
104 76193d7c 2003-09-30 devnull return(1);
105 76193d7c 2003-09-30 devnull }
106 76193d7c 2003-09-30 devnull
107 76193d7c 2003-09-30 devnull void
108 76193d7c 2003-09-30 devnull addw(Word *w, char *s)
109 76193d7c 2003-09-30 devnull {
110 76193d7c 2003-09-30 devnull Word *lw;
111 76193d7c 2003-09-30 devnull
112 76193d7c 2003-09-30 devnull for(lw = w; w = w->next; lw = w){
113 76193d7c 2003-09-30 devnull if(strcmp(s, w->s) == 0)
114 76193d7c 2003-09-30 devnull return;
115 76193d7c 2003-09-30 devnull }
116 76193d7c 2003-09-30 devnull lw->next = newword(s);
117 76193d7c 2003-09-30 devnull }