Skip to content

Commit ed567a1

Browse files
committed
build: add buildupdate function used by dyndeps
1 parent e8d4fe8 commit ed567a1

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

build.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,49 @@ computedirty(struct edge *e, struct node *newest)
146146
}
147147
}
148148

149+
void
150+
buildupdate(struct node *n)
151+
{
152+
struct edge *e;
153+
struct node *newest;
154+
size_t i;
155+
156+
e = n->gen;
157+
if (e->flags & FLAG_CYCLE)
158+
fatal("dependency cycle involving '%s'", n->path->s);
159+
e->flags |= FLAG_CYCLE | FLAG_WORK;
160+
for (i = e->outdynidx; i < e->nout; ++i) {
161+
n = e->out[i];
162+
if (n->mtime == MTIME_UNKNOWN) {
163+
n->dirty = false;
164+
nodestat(n);
165+
}
166+
}
167+
newest = NULL;
168+
for (i = e->indynidx; i < e->inorderidx; ++i) {
169+
n = e->in[i];
170+
buildadd(n);
171+
if (i < e->inorderidx) {
172+
if (n->dirty)
173+
e->flags |= FLAG_DIRTY_IN;
174+
if (n->mtime != MTIME_MISSING && !isnewer(newest, n))
175+
newest = n;
176+
}
177+
if (n->dirty || (n->gen && n->gen->nblock > 0))
178+
++e->nblock;
179+
}
180+
computedirty(e, newest);
181+
if (!(e->flags & FLAG_DIRTY_OUT))
182+
e->nprune = e->nblock;
183+
if (!(e->flags & FLAG_DIRTY_OUT))
184+
e->nprune = e->nblock;
185+
if (e->flags & FLAG_DIRTY) {
186+
if (e->nblock == 0)
187+
queue(e);
188+
}
189+
e->flags &= ~FLAG_CYCLE;
190+
}
191+
149192
void
150193
buildadd(struct node *n)
151194
{

build.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,7 @@ extern struct buildoptions buildopts;
1212
void buildreset(void);
1313
/* schedule a particular target to be built */
1414
void buildadd(struct node *);
15+
/* reschedule a particular target to be built */
16+
void buildupdate(struct node *);
1517
/* execute rules to build the scheduled targets */
1618
void build(void);

0 commit comments

Comments
 (0)