xref: /plan9-contrib/sys/src/cmd/mk/recipe.c (revision d1da931c1953c14f6f98c26297030a0b55cb02f6)
13e12c5d1SDavid du Colombier #include	"mk.h"
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier int
dorecipe(Node * node)43e12c5d1SDavid du Colombier dorecipe(Node *node)
53e12c5d1SDavid du Colombier {
63e12c5d1SDavid du Colombier 	int did = 0;
7276e7d6dSDavid du Colombier 	char buf[BIGBLOCK], cwd[256];
8276e7d6dSDavid du Colombier 	Arc *a, *aa;
9276e7d6dSDavid du Colombier 	Node *n;
10276e7d6dSDavid du Colombier 	Rule *r = 0;
11276e7d6dSDavid du Colombier 	Symtab *s;
12276e7d6dSDavid du Colombier 	Word head, ahead, lp, ln, *w, *ww, *aw;
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier 	aa = 0;
153e12c5d1SDavid du Colombier 	/*
163e12c5d1SDavid du Colombier 		pick up the rule
173e12c5d1SDavid du Colombier 	*/
183e12c5d1SDavid du Colombier 	for(a = node->prereqs; a; a = a->next)
193e12c5d1SDavid du Colombier 		if(*a->r->recipe)
203e12c5d1SDavid du Colombier 			r = (aa = a)->r;
213e12c5d1SDavid du Colombier 	/*
223e12c5d1SDavid du Colombier 		no recipe? go to buggery!
233e12c5d1SDavid du Colombier 	*/
243e12c5d1SDavid du Colombier 	if(r == 0){
253e12c5d1SDavid du Colombier 		if(!(node->flags&VIRTUAL) && !(node->flags&NORECIPE)){
269a747e4fSDavid du Colombier 			if(getwd(cwd, sizeof cwd))
2799eb86a7SDavid du Colombier 				fprint(2, "mk: no recipe to make '%s' in directory %s\n", node->name, cwd);
289a747e4fSDavid du Colombier 			else
2999eb86a7SDavid du Colombier 				fprint(2, "mk: no recipe to make '%s'\n", node->name);
303e12c5d1SDavid du Colombier 			Exit();
313e12c5d1SDavid du Colombier 		}
327dd7cddfSDavid du Colombier 		if(strchr(node->name, '(') && node->time == 0)
337dd7cddfSDavid du Colombier 			MADESET(node, MADE);
347dd7cddfSDavid du Colombier 		else
353e12c5d1SDavid du Colombier 			update(0, node);
363e12c5d1SDavid du Colombier 		if(tflag){
373e12c5d1SDavid du Colombier 			if(!(node->flags&VIRTUAL))
383e12c5d1SDavid du Colombier 				touch(node->name);
393e12c5d1SDavid du Colombier 			else if(explain)
4099eb86a7SDavid du Colombier 				Bprint(&bout, "no touch of virtual '%s'\n", node->name);
413e12c5d1SDavid du Colombier 		}
423e12c5d1SDavid du Colombier 		return(did);
433e12c5d1SDavid du Colombier 	}
443e12c5d1SDavid du Colombier 	/*
453e12c5d1SDavid du Colombier 		build the node list
463e12c5d1SDavid du Colombier 	*/
473e12c5d1SDavid du Colombier 	node->next = 0;
483e12c5d1SDavid du Colombier 	head.next = 0;
493e12c5d1SDavid du Colombier 	ww = &head;
503e12c5d1SDavid du Colombier 	ahead.next = 0;
513e12c5d1SDavid du Colombier 	aw = &ahead;
523e12c5d1SDavid du Colombier 	if(r->attr&REGEXP){
533e12c5d1SDavid du Colombier 		ww->next = newword(node->name);
543e12c5d1SDavid du Colombier 		aw->next = newword(node->name);
553e12c5d1SDavid du Colombier 	} else {
563e12c5d1SDavid du Colombier 		for(w = r->alltargets; w; w = w->next){
573e12c5d1SDavid du Colombier 			if(r->attr&META)
589a747e4fSDavid du Colombier 				subst(aa->stem, w->s, buf, sizeof(buf));
593e12c5d1SDavid du Colombier 			else
60*d1da931cSDavid du Colombier 				strecpy(buf, buf + sizeof buf - 1, w->s);
613e12c5d1SDavid du Colombier 			aw->next = newword(buf);
623e12c5d1SDavid du Colombier 			aw = aw->next;
637dd7cddfSDavid du Colombier 			if((s = symlook(buf, S_NODE, 0)) == 0)
643e12c5d1SDavid du Colombier 				continue;	/* not a node we are interested in */
654de34a7eSDavid du Colombier 			n = s->u.ptr;
667dd7cddfSDavid du Colombier 			if(aflag == 0 && n->time) {
677dd7cddfSDavid du Colombier 				for(a = n->prereqs; a; a = a->next)
687dd7cddfSDavid du Colombier 					if(a->n && outofdate(n, a, 0))
697dd7cddfSDavid du Colombier 						break;
707dd7cddfSDavid du Colombier 				if(a == 0)
717dd7cddfSDavid du Colombier 					continue;
727dd7cddfSDavid du Colombier 			}
733e12c5d1SDavid du Colombier 			ww->next = newword(buf);
743e12c5d1SDavid du Colombier 			ww = ww->next;
7599eb86a7SDavid du Colombier 			if(n == node) continue;
763e12c5d1SDavid du Colombier 			n->next = node->next;
773e12c5d1SDavid du Colombier 			node->next = n;
783e12c5d1SDavid du Colombier 		}
793e12c5d1SDavid du Colombier 	}
803e12c5d1SDavid du Colombier 	for(n = node; n; n = n->next)
813e12c5d1SDavid du Colombier 		if((n->flags&READY) == 0)
823e12c5d1SDavid du Colombier 			return(did);
833e12c5d1SDavid du Colombier 	/*
843e12c5d1SDavid du Colombier 		gather the params for the job
853e12c5d1SDavid du Colombier 	*/
863e12c5d1SDavid du Colombier 	lp.next = ln.next = 0;
873e12c5d1SDavid du Colombier 	for(n = node; n; n = n->next){
883e12c5d1SDavid du Colombier 		for(a = n->prereqs; a; a = a->next){
893e12c5d1SDavid du Colombier 			if(a->n){
903e12c5d1SDavid du Colombier 				addw(&lp, a->n->name);
913e12c5d1SDavid du Colombier 				if(outofdate(n, a, 0)){
923e12c5d1SDavid du Colombier 					addw(&ln, a->n->name);
933e12c5d1SDavid du Colombier 					if(explain)
943e12c5d1SDavid du Colombier 						fprint(1, "%s(%ld) < %s(%ld)\n",
9599eb86a7SDavid du Colombier 							n->name, n->time, a->n->name, a->n->time);
963e12c5d1SDavid du Colombier 				}
973e12c5d1SDavid du Colombier 			} else {
983e12c5d1SDavid du Colombier 				if(explain)
993e12c5d1SDavid du Colombier 					fprint(1, "%s has no prerequisites\n",
1003e12c5d1SDavid du Colombier 							n->name);
1013e12c5d1SDavid du Colombier 			}
1023e12c5d1SDavid du Colombier 		}
1033e12c5d1SDavid du Colombier 		MADESET(n, BEINGMADE);
1043e12c5d1SDavid du Colombier 	}
1057dd7cddfSDavid du Colombier /*	print("lt=%s ln=%s lp=%s\n",wtos(head.next, ' '),wtos(ln.next, ' '),wtos(lp.next, ' '));/**/
10699eb86a7SDavid du Colombier 	run(newjob(r, node, aa->stem, aa->match, lp.next, ln.next, head.next, ahead.next));
1073e12c5d1SDavid du Colombier 	return(1);
1083e12c5d1SDavid du Colombier }
1093e12c5d1SDavid du Colombier 
1103e12c5d1SDavid du Colombier void
addw(Word * w,char * s)1113e12c5d1SDavid du Colombier addw(Word *w, char *s)
1123e12c5d1SDavid du Colombier {
1133e12c5d1SDavid du Colombier 	Word *lw;
1143e12c5d1SDavid du Colombier 
1153e12c5d1SDavid du Colombier 	for(lw = w; w = w->next; lw = w){
1163e12c5d1SDavid du Colombier 		if(strcmp(s, w->s) == 0)
1173e12c5d1SDavid du Colombier 			return;
1183e12c5d1SDavid du Colombier 	}
1193e12c5d1SDavid du Colombier 	lw->next = newword(s);
1203e12c5d1SDavid du Colombier }
121