Introduction
Introduction Statistics Contact Development Disclaimer Help
recipe.c - 9base - revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log
Files
Refs
README
LICENSE
---
recipe.c (2393B)
---
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->…
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'\…
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 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 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(…
92 n->name, n->time…
93 }
94 } else {
95 if(explain)
96 fprint(1, "%s has no prerequisit…
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,…
103 run(newjob(r, node, aa->stem, aa->match, lp.next, ln.next, head.…
104 return(1);
105 }
106
107 void
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 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.