File tree Expand file tree Collapse file tree 2 files changed +45
-0
lines changed
Expand file tree Collapse file tree 2 files changed +45
-0
lines changed Original file line number Diff line number Diff 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+
149192void
150193buildadd (struct node * n )
151194{
Original file line number Diff line number Diff line change @@ -12,5 +12,7 @@ extern struct buildoptions buildopts;
1212void buildreset (void );
1313/* schedule a particular target to be built */
1414void buildadd (struct node * );
15+ /* reschedule a particular target to be built */
16+ void buildupdate (struct node * );
1517/* execute rules to build the scheduled targets */
1618void build (void );
You can’t perform that action at this time.
0 commit comments