make.c (138232) | make.c (138264) |
---|---|
1/* 2 * Copyright (c) 1988, 1989, 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * Copyright (c) 1989 by Berkeley Softworks 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Adam de Boor. --- 25 unchanged lines hidden (view full) --- 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)make.c 8.1 (Berkeley) 6/6/93 39 */ 40 41#include <sys/cdefs.h> | 1/* 2 * Copyright (c) 1988, 1989, 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * Copyright (c) 1989 by Berkeley Softworks 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Adam de Boor. --- 25 unchanged lines hidden (view full) --- 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)make.c 8.1 (Berkeley) 6/6/93 39 */ 40 41#include <sys/cdefs.h> |
42__FBSDID("$FreeBSD: head/usr.bin/make/make.c 138232 2004-11-30 17:46:29Z harti $"); | 42__FBSDID("$FreeBSD: head/usr.bin/make/make.c 138264 2004-12-01 10:29:20Z harti $"); |
43 44/*- 45 * make.c -- 46 * The functions which perform the examination of targets and 47 * their suitability for creation 48 * 49 * Interface: 50 * Make_Run Initialize things for the module and recreate --- 66 unchanged lines hidden (view full) --- 117 } 118 return (0); 119} 120 121static int 122MakeTimeStamp(void *pgn, void *cgn) 123{ 124 | 43 44/*- 45 * make.c -- 46 * The functions which perform the examination of targets and 47 * their suitability for creation 48 * 49 * Interface: 50 * Make_Run Initialize things for the module and recreate --- 66 unchanged lines hidden (view full) --- 117 } 118 return (0); 119} 120 121static int 122MakeTimeStamp(void *pgn, void *cgn) 123{ 124 |
125 return (Make_TimeStamp((GNode *)pgn, (GNode *)cgn)); | 125 return (Make_TimeStamp(pgn, cgn)); |
126} 127 128/*- 129 *----------------------------------------------------------------------- 130 * Make_OODate -- 131 * See if a given node is out of date with respect to its sources. 132 * Used by Make_Run when deciding which nodes to place on the 133 * toBeMade queue initially and by Make_Update to screen out USE and --- 14 unchanged lines hidden (view full) --- 148{ 149 Boolean oodate; 150 151 /* 152 * Certain types of targets needn't even be sought as their datedness 153 * doesn't depend on their modification time... 154 */ 155 if ((gn->type & (OP_JOIN | OP_USE | OP_EXEC)) == 0) { | 126} 127 128/*- 129 *----------------------------------------------------------------------- 130 * Make_OODate -- 131 * See if a given node is out of date with respect to its sources. 132 * Used by Make_Run when deciding which nodes to place on the 133 * toBeMade queue initially and by Make_Update to screen out USE and --- 14 unchanged lines hidden (view full) --- 148{ 149 Boolean oodate; 150 151 /* 152 * Certain types of targets needn't even be sought as their datedness 153 * doesn't depend on their modification time... 154 */ 155 if ((gn->type & (OP_JOIN | OP_USE | OP_EXEC)) == 0) { |
156 Dir_MTime(gn); | 156 Dir_MTime(gn); |
157 if (gn->mtime != 0) { 158 DEBUGF(MAKE, ("modified %s...", Targ_FmtTime(gn->mtime))); 159 } else { 160 DEBUGF(MAKE, ("non-existent...")); 161 } 162 } 163 164 /* --- 71 unchanged lines hidden (view full) --- 236 /* 237 * If the target isn't out-of-date, the parents need to know its 238 * modification time. Note that targets that appear to be out-of-date 239 * but aren't, because they have no commands and aren't of type OP_NOP, 240 * have their mtime stay below their children's mtime to keep parents from 241 * thinking they're out-of-date. 242 */ 243 if (!oodate) { | 157 if (gn->mtime != 0) { 158 DEBUGF(MAKE, ("modified %s...", Targ_FmtTime(gn->mtime))); 159 } else { 160 DEBUGF(MAKE, ("non-existent...")); 161 } 162 } 163 164 /* --- 71 unchanged lines hidden (view full) --- 236 /* 237 * If the target isn't out-of-date, the parents need to know its 238 * modification time. Note that targets that appear to be out-of-date 239 * but aren't, because they have no commands and aren't of type OP_NOP, 240 * have their mtime stay below their children's mtime to keep parents from 241 * thinking they're out-of-date. 242 */ 243 if (!oodate) { |
244 Lst_ForEach(gn->parents, MakeTimeStamp, (void *)gn); | 244 Lst_ForEach(gn->parents, MakeTimeStamp, gn); |
245 } 246 247 return (oodate); 248} 249 250/*- 251 *----------------------------------------------------------------------- 252 * MakeAddChild -- --- 5 unchanged lines hidden (view full) --- 258 * 259 * Side Effects: 260 * The given list is extended 261 *----------------------------------------------------------------------- 262 */ 263static int 264MakeAddChild(void *gnp, void *lp) 265{ | 245 } 246 247 return (oodate); 248} 249 250/*- 251 *----------------------------------------------------------------------- 252 * MakeAddChild -- --- 5 unchanged lines hidden (view full) --- 258 * 259 * Side Effects: 260 * The given list is extended 261 *----------------------------------------------------------------------- 262 */ 263static int 264MakeAddChild(void *gnp, void *lp) 265{ |
266 GNode *gn = (GNode *)gnp; 267 Lst l = (Lst)lp; | 266 GNode *gn = gnp; 267 Lst l = lp; |
268 269 if (!gn->make && !(gn->type & OP_USE)) { | 268 269 if (!gn->make && !(gn->type & OP_USE)) { |
270 Lst_EnQueue(l, (void *)gn); | 270 Lst_EnQueue(l, gn); |
271 } 272 return (0); 273} 274 275/*- 276 *----------------------------------------------------------------------- 277 * Make_HandleUse -- 278 * Function called by Make_Run and SuffApplyTransform on the downward --- 17 unchanged lines hidden (view full) --- 296 *----------------------------------------------------------------------- 297 */ 298int 299Make_HandleUse(GNode *cgn, GNode *pgn) 300{ 301 GNode *gn; /* A child of the .USE node */ 302 LstNode ln; /* An element in the children list */ 303 | 271 } 272 return (0); 273} 274 275/*- 276 *----------------------------------------------------------------------- 277 * Make_HandleUse -- 278 * Function called by Make_Run and SuffApplyTransform on the downward --- 17 unchanged lines hidden (view full) --- 296 *----------------------------------------------------------------------- 297 */ 298int 299Make_HandleUse(GNode *cgn, GNode *pgn) 300{ 301 GNode *gn; /* A child of the .USE node */ 302 LstNode ln; /* An element in the children list */ 303 |
304 if (cgn->type & (OP_USE|OP_TRANSFORM)) { | 304 if (cgn->type & (OP_USE | OP_TRANSFORM)) { |
305 if ((cgn->type & OP_USE) || Lst_IsEmpty(pgn->commands)) { 306 /* 307 * .USE or transformation and target has no commands -- append 308 * the child's commands to the parent. 309 */ 310 Lst_Concat(pgn->commands, cgn->commands, LST_CONCNEW); 311 } 312 313 if (Lst_Open(cgn->children) == SUCCESS) { 314 while ((ln = Lst_Next(cgn->children)) != NULL) { | 305 if ((cgn->type & OP_USE) || Lst_IsEmpty(pgn->commands)) { 306 /* 307 * .USE or transformation and target has no commands -- append 308 * the child's commands to the parent. 309 */ 310 Lst_Concat(pgn->commands, cgn->commands, LST_CONCNEW); 311 } 312 313 if (Lst_Open(cgn->children) == SUCCESS) { 314 while ((ln = Lst_Next(cgn->children)) != NULL) { |
315 gn = (GNode *)Lst_Datum(ln); | 315 gn = Lst_Datum(ln); |
316 317 if (Lst_Member(pgn->children, gn) == NULL) { 318 Lst_AtEnd(pgn->children, gn); 319 Lst_AtEnd(gn->parents, pgn); 320 pgn->unmade += 1; 321 } 322 } 323 Lst_Close(cgn->children); --- 14 unchanged lines hidden (view full) --- 338 } 339 return (0); 340} 341 342static int 343MakeHandleUse(void *pgn, void *cgn) 344{ 345 | 316 317 if (Lst_Member(pgn->children, gn) == NULL) { 318 Lst_AtEnd(pgn->children, gn); 319 Lst_AtEnd(gn->parents, pgn); 320 pgn->unmade += 1; 321 } 322 } 323 Lst_Close(cgn->children); --- 14 unchanged lines hidden (view full) --- 338 } 339 return (0); 340} 341 342static int 343MakeHandleUse(void *pgn, void *cgn) 344{ 345 |
346 return (Make_HandleUse((GNode *)pgn, (GNode *)cgn)); | 346 return (Make_HandleUse(pgn, cgn)); |
347} 348 349/*- 350 *----------------------------------------------------------------------- 351 * Make_Update -- 352 * Perform update on the parents of a node. Used by JobFinish once 353 * a node has been dealt with and by MakeStartJobs if it finds an 354 * up-to-date node. --- 89 unchanged lines hidden (view full) --- 444 cgn->mtime = now; 445 } 446 DEBUGF(MAKE, ("update time: %s\n", Targ_FmtTime(cgn->mtime))); 447#endif 448 } 449 450 if (Lst_Open(cgn->parents) == SUCCESS) { 451 while ((ln = Lst_Next(cgn->parents)) != NULL) { | 347} 348 349/*- 350 *----------------------------------------------------------------------- 351 * Make_Update -- 352 * Perform update on the parents of a node. Used by JobFinish once 353 * a node has been dealt with and by MakeStartJobs if it finds an 354 * up-to-date node. --- 89 unchanged lines hidden (view full) --- 444 cgn->mtime = now; 445 } 446 DEBUGF(MAKE, ("update time: %s\n", Targ_FmtTime(cgn->mtime))); 447#endif 448 } 449 450 if (Lst_Open(cgn->parents) == SUCCESS) { 451 while ((ln = Lst_Next(cgn->parents)) != NULL) { |
452 pgn = (GNode *)Lst_Datum(ln); | 452 pgn = Lst_Datum(ln); |
453 if (pgn->make) { 454 pgn->unmade -= 1; 455 456 if (!(cgn->type & (OP_EXEC | OP_USE))) { 457 if (cgn->made == MADE) { 458 pgn->childMade = TRUE; 459 if (pgn->cmtime < cgn->mtime) { 460 pgn->cmtime = cgn->mtime; 461 } 462 } else { 463 Make_TimeStamp(pgn, cgn); 464 } 465 } 466 if (pgn->unmade == 0) { 467 /* 468 * Queue the node up -- any unmade predecessors will 469 * be dealt with in MakeStartJobs. 470 */ | 453 if (pgn->make) { 454 pgn->unmade -= 1; 455 456 if (!(cgn->type & (OP_EXEC | OP_USE))) { 457 if (cgn->made == MADE) { 458 pgn->childMade = TRUE; 459 if (pgn->cmtime < cgn->mtime) { 460 pgn->cmtime = cgn->mtime; 461 } 462 } else { 463 Make_TimeStamp(pgn, cgn); 464 } 465 } 466 if (pgn->unmade == 0) { 467 /* 468 * Queue the node up -- any unmade predecessors will 469 * be dealt with in MakeStartJobs. 470 */ |
471 Lst_EnQueue(toBeMade, (void *)pgn); | 471 Lst_EnQueue(toBeMade, pgn); |
472 } else if (pgn->unmade < 0) { 473 Error("Graph cycles through %s", pgn->name); 474 } 475 } 476 } 477 Lst_Close(cgn->parents); 478 } 479 /* 480 * Deal with successor nodes. If any is marked for making and has an unmade 481 * count of 0, has not been made and isn't in the examination queue, 482 * it means we need to place it in the queue as it restrained itself 483 * before. 484 */ 485 for (ln = Lst_First(cgn->successors); ln != NULL; ln = Lst_Succ(ln)) { | 472 } else if (pgn->unmade < 0) { 473 Error("Graph cycles through %s", pgn->name); 474 } 475 } 476 } 477 Lst_Close(cgn->parents); 478 } 479 /* 480 * Deal with successor nodes. If any is marked for making and has an unmade 481 * count of 0, has not been made and isn't in the examination queue, 482 * it means we need to place it in the queue as it restrained itself 483 * before. 484 */ 485 for (ln = Lst_First(cgn->successors); ln != NULL; ln = Lst_Succ(ln)) { |
486 GNode *succ = (GNode *)Lst_Datum(ln); | 486 GNode *succ = Lst_Datum(ln); |
487 488 if (succ->make && succ->unmade == 0 && succ->made == UNMADE && | 487 488 if (succ->make && succ->unmade == 0 && succ->made == UNMADE && |
489 Lst_Member(toBeMade, (void *)succ) == NULL) | 489 Lst_Member(toBeMade, succ) == NULL) |
490 { | 490 { |
491 Lst_EnQueue(toBeMade, (void *)succ); | 491 Lst_EnQueue(toBeMade, succ); |
492 } 493 } 494 495 /* 496 * Set the .PREFIX and .IMPSRC variables for all the implied parents 497 * of this node. 498 */ 499 if (Lst_Open(cgn->iParents) == SUCCESS) { 500 char *ptr; 501 char *cpref = Var_Value(PREFIX, cgn, &ptr); 502 503 while ((ln = Lst_Next(cgn->iParents)) != NULL) { | 492 } 493 } 494 495 /* 496 * Set the .PREFIX and .IMPSRC variables for all the implied parents 497 * of this node. 498 */ 499 if (Lst_Open(cgn->iParents) == SUCCESS) { 500 char *ptr; 501 char *cpref = Var_Value(PREFIX, cgn, &ptr); 502 503 while ((ln = Lst_Next(cgn->iParents)) != NULL) { |
504 pgn = (GNode *)Lst_Datum (ln); | 504 pgn = Lst_Datum (ln); |
505 if (pgn->make) { 506 Var_Set(IMPSRC, cname, pgn); 507 Var_Set(PREFIX, cpref, pgn); 508 } 509 } 510 free(ptr); 511 Lst_Close(cgn->iParents); 512 } --- 89 unchanged lines hidden (view full) --- 602 * If the node is a .JOIN node, its TARGET variable will be set to 603 * match its ALLSRC variable. 604 *----------------------------------------------------------------------- 605 */ 606void 607Make_DoAllVar(GNode *gn) 608{ 609 | 505 if (pgn->make) { 506 Var_Set(IMPSRC, cname, pgn); 507 Var_Set(PREFIX, cpref, pgn); 508 } 509 } 510 free(ptr); 511 Lst_Close(cgn->iParents); 512 } --- 89 unchanged lines hidden (view full) --- 602 * If the node is a .JOIN node, its TARGET variable will be set to 603 * match its ALLSRC variable. 604 *----------------------------------------------------------------------- 605 */ 606void 607Make_DoAllVar(GNode *gn) 608{ 609 |
610 Lst_ForEach(gn->children, MakeAddAllSrc, (void *)gn); | 610 Lst_ForEach(gn->children, MakeAddAllSrc, gn); |
611 612 if (!Var_Exists (OODATE, gn)) { 613 Var_Set(OODATE, "", gn); 614 } 615 if (!Var_Exists (ALLSRC, gn)) { 616 Var_Set(ALLSRC, "", gn); 617 } 618 --- 21 unchanged lines hidden (view full) --- 640 * 641 *----------------------------------------------------------------------- 642 */ 643static Boolean 644MakeStartJobs(void) 645{ 646 GNode *gn; 647 | 611 612 if (!Var_Exists (OODATE, gn)) { 613 Var_Set(OODATE, "", gn); 614 } 615 if (!Var_Exists (ALLSRC, gn)) { 616 Var_Set(ALLSRC, "", gn); 617 } 618 --- 21 unchanged lines hidden (view full) --- 640 * 641 *----------------------------------------------------------------------- 642 */ 643static Boolean 644MakeStartJobs(void) 645{ 646 GNode *gn; 647 |
648 while (!Lst_IsEmpty (toBeMade) && !Job_Full()) { 649 gn = (GNode *)Lst_DeQueue(toBeMade); | 648 while (!Lst_IsEmpty(toBeMade) && !Job_Full()) { 649 gn = Lst_DeQueue(toBeMade); |
650 DEBUGF(MAKE, ("Examining %s...", gn->name)); 651 /* 652 * Make sure any and all predecessors that are going to be made, 653 * have been. 654 */ 655 if (!Lst_IsEmpty(gn->preds)) { 656 LstNode ln; 657 658 for (ln = Lst_First(gn->preds); ln != NULL; ln = Lst_Succ(ln)){ | 650 DEBUGF(MAKE, ("Examining %s...", gn->name)); 651 /* 652 * Make sure any and all predecessors that are going to be made, 653 * have been. 654 */ 655 if (!Lst_IsEmpty(gn->preds)) { 656 LstNode ln; 657 658 for (ln = Lst_First(gn->preds); ln != NULL; ln = Lst_Succ(ln)){ |
659 GNode *pgn = (GNode *)Lst_Datum(ln); | 659 GNode *pgn = Lst_Datum(ln); |
660 661 if (pgn->make && pgn->made == UNMADE) { 662 DEBUGF(MAKE, ("predecessor %s not made yet.\n", pgn->name)); 663 break; 664 } 665 } 666 /* 667 * If ln isn't NULL, there's a predecessor as yet unmade, so we --- 48 unchanged lines hidden (view full) --- 716 * Side Effects: 717 * A message may be printed. 718 * 719 *----------------------------------------------------------------------- 720 */ 721static int 722MakePrintStatus(void *gnp, void *cyclep) 723{ | 660 661 if (pgn->make && pgn->made == UNMADE) { 662 DEBUGF(MAKE, ("predecessor %s not made yet.\n", pgn->name)); 663 break; 664 } 665 } 666 /* 667 * If ln isn't NULL, there's a predecessor as yet unmade, so we --- 48 unchanged lines hidden (view full) --- 716 * Side Effects: 717 * A message may be printed. 718 * 719 *----------------------------------------------------------------------- 720 */ 721static int 722MakePrintStatus(void *gnp, void *cyclep) 723{ |
724 GNode *gn = (GNode *)gnp; 725 Boolean cycle = *(Boolean *)cyclep; | 724 GNode *gn = gnp; 725 Boolean cycle = *(Boolean *)cyclep; |
726 727 if (gn->made == UPTODATE) { 728 printf("`%s' is up to date.\n", gn->name); 729 } else if (gn->unmade != 0) { 730 if (cycle) { 731 Boolean t = TRUE; 732 /* 733 * If printing cycles and came to one that has unmade children, 734 * print out the cycle by recursing on its children. Note a 735 * cycle like: 736 * a : b 737 * b : c 738 * c : b 739 * will cause this to erroneously complain about a being in 740 * the cycle, but this is a good approximation. 741 */ 742 if (gn->made == CYCLE) { 743 Error("Graph cycles through `%s'", gn->name); 744 gn->made = ENDCYCLE; | 726 727 if (gn->made == UPTODATE) { 728 printf("`%s' is up to date.\n", gn->name); 729 } else if (gn->unmade != 0) { 730 if (cycle) { 731 Boolean t = TRUE; 732 /* 733 * If printing cycles and came to one that has unmade children, 734 * print out the cycle by recursing on its children. Note a 735 * cycle like: 736 * a : b 737 * b : c 738 * c : b 739 * will cause this to erroneously complain about a being in 740 * the cycle, but this is a good approximation. 741 */ 742 if (gn->made == CYCLE) { 743 Error("Graph cycles through `%s'", gn->name); 744 gn->made = ENDCYCLE; |
745 Lst_ForEach(gn->children, MakePrintStatus, (void *)&t); | 745 Lst_ForEach(gn->children, MakePrintStatus, &t); |
746 gn->made = UNMADE; 747 } else if (gn->made != ENDCYCLE) { 748 gn->made = CYCLE; | 746 gn->made = UNMADE; 747 } else if (gn->made != ENDCYCLE) { 748 gn->made = CYCLE; |
749 Lst_ForEach(gn->children, MakePrintStatus, (void *)&t); | 749 Lst_ForEach(gn->children, MakePrintStatus, &t); |
750 } 751 } else { 752 printf("`%s' not remade because of errors.\n", gn->name); 753 } 754 } 755 return (0); 756} 757 --- 34 unchanged lines hidden (view full) --- 792 * Make an initial downward pass over the graph, marking nodes to be made 793 * as we go down. We call Suff_FindDeps to find where a node is and 794 * to get some children for it if it has none and also has no commands. 795 * If the node is a leaf, we stick it on the toBeMade queue to 796 * be looked at in a minute, otherwise we add its children to our queue 797 * and go on about our business. 798 */ 799 while (!Lst_IsEmpty(examine)) { | 750 } 751 } else { 752 printf("`%s' not remade because of errors.\n", gn->name); 753 } 754 } 755 return (0); 756} 757 --- 34 unchanged lines hidden (view full) --- 792 * Make an initial downward pass over the graph, marking nodes to be made 793 * as we go down. We call Suff_FindDeps to find where a node is and 794 * to get some children for it if it has none and also has no commands. 795 * If the node is a leaf, we stick it on the toBeMade queue to 796 * be looked at in a minute, otherwise we add its children to our queue 797 * and go on about our business. 798 */ 799 while (!Lst_IsEmpty(examine)) { |
800 gn = (GNode *)Lst_DeQueue(examine); | 800 gn = Lst_DeQueue(examine); |
801 802 if (!gn->make) { 803 gn->make = TRUE; 804 numNodes++; 805 806 /* 807 * Apply any .USE rules before looking for implicit dependencies 808 * to make sure everything has commands that should... 809 */ | 801 802 if (!gn->make) { 803 gn->make = TRUE; 804 numNodes++; 805 806 /* 807 * Apply any .USE rules before looking for implicit dependencies 808 * to make sure everything has commands that should... 809 */ |
810 Lst_ForEach(gn->children, MakeHandleUse, (void *)gn); | 810 Lst_ForEach(gn->children, MakeHandleUse, gn); |
811 Suff_FindDeps(gn); 812 813 if (gn->unmade != 0) { | 811 Suff_FindDeps(gn); 812 813 if (gn->unmade != 0) { |
814 Lst_ForEach(gn->children, MakeAddChild, (void *)examine); | 814 Lst_ForEach(gn->children, MakeAddChild, examine); |
815 } else { | 815 } else { |
816 Lst_EnQueue(toBeMade, (void *)gn); | 816 Lst_EnQueue(toBeMade, gn); |
817 } 818 } 819 } 820 821 Lst_Destroy(examine, NOFREE); 822 823 if (queryFlag) { 824 /* --- 19 unchanged lines hidden (view full) --- 844 * will cause us to be idle most of the time while our children run as 845 * much as possible. Because the job table is kept as full as possible, 846 * the only time when it will be empty is when all the jobs which need 847 * running have been run, so that is the end condition of this loop. 848 * Note that the Job module will exit if there were any errors unless the 849 * keepgoing flag was given. 850 */ 851 while (!Job_Empty ()) { | 817 } 818 } 819 } 820 821 Lst_Destroy(examine, NOFREE); 822 823 if (queryFlag) { 824 /* --- 19 unchanged lines hidden (view full) --- 844 * will cause us to be idle most of the time while our children run as 845 * much as possible. Because the job table is kept as full as possible, 846 * the only time when it will be empty is when all the jobs which need 847 * running have been run, so that is the end condition of this loop. 848 * Note that the Job module will exit if there were any errors unless the 849 * keepgoing flag was given. 850 */ 851 while (!Job_Empty ()) { |
852 Job_CatchOutput(!Lst_IsEmpty (toBeMade)); | 852 Job_CatchOutput(!Lst_IsEmpty(toBeMade)); |
853 Job_CatchChildren(!usePipes); 854 MakeStartJobs(); 855 } 856 857 errors = Job_Finish(); 858 859 /* 860 * Print the final status of each target. E.g. if it wasn't made 861 * because some inferior reported an error. 862 */ 863 errors = ((errors == 0) && (numNodes != 0)); | 853 Job_CatchChildren(!usePipes); 854 MakeStartJobs(); 855 } 856 857 errors = Job_Finish(); 858 859 /* 860 * Print the final status of each target. E.g. if it wasn't made 861 * because some inferior reported an error. 862 */ 863 errors = ((errors == 0) && (numNodes != 0)); |
864 Lst_ForEach(targs, MakePrintStatus, (void *)&errors); | 864 Lst_ForEach(targs, MakePrintStatus, &errors); |
865 866 return (TRUE); 867} | 865 866 return (TRUE); 867} |