11
nproc(); /* it can be updated dynamically */
12
nrep(); /* it can be updated dynamically */
16
dumpn("new target\n", node);
20
while(node->flags&NOTMADE){
21
if(work(node, (Node *)0, (Arc *)0))
22
did = 1; /* found something to do */
24
if(waitup(1, (int *)0) > 0){
25
if(node->flags&(NOTMADE|BEINGMADE)){
26
assert("must be run errors", runerrs);
27
break; /* nothing more waiting */
32
if(node->flags&BEINGMADE)
36
assert("target didn't get done", runerrs || (node->flags&MADE));
38
Bprint(&bout, "mk: '%s' is up to date\n", node->name);
46
n->flags &= ~(CANPRETEND|PRETENDING);
47
if(strchr(n->name, '(') ==0 || n->time)
48
n->flags |= CANPRETEND;
50
for(a = n->prereqs; a; a = a->next)
59
n->flags &= ~(CANPRETEND|PRETENDING);
66
static char buf[1024];
68
return getcwd(buf, sizeof buf);
72
work(Node *node, Node *p, Arc *parc)
79
/*print("work(%s) flags=0x%x time=%ld\n", node->name, node->flags, node->time); */
80
if(node->flags&BEINGMADE)
82
if((node->flags&MADE) && (node->flags&PRETENDING) && p && outofdate(p, parc, 0)){
84
fprint(1, "unpretending %s(%ld) because %s is out of date(%ld)\n",
85
node->name, node->time, p->name, p->time);
89
have a look if we are pretending in case
90
someone has been unpretended out from underneath us
93
if(node->flags&PRETENDING){
98
/* consider no prerequsite case */
99
if(node->prereqs == 0){
101
fprint(2, "mk: don't know how to make '%s' in %s\n", node->name, dir());
103
node->flags |= BEINGMADE;
112
now see if we are out of date or what
117
for(a = node->prereqs; a; a = a->next)
119
did = work(a->n, node, a) || did;
120
if(a->n->flags&(NOTMADE|BEINGMADE))
122
if(outofdate(node, a, 0)){
124
if((ra == 0) || (ra->n == 0)
125
|| (ra->n->time < a->n->time))
135
if(ready == 0) /* can't do anything now */
137
if(weoutofdate == 0){
142
can we pretend to be made?
144
if((iflag == 0) && (node->time == 0) && (node->flags&(PRETENDING|CANPRETEND))
145
&& p && ra->n && !outofdate(p, ra, 0)){
146
node->flags &= ~CANPRETEND;
148
if(explain && ((node->flags&PRETENDING) == 0))
149
fprint(1, "pretending %s has time %ld\n", node->name, node->time);
150
node->flags |= PRETENDING;
154
node is out of date and we REALLY do have to do something.
155
quickly rescan for pretenders
157
for(a = node->prereqs; a; a = a->next)
158
if(a->n && (a->n->flags&PRETENDING)){
160
Bprint(&bout, "unpretending %s because of %s because of %s\n",
161
a->n->name, node->name, ra->n? ra->n->name : "rule with no prerequisites");
164
did = work(a->n, node, a) || did;
167
if(ready == 0) /* try later unless nothing has happened for -k's sake */
168
return(did || work(node, p, parc));
169
did = dorecipe(node) || did;
174
update(int fake, Node *node)
178
MADESET(node, fake? BEINGMADE : MADE);
179
if(((node->flags&VIRTUAL) == 0) && (access(node->name, 0) == 0)){
180
node->time = timeof(node->name, 1);
181
node->flags &= ~(CANPRETEND|PRETENDING);
182
for(a = node->prereqs; a; a = a->next)
184
outofdate(node, a, 1);
187
for(a = node->prereqs; a; a = a->next)
188
if(a->n && outofdate(node, a, 1))
189
node->time = a->n->time;
191
/* print("----node %s time=%ld flags=0x%x\n", node->name, node->time, node->flags);*/
195
pcmp(char *prog, char *p, char *q, Shell *sh, Word *shcmd)
197
char buf[3*NAMEBLOCK];
201
snprint(buf, sizeof buf, "%s '%s' '%s'\n", prog, p, q);
202
pid = pipecmd(buf, 0, 0, sh, shcmd);
203
while(waitup(-3, &pid) >= 0)
209
outofdate(Node *node, Arc *arc, int eval)
211
char buf[3*NAMEBLOCK], *str;
217
snprint(buf, sizeof buf, "%s%c%s", node->name, 0377, arc->n->name);
218
sym = symlook(buf, S_OUTOFDATE, 0);
219
if(sym == 0 || eval){
222
ret = pcmp(arc->prog, node->name, arc->n->name, arc->r->shellt, arc->r->shellcmd);
226
symlook(str, S_OUTOFDATE, (void *)(uintptr)ret);
230
} else if(strchr(arc->n->name, '(') && arc->n->time == 0) /* missing archive member */
233
return node->time <= arc->n->time;