xref: /inferno-os/utils/mk/recipe.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1 #include	"mk.h"
2 
3 int
dorecipe(Node * node)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;
13 
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 = (Node *)s->value;
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 			n->next = node->next;
74 			node->next = n;
75 		}
76 	}
77 	for(n = node; n; n = n->next)
78 		if((n->flags&READY) == 0)
79 			return(did);
80 	/*
81 		gather the params for the job
82 	*/
83 	lp.next = ln.next = 0;
84 	for(n = node; n; n = n->next){
85 		for(a = n->prereqs; a; a = a->next){
86 			if(a->n){
87 				addw(&lp, a->n->name);
88 				if(outofdate(n, a, 0)){
89 					addw(&ln, a->n->name);
90 					if(explain)
91 						fprint(1, "%s(%ld) < %s(%ld)\n",
92 							n->name, n->time, a->n->name, a->n->time);
93 				}
94 			} else {
95 				if(explain)
96 					fprint(1, "%s has no prerequisites\n",
97 							n->name);
98 			}
99 		}
100 		MADESET(n, BEINGMADE);
101 	}
102 	/*print("lt=%s ln=%s lp=%s\n",wtos(head.next, ' '),wtos(ln.next, ' '),wtos(lp.next, ' '));/**/
103 	run(newjob(r, node, aa->stem, aa->match, lp.next, ln.next, head.next, ahead.next));
104 	return(1);
105 }
106 
107 void
addw(Word * w,char * s)108 addw(Word *w, char *s)
109 {
110 	Word *lw;
111 
112 	for(lw = w; w = w->next; lw = w){
113 		if(strcmp(s, w->s) == 0)
114 			return;
115 	}
116 	lw->next = newword(s);
117 }
118