Blame


1 76193d7c 2003-09-30 devnull #include "mk.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull int runerrs;
4 76193d7c 2003-09-30 devnull
5 76193d7c 2003-09-30 devnull void
6 76193d7c 2003-09-30 devnull mk(char *target)
7 76193d7c 2003-09-30 devnull {
8 76193d7c 2003-09-30 devnull Node *node;
9 76193d7c 2003-09-30 devnull int did = 0;
10 76193d7c 2003-09-30 devnull
11 76193d7c 2003-09-30 devnull nproc(); /* it can be updated dynamically */
12 76193d7c 2003-09-30 devnull nrep(); /* it can be updated dynamically */
13 76193d7c 2003-09-30 devnull runerrs = 0;
14 76193d7c 2003-09-30 devnull node = graph(target);
15 76193d7c 2003-09-30 devnull if(DEBUG(D_GRAPH)){
16 76193d7c 2003-09-30 devnull dumpn("new target\n", node);
17 76193d7c 2003-09-30 devnull Bflush(&bout);
18 76193d7c 2003-09-30 devnull }
19 76193d7c 2003-09-30 devnull clrmade(node);
20 76193d7c 2003-09-30 devnull while(node->flags&NOTMADE){
21 76193d7c 2003-09-30 devnull if(work(node, (Node *)0, (Arc *)0))
22 76193d7c 2003-09-30 devnull did = 1; /* found something to do */
23 76193d7c 2003-09-30 devnull else {
24 76193d7c 2003-09-30 devnull if(waitup(1, (int *)0) > 0){
25 76193d7c 2003-09-30 devnull if(node->flags&(NOTMADE|BEINGMADE)){
26 76193d7c 2003-09-30 devnull assert("must be run errors", runerrs);
27 76193d7c 2003-09-30 devnull break; /* nothing more waiting */
28 76193d7c 2003-09-30 devnull }
29 76193d7c 2003-09-30 devnull }
30 76193d7c 2003-09-30 devnull }
31 76193d7c 2003-09-30 devnull }
32 76193d7c 2003-09-30 devnull if(node->flags&BEINGMADE)
33 76193d7c 2003-09-30 devnull waitup(-1, (int *)0);
34 76193d7c 2003-09-30 devnull while(jobs)
35 76193d7c 2003-09-30 devnull waitup(-2, (int *)0);
36 76193d7c 2003-09-30 devnull assert("target didn't get done", runerrs || (node->flags&MADE));
37 76193d7c 2003-09-30 devnull if(did == 0)
38 76193d7c 2003-09-30 devnull Bprint(&bout, "mk: '%s' is up to date\n", node->name);
39 76193d7c 2003-09-30 devnull }
40 76193d7c 2003-09-30 devnull
41 76193d7c 2003-09-30 devnull void
42 76193d7c 2003-09-30 devnull clrmade(Node *n)
43 76193d7c 2003-09-30 devnull {
44 76193d7c 2003-09-30 devnull Arc *a;
45 76193d7c 2003-09-30 devnull
46 76193d7c 2003-09-30 devnull n->flags &= ~(CANPRETEND|PRETENDING);
47 76193d7c 2003-09-30 devnull if(strchr(n->name, '(') ==0 || n->time)
48 76193d7c 2003-09-30 devnull n->flags |= CANPRETEND;
49 76193d7c 2003-09-30 devnull MADESET(n, NOTMADE);
50 76193d7c 2003-09-30 devnull for(a = n->prereqs; a; a = a->next)
51 76193d7c 2003-09-30 devnull if(a->n)
52 76193d7c 2003-09-30 devnull clrmade(a->n);
53 76193d7c 2003-09-30 devnull }
54 76193d7c 2003-09-30 devnull
55 76193d7c 2003-09-30 devnull static void
56 76193d7c 2003-09-30 devnull unpretend(Node *n)
57 76193d7c 2003-09-30 devnull {
58 76193d7c 2003-09-30 devnull MADESET(n, NOTMADE);
59 76193d7c 2003-09-30 devnull n->flags &= ~(CANPRETEND|PRETENDING);
60 76193d7c 2003-09-30 devnull n->time = 0;
61 76193d7c 2003-09-30 devnull }
62 76193d7c 2003-09-30 devnull
63 d8b652ae 2003-11-23 devnull static char*
64 d8b652ae 2003-11-23 devnull dir(void)
65 d8b652ae 2003-11-23 devnull {
66 d8b652ae 2003-11-23 devnull static char buf[1024];
67 d8b652ae 2003-11-23 devnull
68 d8b652ae 2003-11-23 devnull return getcwd(buf, sizeof buf);
69 d8b652ae 2003-11-23 devnull }
70 d8b652ae 2003-11-23 devnull
71 76193d7c 2003-09-30 devnull int
72 76193d7c 2003-09-30 devnull work(Node *node, Node *p, Arc *parc)
73 76193d7c 2003-09-30 devnull {
74 76193d7c 2003-09-30 devnull Arc *a, *ra;
75 76193d7c 2003-09-30 devnull int weoutofdate;
76 76193d7c 2003-09-30 devnull int ready;
77 76193d7c 2003-09-30 devnull int did = 0;
78 76193d7c 2003-09-30 devnull
79 cbeb0b26 2006-04-01 devnull /*print("work(%s) flags=0x%x time=%ld\n", node->name, node->flags, node->time); */
80 76193d7c 2003-09-30 devnull if(node->flags&BEINGMADE)
81 76193d7c 2003-09-30 devnull return(did);
82 76193d7c 2003-09-30 devnull if((node->flags&MADE) && (node->flags&PRETENDING) && p && outofdate(p, parc, 0)){
83 76193d7c 2003-09-30 devnull if(explain)
84 76193d7c 2003-09-30 devnull fprint(1, "unpretending %s(%ld) because %s is out of date(%ld)\n",
85 76193d7c 2003-09-30 devnull node->name, node->time, p->name, p->time);
86 76193d7c 2003-09-30 devnull unpretend(node);
87 76193d7c 2003-09-30 devnull }
88 76193d7c 2003-09-30 devnull /*
89 76193d7c 2003-09-30 devnull have a look if we are pretending in case
90 76193d7c 2003-09-30 devnull someone has been unpretended out from underneath us
91 76193d7c 2003-09-30 devnull */
92 76193d7c 2003-09-30 devnull if(node->flags&MADE){
93 76193d7c 2003-09-30 devnull if(node->flags&PRETENDING){
94 76193d7c 2003-09-30 devnull node->time = 0;
95 76193d7c 2003-09-30 devnull }else
96 76193d7c 2003-09-30 devnull return(did);
97 76193d7c 2003-09-30 devnull }
98 76193d7c 2003-09-30 devnull /* consider no prerequsite case */
99 76193d7c 2003-09-30 devnull if(node->prereqs == 0){
100 76193d7c 2003-09-30 devnull if(node->time == 0){
101 d8b652ae 2003-11-23 devnull fprint(2, "mk: don't know how to make '%s' in %s\n", node->name, dir());
102 76193d7c 2003-09-30 devnull if(kflag){
103 76193d7c 2003-09-30 devnull node->flags |= BEINGMADE;
104 76193d7c 2003-09-30 devnull runerrs++;
105 76193d7c 2003-09-30 devnull } else
106 76193d7c 2003-09-30 devnull Exit();
107 76193d7c 2003-09-30 devnull } else
108 76193d7c 2003-09-30 devnull MADESET(node, MADE);
109 76193d7c 2003-09-30 devnull return(did);
110 76193d7c 2003-09-30 devnull }
111 76193d7c 2003-09-30 devnull /*
112 76193d7c 2003-09-30 devnull now see if we are out of date or what
113 76193d7c 2003-09-30 devnull */
114 76193d7c 2003-09-30 devnull ready = 1;
115 76193d7c 2003-09-30 devnull weoutofdate = aflag;
116 76193d7c 2003-09-30 devnull ra = 0;
117 76193d7c 2003-09-30 devnull for(a = node->prereqs; a; a = a->next)
118 76193d7c 2003-09-30 devnull if(a->n){
119 76193d7c 2003-09-30 devnull did = work(a->n, node, a) || did;
120 76193d7c 2003-09-30 devnull if(a->n->flags&(NOTMADE|BEINGMADE))
121 76193d7c 2003-09-30 devnull ready = 0;
122 76193d7c 2003-09-30 devnull if(outofdate(node, a, 0)){
123 76193d7c 2003-09-30 devnull weoutofdate = 1;
124 76193d7c 2003-09-30 devnull if((ra == 0) || (ra->n == 0)
125 76193d7c 2003-09-30 devnull || (ra->n->time < a->n->time))
126 76193d7c 2003-09-30 devnull ra = a;
127 76193d7c 2003-09-30 devnull }
128 76193d7c 2003-09-30 devnull } else {
129 76193d7c 2003-09-30 devnull if(node->time == 0){
130 76193d7c 2003-09-30 devnull if(ra == 0)
131 76193d7c 2003-09-30 devnull ra = a;
132 76193d7c 2003-09-30 devnull weoutofdate = 1;
133 76193d7c 2003-09-30 devnull }
134 76193d7c 2003-09-30 devnull }
135 76193d7c 2003-09-30 devnull if(ready == 0) /* can't do anything now */
136 76193d7c 2003-09-30 devnull return(did);
137 76193d7c 2003-09-30 devnull if(weoutofdate == 0){
138 76193d7c 2003-09-30 devnull MADESET(node, MADE);
139 76193d7c 2003-09-30 devnull return(did);
140 76193d7c 2003-09-30 devnull }
141 76193d7c 2003-09-30 devnull /*
142 76193d7c 2003-09-30 devnull can we pretend to be made?
143 76193d7c 2003-09-30 devnull */
144 76193d7c 2003-09-30 devnull if((iflag == 0) && (node->time == 0) && (node->flags&(PRETENDING|CANPRETEND))
145 76193d7c 2003-09-30 devnull && p && ra->n && !outofdate(p, ra, 0)){
146 76193d7c 2003-09-30 devnull node->flags &= ~CANPRETEND;
147 76193d7c 2003-09-30 devnull MADESET(node, MADE);
148 76193d7c 2003-09-30 devnull if(explain && ((node->flags&PRETENDING) == 0))
149 76193d7c 2003-09-30 devnull fprint(1, "pretending %s has time %ld\n", node->name, node->time);
150 76193d7c 2003-09-30 devnull node->flags |= PRETENDING;
151 76193d7c 2003-09-30 devnull return(did);
152 76193d7c 2003-09-30 devnull }
153 76193d7c 2003-09-30 devnull /*
154 76193d7c 2003-09-30 devnull node is out of date and we REALLY do have to do something.
155 76193d7c 2003-09-30 devnull quickly rescan for pretenders
156 76193d7c 2003-09-30 devnull */
157 76193d7c 2003-09-30 devnull for(a = node->prereqs; a; a = a->next)
158 76193d7c 2003-09-30 devnull if(a->n && (a->n->flags&PRETENDING)){
159 76193d7c 2003-09-30 devnull if(explain)
160 76193d7c 2003-09-30 devnull Bprint(&bout, "unpretending %s because of %s because of %s\n",
161 76193d7c 2003-09-30 devnull a->n->name, node->name, ra->n? ra->n->name : "rule with no prerequisites");
162 76193d7c 2003-09-30 devnull
163 76193d7c 2003-09-30 devnull unpretend(a->n);
164 76193d7c 2003-09-30 devnull did = work(a->n, node, a) || did;
165 76193d7c 2003-09-30 devnull ready = 0;
166 76193d7c 2003-09-30 devnull }
167 76193d7c 2003-09-30 devnull if(ready == 0) /* try later unless nothing has happened for -k's sake */
168 76193d7c 2003-09-30 devnull return(did || work(node, p, parc));
169 76193d7c 2003-09-30 devnull did = dorecipe(node) || did;
170 76193d7c 2003-09-30 devnull return(did);
171 76193d7c 2003-09-30 devnull }
172 76193d7c 2003-09-30 devnull
173 76193d7c 2003-09-30 devnull void
174 76193d7c 2003-09-30 devnull update(int fake, Node *node)
175 76193d7c 2003-09-30 devnull {
176 76193d7c 2003-09-30 devnull Arc *a;
177 76193d7c 2003-09-30 devnull
178 76193d7c 2003-09-30 devnull MADESET(node, fake? BEINGMADE : MADE);
179 76193d7c 2003-09-30 devnull if(((node->flags&VIRTUAL) == 0) && (access(node->name, 0) == 0)){
180 76193d7c 2003-09-30 devnull node->time = timeof(node->name, 1);
181 76193d7c 2003-09-30 devnull node->flags &= ~(CANPRETEND|PRETENDING);
182 76193d7c 2003-09-30 devnull for(a = node->prereqs; a; a = a->next)
183 76193d7c 2003-09-30 devnull if(a->prog)
184 76193d7c 2003-09-30 devnull outofdate(node, a, 1);
185 76193d7c 2003-09-30 devnull } else {
186 76193d7c 2003-09-30 devnull node->time = 1;
187 76193d7c 2003-09-30 devnull for(a = node->prereqs; a; a = a->next)
188 76193d7c 2003-09-30 devnull if(a->n && outofdate(node, a, 1))
189 76193d7c 2003-09-30 devnull node->time = a->n->time;
190 76193d7c 2003-09-30 devnull }
191 cbeb0b26 2006-04-01 devnull /* print("----node %s time=%ld flags=0x%x\n", node->name, node->time, node->flags);*/
192 76193d7c 2003-09-30 devnull }
193 76193d7c 2003-09-30 devnull
194 76193d7c 2003-09-30 devnull static int
195 9aa1c92f 2005-01-04 devnull pcmp(char *prog, char *p, char *q, Shell *sh, Word *shcmd)
196 76193d7c 2003-09-30 devnull {
197 76193d7c 2003-09-30 devnull char buf[3*NAMEBLOCK];
198 76193d7c 2003-09-30 devnull int pid;
199 76193d7c 2003-09-30 devnull
200 76193d7c 2003-09-30 devnull Bflush(&bout);
201 92a0a8b6 2004-04-21 devnull snprint(buf, sizeof buf, "%s '%s' '%s'\n", prog, p, q);
202 86ce4ced 2011-08-28 rsc pid = pipecmd(buf, envy, 0, sh, shcmd);
203 76193d7c 2003-09-30 devnull while(waitup(-3, &pid) >= 0)
204 76193d7c 2003-09-30 devnull ;
205 76193d7c 2003-09-30 devnull return(pid? 2:1);
206 76193d7c 2003-09-30 devnull }
207 76193d7c 2003-09-30 devnull
208 76193d7c 2003-09-30 devnull int
209 76193d7c 2003-09-30 devnull outofdate(Node *node, Arc *arc, int eval)
210 76193d7c 2003-09-30 devnull {
211 76193d7c 2003-09-30 devnull char buf[3*NAMEBLOCK], *str;
212 76193d7c 2003-09-30 devnull Symtab *sym;
213 76193d7c 2003-09-30 devnull int ret;
214 76193d7c 2003-09-30 devnull
215 76193d7c 2003-09-30 devnull str = 0;
216 76193d7c 2003-09-30 devnull if(arc->prog){
217 92a0a8b6 2004-04-21 devnull snprint(buf, sizeof buf, "%s%c%s", node->name, 0377, arc->n->name);
218 76193d7c 2003-09-30 devnull sym = symlook(buf, S_OUTOFDATE, 0);
219 76193d7c 2003-09-30 devnull if(sym == 0 || eval){
220 76193d7c 2003-09-30 devnull if(sym == 0)
221 76193d7c 2003-09-30 devnull str = strdup(buf);
222 9aa1c92f 2005-01-04 devnull ret = pcmp(arc->prog, node->name, arc->n->name, arc->r->shellt, arc->r->shellcmd);
223 76193d7c 2003-09-30 devnull if(sym)
224 3fe9465a 2006-04-20 devnull sym->u.value = ret;
225 76193d7c 2003-09-30 devnull else
226 63b581e3 2007-03-26 devnull symlook(str, S_OUTOFDATE, (void *)(uintptr)ret);
227 76193d7c 2003-09-30 devnull } else
228 3fe9465a 2006-04-20 devnull ret = sym->u.value;
229 76193d7c 2003-09-30 devnull return(ret-1);
230 76193d7c 2003-09-30 devnull } else if(strchr(arc->n->name, '(') && arc->n->time == 0) /* missing archive member */
231 76193d7c 2003-09-30 devnull return 1;
232 76193d7c 2003-09-30 devnull else
233 fe4b07f1 2005-08-10 devnull return node->time <= arc->n->time;
234 76193d7c 2003-09-30 devnull }