URI:
       trecipe.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       trecipe.c (2520B)
       ---
            1 #include        "mk.h"
            2 
            3 int
            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 = s->u.ptr;
           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                         if((n->flags&ONLIST) != 0)
           74                                 continue;
           75                         n->flags |= ONLIST;
           76                         n->next = node->next;
           77                         node->next = n;
           78                 }
           79         }
           80         for(n = node->next; n; n = n->next)
           81                 n->flags &= ~ONLIST;
           82         for(n = node; n; n = n->next)
           83                 if((n->flags&READY) == 0)
           84                         return(did);
           85         /*
           86                 gather the params for the job
           87         */
           88         lp.next = ln.next = 0;
           89         for(n = node; n; n = n->next){
           90                 for(a = n->prereqs; a; a = a->next){
           91                         if(a->n){
           92                                 addw(&lp, a->n->name);
           93                                 if(outofdate(n, a, 0)){
           94                                         addw(&ln, a->n->name);
           95                                         if(explain)
           96                                                 fprint(1, "%s(%ld) < %s(%ld)\n",
           97                                                         n->name, n->time, a->n->name, a->n->time);
           98                                 }
           99                         } else {
          100                                 if(explain)
          101                                         fprint(1, "%s has no prerequisites\n",
          102                                                         n->name);
          103                         }
          104                 }
          105                 MADESET(n, BEINGMADE);
          106         }
          107         /*print("lt=%s ln=%s lp=%s\n",wtos(head.next, ' '),wtos(ln.next, ' '),wtos(lp.next, ' '));*/
          108         run(newjob(r, node, aa->stem, aa->match, lp.next, ln.next, head.next, ahead.next));
          109         return(1);
          110 }
          111 
          112 void
          113 addw(Word *w, char *s)
          114 {
          115         Word *lw;
          116 
          117         for(lw = w; w = w->next; lw = w){
          118                 if(strcmp(s, w->s) == 0)
          119                         return;
          120         }
          121         lw->next = newword(s);
          122 }