xref: /netbsd-src/usr.bin/make/make.c (revision 53b02e147d4ed531c0d2a5ca9b3e8026ba3e99b5)
1 /*	$NetBSD: make.c,v 1.250 2021/12/27 18:26:22 rillig Exp $	*/
2 
3 /*
4  * Copyright (c) 1988, 1989, 1990, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * This code is derived from software contributed to Berkeley by
8  * Adam de Boor.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. Neither the name of the University nor the names of its contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34 
35 /*
36  * Copyright (c) 1989 by Berkeley Softworks
37  * All rights reserved.
38  *
39  * This code is derived from software contributed to Berkeley by
40  * Adam de Boor.
41  *
42  * Redistribution and use in source and binary forms, with or without
43  * modification, are permitted provided that the following conditions
44  * are met:
45  * 1. Redistributions of source code must retain the above copyright
46  *    notice, this list of conditions and the following disclaimer.
47  * 2. Redistributions in binary form must reproduce the above copyright
48  *    notice, this list of conditions and the following disclaimer in the
49  *    documentation and/or other materials provided with the distribution.
50  * 3. All advertising materials mentioning features or use of this software
51  *    must display the following acknowledgement:
52  *	This product includes software developed by the University of
53  *	California, Berkeley and its contributors.
54  * 4. Neither the name of the University nor the names of its contributors
55  *    may be used to endorse or promote products derived from this software
56  *    without specific prior written permission.
57  *
58  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
59  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
60  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
61  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
62  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
63  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
64  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
65  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
66  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
67  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
68  * SUCH DAMAGE.
69  */
70 
71 /*
72  * Examination of targets and their suitability for creation.
73  *
74  * Interface:
75  *	Make_Run	Initialize things for the module. Returns true if
76  *			work was (or would have been) done.
77  *
78  *	Make_Update	After a target is made, update all its parents.
79  *			Perform various bookkeeping chores like the updating
80  *			of the youngestChild field of the parent, filling
81  *			of the IMPSRC variable, etc. Place the parent on the
82  *			toBeMade queue if it should be.
83  *
84  *	GNode_UpdateYoungestChild
85  *			Update the node's youngestChild field based on the
86  *			child's modification time.
87  *
88  *	GNode_SetLocalVars
89  *			Set up the various local variables for a
90  *			target, including the .ALLSRC variable, making
91  *			sure that any variable that needs to exist
92  *			at the very least has the empty value.
93  *
94  *	GNode_IsOODate	Determine if a target is out-of-date.
95  *
96  *	Make_HandleUse	See if a child is a .USE node for a parent
97  *			and perform the .USE actions if so.
98  *
99  *	Make_ExpandUse	Expand .USE nodes
100  */
101 
102 #include "make.h"
103 #include "dir.h"
104 #include "job.h"
105 
106 /*	"@(#)make.c	8.1 (Berkeley) 6/6/93"	*/
107 MAKE_RCSID("$NetBSD: make.c,v 1.250 2021/12/27 18:26:22 rillig Exp $");
108 
109 /* Sequence # to detect recursion. */
110 static unsigned int checked_seqno = 1;
111 
112 /*
113  * The current fringe of the graph.
114  * These are nodes which await examination by MakeOODate.
115  * It is added to by Make_Update and subtracted from by MakeStartJobs
116  */
117 static GNodeList toBeMade = LST_INIT;
118 
119 
120 void
121 debug_printf(const char *fmt, ...)
122 {
123 	va_list args;
124 
125 	va_start(args, fmt);
126 	vfprintf(opts.debug_file, fmt, args);
127 	va_end(args);
128 }
129 
130 MAKE_ATTR_DEAD static void
131 make_abort(GNode *gn, int lineno)
132 {
133 
134 	debug_printf("make_abort from line %d\n", lineno);
135 	Targ_PrintNode(gn, 2);
136 	Targ_PrintNodes(&toBeMade, 2);
137 	Targ_PrintGraph(3);
138 	abort();
139 }
140 
141 static const char *
142 GNodeType_ToString(GNodeType type, void **freeIt)
143 {
144 	Buffer buf;
145 
146 	Buf_InitSize(&buf, 32);
147 #define ADD(flag) Buf_AddFlag(&buf, (type & (flag)) != OP_NONE, #flag)
148 	ADD(OP_DEPENDS);
149 	ADD(OP_FORCE);
150 	ADD(OP_DOUBLEDEP);
151 	ADD(OP_OPTIONAL);
152 	ADD(OP_USE);
153 	ADD(OP_EXEC);
154 	ADD(OP_IGNORE);
155 	ADD(OP_PRECIOUS);
156 	ADD(OP_SILENT);
157 	ADD(OP_MAKE);
158 	ADD(OP_JOIN);
159 	ADD(OP_MADE);
160 	ADD(OP_SPECIAL);
161 	ADD(OP_USEBEFORE);
162 	ADD(OP_INVISIBLE);
163 	ADD(OP_NOTMAIN);
164 	ADD(OP_PHONY);
165 	ADD(OP_NOPATH);
166 	ADD(OP_WAIT);
167 	ADD(OP_NOMETA);
168 	ADD(OP_META);
169 	ADD(OP_NOMETA_CMP);
170 	ADD(OP_SUBMAKE);
171 	ADD(OP_TRANSFORM);
172 	ADD(OP_MEMBER);
173 	ADD(OP_LIB);
174 	ADD(OP_ARCHV);
175 	ADD(OP_HAS_COMMANDS);
176 	ADD(OP_SAVE_CMDS);
177 	ADD(OP_DEPS_FOUND);
178 	ADD(OP_MARK);
179 #undef ADD
180 	return buf.len == 0 ? "none" : (*freeIt = Buf_DoneData(&buf));
181 }
182 
183 static const char *
184 GNodeFlags_ToString(GNodeFlags flags, void **freeIt)
185 {
186 	Buffer buf;
187 
188 	Buf_InitSize(&buf, 32);
189 #define ADD(flag, name) Buf_AddFlag(&buf, flags.flag, name)
190 	ADD(remake, "REMAKE");
191 	ADD(childMade, "CHILDMADE");
192 	ADD(force, "FORCE");
193 	ADD(doneWait, "DONE_WAIT");
194 	ADD(doneOrder, "DONE_ORDER");
195 	ADD(fromDepend, "FROM_DEPEND");
196 	ADD(doneAllsrc, "DONE_ALLSRC");
197 	ADD(cycle, "CYCLE");
198 	ADD(doneCycle, "DONECYCLE");
199 #undef ADD
200 	return buf.len == 0 ? "none" : (*freeIt = Buf_DoneData(&buf));
201 }
202 
203 void
204 GNode_FprintDetails(FILE *f, const char *prefix, const GNode *gn,
205 		    const char *suffix)
206 {
207 	void *type_freeIt = NULL;
208 	void *flags_freeIt = NULL;
209 
210 	fprintf(f, "%s%s, type %s, flags %s%s",
211 	    prefix,
212 	    GNodeMade_Name(gn->made),
213 	    GNodeType_ToString(gn->type, &type_freeIt),
214 	    GNodeFlags_ToString(gn->flags, &flags_freeIt),
215 	    suffix);
216 	free(type_freeIt);
217 	free(flags_freeIt);
218 }
219 
220 bool
221 GNode_ShouldExecute(GNode *gn)
222 {
223 	return !((gn->type & OP_MAKE)
224 	    ? opts.noRecursiveExecute
225 	    : opts.noExecute);
226 }
227 
228 /* Update the youngest child of the node, according to the given child. */
229 void
230 GNode_UpdateYoungestChild(GNode *gn, GNode *cgn)
231 {
232 	if (gn->youngestChild == NULL || cgn->mtime > gn->youngestChild->mtime)
233 		gn->youngestChild = cgn;
234 }
235 
236 static bool
237 IsOODateRegular(GNode *gn)
238 {
239 	/* These rules are inherited from the original Make. */
240 
241 	if (gn->youngestChild != NULL) {
242 		if (gn->mtime < gn->youngestChild->mtime) {
243 			DEBUG1(MAKE, "modified before source \"%s\"...",
244 			    GNode_Path(gn->youngestChild));
245 			return true;
246 		}
247 		return false;
248 	}
249 
250 	if (gn->mtime == 0 && !(gn->type & OP_OPTIONAL)) {
251 		DEBUG0(MAKE, "nonexistent and no sources...");
252 		return true;
253 	}
254 
255 	if (gn->type & OP_DOUBLEDEP) {
256 		DEBUG0(MAKE, ":: operator and no sources...");
257 		return true;
258 	}
259 
260 	return false;
261 }
262 
263 /*
264  * See if the node is out of date with respect to its sources.
265  *
266  * Used by Make_Run when deciding which nodes to place on the
267  * toBeMade queue initially and by Make_Update to screen out .USE and
268  * .EXEC nodes. In the latter case, however, any other sort of node
269  * must be considered out-of-date since at least one of its children
270  * will have been recreated.
271  *
272  * The mtime field of the node and the youngestChild field of its parents
273  * may be changed.
274  */
275 bool
276 GNode_IsOODate(GNode *gn)
277 {
278 	bool oodate;
279 
280 	/*
281 	 * Certain types of targets needn't even be sought as their datedness
282 	 * doesn't depend on their modification time...
283 	 */
284 	if (!(gn->type & (OP_JOIN | OP_USE | OP_USEBEFORE | OP_EXEC))) {
285 		Dir_UpdateMTime(gn, true);
286 		if (DEBUG(MAKE)) {
287 			if (gn->mtime != 0)
288 				debug_printf("modified %s...",
289 				    Targ_FmtTime(gn->mtime));
290 			else
291 				debug_printf("nonexistent...");
292 		}
293 	}
294 
295 	/*
296 	 * A target is remade in one of the following circumstances:
297 	 *
298 	 *	its modification time is smaller than that of its youngest
299 	 *	child and it would actually be run (has commands or is not
300 	 *	GNode_IsTarget)
301 	 *
302 	 *	it's the object of a force operator
303 	 *
304 	 *	it has no children, was on the lhs of an operator and doesn't
305 	 *	exist already.
306 	 *
307 	 * Libraries are only considered out-of-date if the archive module
308 	 * says they are.
309 	 *
310 	 * These weird rules are brought to you by Backward-Compatibility
311 	 * and the strange people who wrote 'Make'.
312 	 */
313 	if (gn->type & (OP_USE | OP_USEBEFORE)) {
314 		/*
315 		 * If the node is a USE node it is *never* out of date
316 		 * no matter *what*.
317 		 */
318 		DEBUG0(MAKE, ".USE node...");
319 		oodate = false;
320 	} else if ((gn->type & OP_LIB) && (gn->mtime == 0 || Arch_IsLib(gn))) {
321 		DEBUG0(MAKE, "library...");
322 
323 		/*
324 		 * always out of date if no children and :: target
325 		 * or nonexistent.
326 		 */
327 		oodate = (gn->mtime == 0 || Arch_LibOODate(gn) ||
328 			  (gn->youngestChild == NULL &&
329 			   (gn->type & OP_DOUBLEDEP)));
330 	} else if (gn->type & OP_JOIN) {
331 		/*
332 		 * A target with the .JOIN attribute is only considered
333 		 * out-of-date if any of its children was out-of-date.
334 		 */
335 		DEBUG0(MAKE, ".JOIN node...");
336 		DEBUG1(MAKE, "source %smade...",
337 		    gn->flags.childMade ? "" : "not ");
338 		oodate = gn->flags.childMade;
339 	} else if (gn->type & (OP_FORCE | OP_EXEC | OP_PHONY)) {
340 		/*
341 		 * A node which is the object of the force (!) operator or
342 		 * which has the .EXEC attribute is always considered
343 		 * out-of-date.
344 		 */
345 		if (DEBUG(MAKE)) {
346 			if (gn->type & OP_FORCE) {
347 				debug_printf("! operator...");
348 			} else if (gn->type & OP_PHONY) {
349 				debug_printf(".PHONY node...");
350 			} else {
351 				debug_printf(".EXEC node...");
352 			}
353 		}
354 		oodate = true;
355 	} else if (IsOODateRegular(gn)) {
356 		oodate = true;
357 	} else {
358 		/*
359 		 * When a nonexistent child with no sources
360 		 * (such as a typically used FORCE source) has been made and
361 		 * the target of the child (usually a directory) has the same
362 		 * timestamp as the timestamp just given to the nonexistent
363 		 * child after it was considered made.
364 		 */
365 		if (DEBUG(MAKE)) {
366 			if (gn->flags.force)
367 				debug_printf("non existing child...");
368 		}
369 		oodate = gn->flags.force;
370 	}
371 
372 #ifdef USE_META
373 	if (useMeta) {
374 		oodate = meta_oodate(gn, oodate);
375 	}
376 #endif
377 
378 	/*
379 	 * If the target isn't out-of-date, the parents need to know its
380 	 * modification time. Note that targets that appear to be out-of-date
381 	 * but aren't, because they have no commands and are GNode_IsTarget,
382 	 * have their mtime stay below their children's mtime to keep parents
383 	 * from thinking they're out-of-date.
384 	 */
385 	if (!oodate) {
386 		GNodeListNode *ln;
387 		for (ln = gn->parents.first; ln != NULL; ln = ln->next)
388 			GNode_UpdateYoungestChild(ln->datum, gn);
389 	}
390 
391 	return oodate;
392 }
393 
394 static void
395 PretendAllChildrenAreMade(GNode *pgn)
396 {
397 	GNodeListNode *ln;
398 
399 	for (ln = pgn->children.first; ln != NULL; ln = ln->next) {
400 		GNode *cgn = ln->datum;
401 
402 		/* This may also update cgn->path. */
403 		Dir_UpdateMTime(cgn, false);
404 		GNode_UpdateYoungestChild(pgn, cgn);
405 		pgn->unmade--;
406 	}
407 }
408 
409 /*
410  * Called by Make_Run and SuffApplyTransform on the downward pass to handle
411  * .USE and transformation nodes, by copying the child node's commands, type
412  * flags and children to the parent node.
413  *
414  * A .USE node is much like an explicit transformation rule, except its
415  * commands are always added to the target node, even if the target already
416  * has commands.
417  *
418  * Input:
419  *	cgn		The source node, which is either a .USE/.USEBEFORE
420  *			node or a transformation node (OP_TRANSFORM).
421  *	pgn		The target node
422  */
423 void
424 Make_HandleUse(GNode *cgn, GNode *pgn)
425 {
426 	GNodeListNode *ln;	/* An element in the children list */
427 
428 #ifdef DEBUG_SRC
429 	if (!(cgn->type & (OP_USE | OP_USEBEFORE | OP_TRANSFORM))) {
430 		debug_printf("Make_HandleUse: called for plain node %s\n",
431 		    cgn->name);
432 		/* XXX: debug mode should not affect control flow */
433 		return;
434 	}
435 #endif
436 
437 	if ((cgn->type & (OP_USE | OP_USEBEFORE)) ||
438 	    Lst_IsEmpty(&pgn->commands)) {
439 		if (cgn->type & OP_USEBEFORE) {
440 			/* .USEBEFORE */
441 			Lst_PrependAll(&pgn->commands, &cgn->commands);
442 		} else {
443 			/* .USE, or target has no commands */
444 			Lst_AppendAll(&pgn->commands, &cgn->commands);
445 		}
446 	}
447 
448 	for (ln = cgn->children.first; ln != NULL; ln = ln->next) {
449 		GNode *gn = ln->datum;
450 
451 		/*
452 		 * Expand variables in the .USE node's name
453 		 * and save the unexpanded form.
454 		 * We don't need to do this for commands.
455 		 * They get expanded properly when we execute.
456 		 */
457 		if (gn->uname == NULL) {
458 			gn->uname = gn->name;
459 		} else {
460 			free(gn->name);
461 		}
462 		(void)Var_Subst(gn->uname, pgn, VARE_WANTRES, &gn->name);
463 		/* TODO: handle errors */
464 		if (gn->uname != NULL && strcmp(gn->name, gn->uname) != 0) {
465 			/* See if we have a target for this node. */
466 			GNode *tgn = Targ_FindNode(gn->name);
467 			if (tgn != NULL)
468 				gn = tgn;
469 		}
470 
471 		Lst_Append(&pgn->children, gn);
472 		Lst_Append(&gn->parents, pgn);
473 		pgn->unmade++;
474 	}
475 
476 	pgn->type |=
477 	    cgn->type & ~(OP_OPMASK | OP_USE | OP_USEBEFORE | OP_TRANSFORM);
478 }
479 
480 /*
481  * Used by Make_Run on the downward pass to handle .USE nodes. Should be
482  * called before the children are enqueued to be looked at by MakeAddChild.
483  *
484  * For a .USE child, the commands, type flags and children are copied to the
485  * parent node, and since the relation to the .USE node is then no longer
486  * needed, that relation is removed.
487  *
488  * Input:
489  *	cgn		the child, which may be a .USE node
490  *	pgn		the current parent
491  */
492 static void
493 MakeHandleUse(GNode *cgn, GNode *pgn, GNodeListNode *ln)
494 {
495 	bool unmarked;
496 
497 	unmarked = !(cgn->type & OP_MARK);
498 	cgn->type |= OP_MARK;
499 
500 	if (!(cgn->type & (OP_USE | OP_USEBEFORE)))
501 		return;
502 
503 	if (unmarked)
504 		Make_HandleUse(cgn, pgn);
505 
506 	/*
507 	 * This child node is now "made", so we decrement the count of
508 	 * unmade children in the parent... We also remove the child
509 	 * from the parent's list to accurately reflect the number of decent
510 	 * children the parent has. This is used by Make_Run to decide
511 	 * whether to queue the parent or examine its children...
512 	 */
513 	Lst_Remove(&pgn->children, ln);
514 	pgn->unmade--;
515 }
516 
517 static void
518 HandleUseNodes(GNode *gn)
519 {
520 	GNodeListNode *ln, *nln;
521 	for (ln = gn->children.first; ln != NULL; ln = nln) {
522 		nln = ln->next;
523 		MakeHandleUse(ln->datum, gn, ln);
524 	}
525 }
526 
527 
528 /*
529  * Check the modification time of a gnode, and update it if necessary.
530  * Return 0 if the gnode does not exist, or its filesystem time if it does.
531  */
532 time_t
533 Make_Recheck(GNode *gn)
534 {
535 	time_t mtime;
536 
537 	Dir_UpdateMTime(gn, true);
538 	mtime = gn->mtime;
539 
540 #ifndef RECHECK
541 	/*
542 	 * We can't re-stat the thing, but we can at least take care of rules
543 	 * where a target depends on a source that actually creates the
544 	 * target, but only if it has changed, e.g.
545 	 *
546 	 * parse.h : parse.o
547 	 *
548 	 * parse.o : parse.y
549 	 *		yacc -d parse.y
550 	 *		cc -c y.tab.c
551 	 *		mv y.tab.o parse.o
552 	 *		cmp -s y.tab.h parse.h || mv y.tab.h parse.h
553 	 *
554 	 * In this case, if the definitions produced by yacc haven't changed
555 	 * from before, parse.h won't have been updated and gn->mtime will
556 	 * reflect the current modification time for parse.h. This is
557 	 * something of a kludge, I admit, but it's a useful one.
558 	 *
559 	 * XXX: People like to use a rule like "FRC:" to force things that
560 	 * depend on FRC to be made, so we have to check for gn->children
561 	 * being empty as well.
562 	 */
563 	if (!Lst_IsEmpty(gn->commands) || Lst_IsEmpty(gn->children)) {
564 		gn->mtime = now;
565 	}
566 #else
567 	/*
568 	 * This is what Make does and it's actually a good thing, as it
569 	 * allows rules like
570 	 *
571 	 *	cmp -s y.tab.h parse.h || cp y.tab.h parse.h
572 	 *
573 	 * to function as intended. Unfortunately, thanks to the stateless
574 	 * nature of NFS (by which I mean the loose coupling of two clients
575 	 * using the same file from a common server), there are times when
576 	 * the modification time of a file created on a remote machine
577 	 * will not be modified before the local stat() implied by the
578 	 * Dir_UpdateMTime occurs, thus leading us to believe that the file
579 	 * is unchanged, wreaking havoc with files that depend on this one.
580 	 *
581 	 * I have decided it is better to make too much than to make too
582 	 * little, so this stuff is commented out unless you're sure it's ok.
583 	 * -- ardeb 1/12/88
584 	 */
585 	/*
586 	 * Christos, 4/9/92: If we are saving commands, pretend that
587 	 * the target is made now. Otherwise archives with '...' rules
588 	 * don't work!
589 	 */
590 	if (!GNode_ShouldExecute(gn) || (gn->type & OP_SAVE_CMDS) ||
591 	    (mtime == 0 && !(gn->type & OP_WAIT))) {
592 		DEBUG2(MAKE, " recheck(%s): update time from %s to now\n",
593 		    gn->name,
594 		    gn->mtime == 0 ? "nonexistent" : Targ_FmtTime(gn->mtime));
595 		gn->mtime = now;
596 	} else {
597 		DEBUG2(MAKE, " recheck(%s): current update time: %s\n",
598 		    gn->name, Targ_FmtTime(gn->mtime));
599 	}
600 #endif
601 
602 	/*
603 	 * XXX: The returned mtime may differ from gn->mtime. Intentionally?
604 	 */
605 	return mtime;
606 }
607 
608 /*
609  * Set the .PREFIX and .IMPSRC variables for all the implied parents
610  * of this node.
611  */
612 static void
613 UpdateImplicitParentsVars(GNode *cgn, const char *cname)
614 {
615 	GNodeListNode *ln;
616 	const char *cpref = GNode_VarPrefix(cgn);
617 
618 	for (ln = cgn->implicitParents.first; ln != NULL; ln = ln->next) {
619 		GNode *pgn = ln->datum;
620 		if (pgn->flags.remake) {
621 			Var_Set(pgn, IMPSRC, cname);
622 			if (cpref != NULL)
623 				Var_Set(pgn, PREFIX, cpref);
624 		}
625 	}
626 }
627 
628 /* See if a .ORDER rule stops us from building this node. */
629 static bool
630 IsWaitingForOrder(GNode *gn)
631 {
632 	GNodeListNode *ln;
633 
634 	for (ln = gn->order_pred.first; ln != NULL; ln = ln->next) {
635 		GNode *ogn = ln->datum;
636 
637 		if (GNode_IsDone(ogn) || !ogn->flags.remake)
638 			continue;
639 
640 		DEBUG2(MAKE,
641 		    "IsWaitingForOrder: Waiting for .ORDER node \"%s%s\"\n",
642 		    ogn->name, ogn->cohort_num);
643 		return true;
644 	}
645 	return false;
646 }
647 
648 static void MakeBuildParent(GNode *, GNodeListNode *);
649 
650 static void
651 ScheduleOrderSuccessors(GNode *gn)
652 {
653 	GNodeListNode *toBeMadeNext = toBeMade.first;
654 	GNodeListNode *ln;
655 
656 	for (ln = gn->order_succ.first; ln != NULL; ln = ln->next)
657 		MakeBuildParent(ln->datum, toBeMadeNext);
658 }
659 
660 /*
661  * Perform update on the parents of a node. Used by JobFinish once
662  * a node has been dealt with and by MakeStartJobs if it finds an
663  * up-to-date node.
664  *
665  * The unmade field of pgn is decremented and pgn may be placed on
666  * the toBeMade queue if this field becomes 0.
667  *
668  * If the child was made, the parent's flag CHILDMADE field will be
669  * set true.
670  *
671  * If the child is not up-to-date and still does not exist,
672  * set the FORCE flag on the parents.
673  *
674  * If the child wasn't made, the youngestChild field of the parent will be
675  * altered if the child's mtime is big enough.
676  *
677  * Finally, if the child is the implied source for the parent, the
678  * parent's IMPSRC variable is set appropriately.
679  */
680 void
681 Make_Update(GNode *cgn)
682 {
683 	const char *cname;	/* the child's name */
684 	time_t mtime = -1;
685 	GNodeList *parents;
686 	GNodeListNode *ln;
687 	GNode *centurion;
688 
689 	/* It is save to re-examine any nodes again */
690 	checked_seqno++;
691 
692 	cname = GNode_VarTarget(cgn);
693 
694 	DEBUG2(MAKE, "Make_Update: %s%s\n", cgn->name, cgn->cohort_num);
695 
696 	/*
697 	 * If the child was actually made, see what its modification time is
698 	 * now -- some rules won't actually update the file. If the file
699 	 * still doesn't exist, make its mtime now.
700 	 */
701 	if (cgn->made != UPTODATE) {
702 		mtime = Make_Recheck(cgn);
703 	}
704 
705 	/*
706 	 * If this is a `::' node, we must consult its first instance
707 	 * which is where all parents are linked.
708 	 */
709 	if ((centurion = cgn->centurion) != NULL) {
710 		if (!Lst_IsEmpty(&cgn->parents))
711 			Punt("%s%s: cohort has parents", cgn->name,
712 			    cgn->cohort_num);
713 		centurion->unmade_cohorts--;
714 		if (centurion->unmade_cohorts < 0)
715 			Error("Graph cycles through centurion %s",
716 			    centurion->name);
717 	} else {
718 		centurion = cgn;
719 	}
720 	parents = &centurion->parents;
721 
722 	/* If this was a .ORDER node, schedule the RHS */
723 	ScheduleOrderSuccessors(centurion);
724 
725 	/* Now mark all the parents as having one less unmade child */
726 	for (ln = parents->first; ln != NULL; ln = ln->next) {
727 		GNode *pgn = ln->datum;
728 
729 		if (DEBUG(MAKE)) {
730 			debug_printf("inspect parent %s%s: ", pgn->name,
731 			    pgn->cohort_num);
732 			GNode_FprintDetails(opts.debug_file, "", pgn, "");
733 			debug_printf(", unmade %d ", pgn->unmade - 1);
734 		}
735 
736 		if (!pgn->flags.remake) {
737 			/* This parent isn't needed */
738 			DEBUG0(MAKE, "- not needed\n");
739 			continue;
740 		}
741 		if (mtime == 0 && !(cgn->type & OP_WAIT))
742 			pgn->flags.force = true;
743 
744 		/*
745 		 * If the parent has the .MADE attribute, its timestamp got
746 		 * updated to that of its newest child, and its unmade
747 		 * child count got set to zero in Make_ExpandUse().
748 		 * However other things might cause us to build one of its
749 		 * children - and so we mustn't do any processing here when
750 		 * the child build finishes.
751 		 */
752 		if (pgn->type & OP_MADE) {
753 			DEBUG0(MAKE, "- .MADE\n");
754 			continue;
755 		}
756 
757 		if (!(cgn->type & (OP_EXEC | OP_USE | OP_USEBEFORE))) {
758 			if (cgn->made == MADE)
759 				pgn->flags.childMade = true;
760 			GNode_UpdateYoungestChild(pgn, cgn);
761 		}
762 
763 		/*
764 		 * A parent must wait for the completion of all instances
765 		 * of a `::' dependency.
766 		 */
767 		if (centurion->unmade_cohorts != 0 ||
768 		    !GNode_IsDone(centurion)) {
769 			DEBUG2(MAKE,
770 			    "- centurion made %d, %d unmade cohorts\n",
771 			    centurion->made, centurion->unmade_cohorts);
772 			continue;
773 		}
774 
775 		/* One more child of this parent is now made */
776 		pgn->unmade--;
777 		if (pgn->unmade < 0) {
778 			if (DEBUG(MAKE)) {
779 				debug_printf("Graph cycles through %s%s\n",
780 				    pgn->name, pgn->cohort_num);
781 				Targ_PrintGraph(2);
782 			}
783 			Error("Graph cycles through %s%s", pgn->name,
784 			    pgn->cohort_num);
785 		}
786 
787 		/*
788 		 * We must always rescan the parents of .WAIT and .ORDER
789 		 * nodes.
790 		 */
791 		if (pgn->unmade != 0 && !(centurion->type & OP_WAIT)
792 		    && !centurion->flags.doneOrder) {
793 			DEBUG0(MAKE, "- unmade children\n");
794 			continue;
795 		}
796 		if (pgn->made != DEFERRED) {
797 			/*
798 			 * Either this parent is on a different branch of
799 			 * the tree, or it on the RHS of a .WAIT directive
800 			 * or it is already on the toBeMade list.
801 			 */
802 			DEBUG0(MAKE, "- not deferred\n");
803 			continue;
804 		}
805 
806 		if (IsWaitingForOrder(pgn))
807 			continue;
808 
809 		if (DEBUG(MAKE)) {
810 			debug_printf("- %s%s made, schedule %s%s (made %d)\n",
811 			    cgn->name, cgn->cohort_num,
812 			    pgn->name, pgn->cohort_num, pgn->made);
813 			Targ_PrintNode(pgn, 2);
814 		}
815 		/* Ok, we can schedule the parent again */
816 		pgn->made = REQUESTED;
817 		Lst_Enqueue(&toBeMade, pgn);
818 	}
819 
820 	UpdateImplicitParentsVars(cgn, cname);
821 }
822 
823 static void
824 UnmarkChildren(GNode *gn)
825 {
826 	GNodeListNode *ln;
827 
828 	for (ln = gn->children.first; ln != NULL; ln = ln->next) {
829 		GNode *child = ln->datum;
830 		child->type &= ~OP_MARK;
831 	}
832 }
833 
834 /*
835  * Add a child's name to the ALLSRC and OODATE variables of the given
836  * node, but only if it has not been given the .EXEC, .USE or .INVISIBLE
837  * attributes. .EXEC and .USE children are very rarely going to be files,
838  * so...
839  *
840  * If the child is a .JOIN node, its ALLSRC is propagated to the parent.
841  *
842  * A child is added to the OODATE variable if its modification time is
843  * later than that of its parent, as defined by Make, except if the
844  * parent is a .JOIN node. In that case, it is only added to the OODATE
845  * variable if it was actually made (since .JOIN nodes don't have
846  * modification times, the comparison is rather unfair...)..
847  *
848  * Input:
849  *	cgn		The child to add
850  *	pgn		The parent to whose ALLSRC variable it should
851  *			be added
852  */
853 static void
854 MakeAddAllSrc(GNode *cgn, GNode *pgn)
855 {
856 	const char *child, *allsrc;
857 
858 	if (cgn->type & OP_MARK)
859 		return;
860 	cgn->type |= OP_MARK;
861 
862 	if (cgn->type & (OP_EXEC | OP_USE | OP_USEBEFORE | OP_INVISIBLE))
863 		return;
864 
865 	if (cgn->type & OP_ARCHV)
866 		child = GNode_VarMember(cgn);
867 	else
868 		child = GNode_Path(cgn);
869 
870 	if (cgn->type & OP_JOIN)
871 		allsrc = GNode_VarAllsrc(cgn);
872 	else
873 		allsrc = child;
874 
875 	if (allsrc != NULL)
876 		Var_Append(pgn, ALLSRC, allsrc);
877 
878 	if (pgn->type & OP_JOIN) {
879 		if (cgn->made == MADE)
880 			Var_Append(pgn, OODATE, child);
881 
882 	} else if ((pgn->mtime < cgn->mtime) ||
883 		   (cgn->mtime >= now && cgn->made == MADE)) {
884 		/*
885 		 * It goes in the OODATE variable if the parent is
886 		 * younger than the child or if the child has been
887 		 * modified more recently than the start of the make.
888 		 * This is to keep pmake from getting confused if
889 		 * something else updates the parent after the make
890 		 * starts (shouldn't happen, I know, but sometimes it
891 		 * does). In such a case, if we've updated the child,
892 		 * the parent is likely to have a modification time
893 		 * later than that of the child and anything that
894 		 * relies on the OODATE variable will be hosed.
895 		 *
896 		 * XXX: This will cause all made children to go in
897 		 * the OODATE variable, even if they're not touched,
898 		 * if RECHECK isn't defined, since cgn->mtime is set
899 		 * to now in Make_Update. According to some people,
900 		 * this is good...
901 		 */
902 		Var_Append(pgn, OODATE, child);
903 	}
904 }
905 
906 /*
907  * Set up the ALLSRC and OODATE variables. Sad to say, it must be
908  * done separately, rather than while traversing the graph. This is
909  * because Make defined OODATE to contain all sources whose modification
910  * times were later than that of the target, *not* those sources that
911  * were out-of-date. Since in both compatibility and native modes,
912  * the modification time of the parent isn't found until the child
913  * has been dealt with, we have to wait until now to fill in the
914  * variable. As for ALLSRC, the ordering is important and not
915  * guaranteed when in native mode, so it must be set here, too.
916  *
917  * If the node is a .JOIN node, its TARGET variable will be set to
918  * match its ALLSRC variable.
919  */
920 void
921 GNode_SetLocalVars(GNode *gn)
922 {
923 	GNodeListNode *ln;
924 
925 	if (gn->flags.doneAllsrc)
926 		return;
927 
928 	UnmarkChildren(gn);
929 	for (ln = gn->children.first; ln != NULL; ln = ln->next)
930 		MakeAddAllSrc(ln->datum, gn);
931 
932 	if (!Var_Exists(gn, OODATE))
933 		Var_Set(gn, OODATE, "");
934 	if (!Var_Exists(gn, ALLSRC))
935 		Var_Set(gn, ALLSRC, "");
936 
937 	if (gn->type & OP_JOIN)
938 		Var_Set(gn, TARGET, GNode_VarAllsrc(gn));
939 	gn->flags.doneAllsrc = true;
940 }
941 
942 static bool
943 MakeBuildChild(GNode *cn, GNodeListNode *toBeMadeNext)
944 {
945 
946 	if (DEBUG(MAKE)) {
947 		debug_printf("MakeBuildChild: inspect %s%s, ",
948 		    cn->name, cn->cohort_num);
949 		GNode_FprintDetails(opts.debug_file, "", cn, "\n");
950 	}
951 	if (GNode_IsReady(cn))
952 		return false;
953 
954 	/* If this node is on the RHS of a .ORDER, check LHSs. */
955 	if (IsWaitingForOrder(cn)) {
956 		/*
957 		 * Can't build this (or anything else in this child list) yet
958 		 */
959 		cn->made = DEFERRED;
960 		return false;	/* but keep looking */
961 	}
962 
963 	DEBUG2(MAKE, "MakeBuildChild: schedule %s%s\n",
964 	    cn->name, cn->cohort_num);
965 
966 	cn->made = REQUESTED;
967 	if (toBeMadeNext == NULL)
968 		Lst_Append(&toBeMade, cn);
969 	else
970 		Lst_InsertBefore(&toBeMade, toBeMadeNext, cn);
971 
972 	if (cn->unmade_cohorts != 0) {
973 		ListNode *ln;
974 
975 		for (ln = cn->cohorts.first; ln != NULL; ln = ln->next)
976 			if (MakeBuildChild(ln->datum, toBeMadeNext))
977 				break;
978 	}
979 
980 	/*
981 	 * If this node is a .WAIT node with unmade children
982 	 * then don't add the next sibling.
983 	 */
984 	return cn->type & OP_WAIT && cn->unmade > 0;
985 }
986 
987 /* When a .ORDER LHS node completes, we do this on each RHS. */
988 static void
989 MakeBuildParent(GNode *pn, GNodeListNode *toBeMadeNext)
990 {
991 	if (pn->made != DEFERRED)
992 		return;
993 
994 	if (!MakeBuildChild(pn, toBeMadeNext)) {
995 		/* When this node is built, reschedule its parents. */
996 		pn->flags.doneOrder = true;
997 	}
998 }
999 
1000 static void
1001 MakeChildren(GNode *gn)
1002 {
1003 	GNodeListNode *toBeMadeNext = toBeMade.first;
1004 	GNodeListNode *ln;
1005 
1006 	for (ln = gn->children.first; ln != NULL; ln = ln->next)
1007 		if (MakeBuildChild(ln->datum, toBeMadeNext))
1008 			break;
1009 }
1010 
1011 /*
1012  * Start as many jobs as possible, taking them from the toBeMade queue.
1013  *
1014  * If the -q option was given, no job will be started,
1015  * but as soon as an out-of-date target is found, this function
1016  * returns true. In all other cases, this function returns false.
1017  */
1018 static bool
1019 MakeStartJobs(void)
1020 {
1021 	GNode *gn;
1022 	bool have_token = false;
1023 
1024 	while (!Lst_IsEmpty(&toBeMade)) {
1025 		/*
1026 		 * Get token now to avoid cycling job-list when we only
1027 		 * have 1 token
1028 		 */
1029 		if (!have_token && !Job_TokenWithdraw())
1030 			break;
1031 		have_token = true;
1032 
1033 		gn = Lst_Dequeue(&toBeMade);
1034 		DEBUG2(MAKE, "Examining %s%s...\n", gn->name, gn->cohort_num);
1035 
1036 		if (gn->made != REQUESTED) {
1037 			/*
1038 			 * XXX: Replace %d with string representation;
1039 			 * see made_name.
1040 			 */
1041 			DEBUG1(MAKE, "state %d\n", gn->made);
1042 
1043 			make_abort(gn, __LINE__);
1044 		}
1045 
1046 		if (gn->checked_seqno == checked_seqno) {
1047 			/*
1048 			 * We've already looked at this node since a job
1049 			 * finished...
1050 			 */
1051 			DEBUG2(MAKE, "already checked %s%s\n", gn->name,
1052 			    gn->cohort_num);
1053 			gn->made = DEFERRED;
1054 			continue;
1055 		}
1056 		gn->checked_seqno = checked_seqno;
1057 
1058 		if (gn->unmade != 0) {
1059 			/*
1060 			 * We can't build this yet, add all unmade children
1061 			 * to toBeMade, just before the current first element.
1062 			 */
1063 			gn->made = DEFERRED;
1064 
1065 			MakeChildren(gn);
1066 
1067 			/* and drop this node on the floor */
1068 			DEBUG2(MAKE, "dropped %s%s\n", gn->name,
1069 			    gn->cohort_num);
1070 			continue;
1071 		}
1072 
1073 		gn->made = BEINGMADE;
1074 		if (GNode_IsOODate(gn)) {
1075 			DEBUG0(MAKE, "out-of-date\n");
1076 			if (opts.query)
1077 				return true;
1078 			GNode_SetLocalVars(gn);
1079 			Job_Make(gn);
1080 			have_token = false;
1081 		} else {
1082 			DEBUG0(MAKE, "up-to-date\n");
1083 			gn->made = UPTODATE;
1084 			if (gn->type & OP_JOIN) {
1085 				/*
1086 				 * Even for an up-to-date .JOIN node, we
1087 				 * need it to have its local variables so
1088 				 * references to it get the correct value
1089 				 * for .TARGET when building up the local
1090 				 * variables of its parent(s)...
1091 				 */
1092 				GNode_SetLocalVars(gn);
1093 			}
1094 			Make_Update(gn);
1095 		}
1096 	}
1097 
1098 	if (have_token)
1099 		Job_TokenReturn();
1100 
1101 	return false;
1102 }
1103 
1104 /* Print the status of a .ORDER node. */
1105 static void
1106 MakePrintStatusOrderNode(GNode *ogn, GNode *gn)
1107 {
1108 	if (!GNode_IsWaitingFor(ogn))
1109 		return;
1110 
1111 	printf("    `%s%s' has .ORDER dependency against %s%s ",
1112 	    gn->name, gn->cohort_num, ogn->name, ogn->cohort_num);
1113 	GNode_FprintDetails(stdout, "(", ogn, ")\n");
1114 
1115 	if (DEBUG(MAKE) && opts.debug_file != stdout) {
1116 		debug_printf("    `%s%s' has .ORDER dependency against %s%s ",
1117 		    gn->name, gn->cohort_num, ogn->name, ogn->cohort_num);
1118 		GNode_FprintDetails(opts.debug_file, "(", ogn, ")\n");
1119 	}
1120 }
1121 
1122 static void
1123 MakePrintStatusOrder(GNode *gn)
1124 {
1125 	GNodeListNode *ln;
1126 	for (ln = gn->order_pred.first; ln != NULL; ln = ln->next)
1127 		MakePrintStatusOrderNode(ln->datum, gn);
1128 }
1129 
1130 static void MakePrintStatusList(GNodeList *, int *);
1131 
1132 /*
1133  * Print the status of a top-level node, viz. it being up-to-date already
1134  * or not created due to an error in a lower level.
1135  */
1136 static bool
1137 MakePrintStatus(GNode *gn, int *errors)
1138 {
1139 	if (gn->flags.doneCycle) {
1140 		/*
1141 		 * We've completely processed this node before, don't do
1142 		 * it again.
1143 		 */
1144 		return false;
1145 	}
1146 
1147 	if (gn->unmade == 0) {
1148 		gn->flags.doneCycle = true;
1149 		switch (gn->made) {
1150 		case UPTODATE:
1151 			printf("`%s%s' is up to date.\n", gn->name,
1152 			    gn->cohort_num);
1153 			break;
1154 		case MADE:
1155 			break;
1156 		case UNMADE:
1157 		case DEFERRED:
1158 		case REQUESTED:
1159 		case BEINGMADE:
1160 			(*errors)++;
1161 			printf("`%s%s' was not built", gn->name,
1162 			    gn->cohort_num);
1163 			GNode_FprintDetails(stdout, " (", gn, ")!\n");
1164 			if (DEBUG(MAKE) && opts.debug_file != stdout) {
1165 				debug_printf("`%s%s' was not built", gn->name,
1166 				    gn->cohort_num);
1167 				GNode_FprintDetails(opts.debug_file, " (", gn,
1168 				    ")!\n");
1169 			}
1170 			/* Most likely problem is actually caused by .ORDER */
1171 			MakePrintStatusOrder(gn);
1172 			break;
1173 		default:
1174 			/* Errors - already counted */
1175 			printf("`%s%s' not remade because of errors.\n",
1176 			    gn->name, gn->cohort_num);
1177 			if (DEBUG(MAKE) && opts.debug_file != stdout)
1178 				debug_printf(
1179 				    "`%s%s' not remade because of errors.\n",
1180 				    gn->name, gn->cohort_num);
1181 			break;
1182 		}
1183 		return false;
1184 	}
1185 
1186 	DEBUG3(MAKE, "MakePrintStatus: %s%s has %d unmade children\n",
1187 	    gn->name, gn->cohort_num, gn->unmade);
1188 	/*
1189 	 * If printing cycles and came to one that has unmade children,
1190 	 * print out the cycle by recursing on its children.
1191 	 */
1192 	if (!gn->flags.cycle) {
1193 		/* First time we've seen this node, check all children */
1194 		gn->flags.cycle = true;
1195 		MakePrintStatusList(&gn->children, errors);
1196 		/* Mark that this node needn't be processed again */
1197 		gn->flags.doneCycle = true;
1198 		return false;
1199 	}
1200 
1201 	/* Only output the error once per node */
1202 	gn->flags.doneCycle = true;
1203 	Error("Graph cycles through `%s%s'", gn->name, gn->cohort_num);
1204 	if ((*errors)++ > 100)
1205 		/* Abandon the whole error report */
1206 		return true;
1207 
1208 	/* Reporting for our children will give the rest of the loop */
1209 	MakePrintStatusList(&gn->children, errors);
1210 	return false;
1211 }
1212 
1213 static void
1214 MakePrintStatusList(GNodeList *gnodes, int *errors)
1215 {
1216 	GNodeListNode *ln;
1217 
1218 	for (ln = gnodes->first; ln != NULL; ln = ln->next)
1219 		if (MakePrintStatus(ln->datum, errors))
1220 			break;
1221 }
1222 
1223 static void
1224 ExamineLater(GNodeList *examine, GNodeList *toBeExamined)
1225 {
1226 	ListNode *ln;
1227 
1228 	for (ln = toBeExamined->first; ln != NULL; ln = ln->next) {
1229 		GNode *gn = ln->datum;
1230 
1231 		if (gn->flags.remake)
1232 			continue;
1233 		if (gn->type & (OP_USE | OP_USEBEFORE))
1234 			continue;
1235 
1236 		DEBUG2(MAKE, "ExamineLater: need to examine \"%s%s\"\n",
1237 		    gn->name, gn->cohort_num);
1238 		Lst_Enqueue(examine, gn);
1239 	}
1240 }
1241 
1242 /*
1243  * Expand .USE nodes and create a new targets list.
1244  *
1245  * Input:
1246  *	targs		the initial list of targets
1247  */
1248 void
1249 Make_ExpandUse(GNodeList *targs)
1250 {
1251 	GNodeList examine = LST_INIT;	/* Queue of targets to examine */
1252 	Lst_AppendAll(&examine, targs);
1253 
1254 	/*
1255 	 * Make an initial downward pass over the graph, marking nodes to
1256 	 * be made as we go down.
1257 	 *
1258 	 * We call Suff_FindDeps to find where a node is and to get some
1259 	 * children for it if it has none and also has no commands. If the
1260 	 * node is a leaf, we stick it on the toBeMade queue to be looked
1261 	 * at in a minute, otherwise we add its children to our queue and
1262 	 * go on about our business.
1263 	 */
1264 	while (!Lst_IsEmpty(&examine)) {
1265 		GNode *gn = Lst_Dequeue(&examine);
1266 
1267 		if (gn->flags.remake)
1268 			/* We've looked at this one already */
1269 			continue;
1270 		gn->flags.remake = true;
1271 		DEBUG2(MAKE, "Make_ExpandUse: examine %s%s\n",
1272 		    gn->name, gn->cohort_num);
1273 
1274 		if (gn->type & OP_DOUBLEDEP)
1275 			Lst_PrependAll(&examine, &gn->cohorts);
1276 
1277 		/*
1278 		 * Apply any .USE rules before looking for implicit
1279 		 * dependencies to make sure everything has commands that
1280 		 * should.
1281 		 *
1282 		 * Make sure that the TARGET is set, so that we can make
1283 		 * expansions.
1284 		 */
1285 		if (gn->type & OP_ARCHV) {
1286 			char *eoa = strchr(gn->name, '(');
1287 			char *eon = strchr(gn->name, ')');
1288 			if (eoa == NULL || eon == NULL)
1289 				continue;
1290 			*eoa = '\0';
1291 			*eon = '\0';
1292 			Var_Set(gn, MEMBER, eoa + 1);
1293 			Var_Set(gn, ARCHIVE, gn->name);
1294 			*eoa = '(';
1295 			*eon = ')';
1296 		}
1297 
1298 		Dir_UpdateMTime(gn, false);
1299 		Var_Set(gn, TARGET, GNode_Path(gn));
1300 		UnmarkChildren(gn);
1301 		HandleUseNodes(gn);
1302 
1303 		if (!(gn->type & OP_MADE))
1304 			Suff_FindDeps(gn);
1305 		else {
1306 			PretendAllChildrenAreMade(gn);
1307 			if (gn->unmade != 0) {
1308 				printf(
1309 				    "Warning: "
1310 				    "%s%s still has %d unmade children\n",
1311 				    gn->name, gn->cohort_num, gn->unmade);
1312 			}
1313 		}
1314 
1315 		if (gn->unmade != 0)
1316 			ExamineLater(&examine, &gn->children);
1317 	}
1318 
1319 	Lst_Done(&examine);
1320 }
1321 
1322 /* Make the .WAIT node depend on the previous children */
1323 static void
1324 add_wait_dependency(GNodeListNode *owln, GNode *wn)
1325 {
1326 	GNodeListNode *cln;
1327 	GNode *cn;
1328 
1329 	for (cln = owln; (cn = cln->datum) != wn; cln = cln->next) {
1330 		DEBUG3(MAKE, ".WAIT: add dependency %s%s -> %s\n",
1331 		    cn->name, cn->cohort_num, wn->name);
1332 
1333 		/*
1334 		 * XXX: This pattern should be factored out, it repeats often
1335 		 */
1336 		Lst_Append(&wn->children, cn);
1337 		wn->unmade++;
1338 		Lst_Append(&cn->parents, wn);
1339 	}
1340 }
1341 
1342 /* Convert .WAIT nodes into dependencies. */
1343 static void
1344 Make_ProcessWait(GNodeList *targs)
1345 {
1346 	GNode *pgn;		/* 'parent' node we are examining */
1347 	GNodeListNode *owln;	/* Previous .WAIT node */
1348 	GNodeList examine;	/* List of targets to examine */
1349 
1350 	/*
1351 	 * We need all the nodes to have a common parent in order for the
1352 	 * .WAIT and .ORDER scheduling to work.
1353 	 * Perhaps this should be done earlier...
1354 	 */
1355 
1356 	pgn = GNode_New(".MAIN");
1357 	pgn->flags.remake = true;
1358 	pgn->type = OP_PHONY | OP_DEPENDS;
1359 	/* Get it displayed in the diag dumps */
1360 	Lst_Prepend(Targ_List(), pgn);
1361 
1362 	{
1363 		GNodeListNode *ln;
1364 		for (ln = targs->first; ln != NULL; ln = ln->next) {
1365 			GNode *cgn = ln->datum;
1366 
1367 			Lst_Append(&pgn->children, cgn);
1368 			Lst_Append(&cgn->parents, pgn);
1369 			pgn->unmade++;
1370 		}
1371 	}
1372 
1373 	/* Start building with the 'dummy' .MAIN' node */
1374 	MakeBuildChild(pgn, NULL);
1375 
1376 	Lst_Init(&examine);
1377 	Lst_Append(&examine, pgn);
1378 
1379 	while (!Lst_IsEmpty(&examine)) {
1380 		GNodeListNode *ln;
1381 
1382 		pgn = Lst_Dequeue(&examine);
1383 
1384 		/* We only want to process each child-list once */
1385 		if (pgn->flags.doneWait)
1386 			continue;
1387 		pgn->flags.doneWait = true;
1388 		DEBUG1(MAKE, "Make_ProcessWait: examine %s\n", pgn->name);
1389 
1390 		if (pgn->type & OP_DOUBLEDEP)
1391 			Lst_PrependAll(&examine, &pgn->cohorts);
1392 
1393 		owln = pgn->children.first;
1394 		for (ln = pgn->children.first; ln != NULL; ln = ln->next) {
1395 			GNode *cgn = ln->datum;
1396 			if (cgn->type & OP_WAIT) {
1397 				add_wait_dependency(owln, cgn);
1398 				owln = ln;
1399 			} else {
1400 				Lst_Append(&examine, cgn);
1401 			}
1402 		}
1403 	}
1404 
1405 	Lst_Done(&examine);
1406 }
1407 
1408 /*
1409  * Initialize the nodes to remake and the list of nodes which are ready to
1410  * be made by doing a breadth-first traversal of the graph starting from the
1411  * nodes in the given list. Once this traversal is finished, all the 'leaves'
1412  * of the graph are in the toBeMade queue.
1413  *
1414  * Using this queue and the Job module, work back up the graph, calling on
1415  * MakeStartJobs to keep the job table as full as possible.
1416  *
1417  * Input:
1418  *	targs		the initial list of targets
1419  *
1420  * Results:
1421  *	True if work was done, false otherwise.
1422  *
1423  * Side Effects:
1424  *	The make field of all nodes involved in the creation of the given
1425  *	targets is set to 1. The toBeMade list is set to contain all the
1426  *	'leaves' of these subgraphs.
1427  */
1428 bool
1429 Make_Run(GNodeList *targs)
1430 {
1431 	int errors;		/* Number of errors the Job module reports */
1432 
1433 	/* Start trying to make the current targets... */
1434 	Lst_Init(&toBeMade);
1435 
1436 	Make_ExpandUse(targs);
1437 	Make_ProcessWait(targs);
1438 
1439 	if (DEBUG(MAKE)) {
1440 		debug_printf("#***# full graph\n");
1441 		Targ_PrintGraph(1);
1442 	}
1443 
1444 	if (opts.query) {
1445 		/*
1446 		 * We wouldn't do any work unless we could start some jobs
1447 		 * in the next loop... (we won't actually start any, of
1448 		 * course, this is just to see if any of the targets was out
1449 		 * of date)
1450 		 */
1451 		return MakeStartJobs();
1452 	}
1453 	/*
1454 	 * Initialization. At the moment, no jobs are running and until some
1455 	 * get started, nothing will happen since the remaining upward
1456 	 * traversal of the graph is performed by the routines in job.c upon
1457 	 * the finishing of a job. So we fill the Job table as much as we can
1458 	 * before going into our loop.
1459 	 */
1460 	(void)MakeStartJobs();
1461 
1462 	/*
1463 	 * Main Loop: The idea here is that the ending of jobs will take
1464 	 * care of the maintenance of data structures and the waiting for
1465 	 * output will cause us to be idle most of the time while our
1466 	 * children run as much as possible. Because the job table is kept
1467 	 * as full as possible, the only time when it will be empty is when
1468 	 * all the jobs which need running have been run, so that is the end
1469 	 * condition of this loop. Note that the Job module will exit if
1470 	 * there were any errors unless the keepgoing flag was given.
1471 	 */
1472 	while (!Lst_IsEmpty(&toBeMade) || jobTokensRunning > 0) {
1473 		Job_CatchOutput();
1474 		(void)MakeStartJobs();
1475 	}
1476 
1477 	errors = Job_Finish();
1478 
1479 	/*
1480 	 * Print the final status of each target. E.g. if it wasn't made
1481 	 * because some inferior reported an error.
1482 	 */
1483 	DEBUG1(MAKE, "done: errors %d\n", errors);
1484 	if (errors == 0) {
1485 		MakePrintStatusList(targs, &errors);
1486 		if (DEBUG(MAKE)) {
1487 			debug_printf("done: errors %d\n", errors);
1488 			if (errors > 0)
1489 				Targ_PrintGraph(4);
1490 		}
1491 	}
1492 	return errors > 0;
1493 }
1494