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®EXP){
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