Replace another bunch of Lst_ForEachs by LST_FOREACHs and simplify code.
This commit is contained in:
parent
172eba2632
commit
cbbd172aea
@ -96,18 +96,13 @@ static int numNodes; /* Number of nodes to be processed. If this
|
||||
* is non-zero when Job_Empty() returns
|
||||
* TRUE, there's a cycle in the graph */
|
||||
|
||||
static int MakeAddChild(void *, void *);
|
||||
static int MakeAddAllSrc(void *, void *);
|
||||
static int MakeTimeStamp(void *, void *);
|
||||
static int MakeHandleUse(void *, void *);
|
||||
static Boolean MakeStartJobs(void);
|
||||
static int MakePrintStatus(void *, void *);
|
||||
|
||||
/*-
|
||||
*-----------------------------------------------------------------------
|
||||
* Make_TimeStamp --
|
||||
* Set the cmtime field of a parent node based on the mtime stamp in its
|
||||
* child. Called from MakeOODate via Lst_ForEach.
|
||||
* child. Called from MakeOODate via LST_FOREACH.
|
||||
*
|
||||
* Results:
|
||||
* Always returns 0.
|
||||
@ -127,13 +122,6 @@ Make_TimeStamp(GNode *pgn, GNode *cgn)
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
MakeTimeStamp(void *pgn, void *cgn)
|
||||
{
|
||||
|
||||
return (Make_TimeStamp(pgn, cgn));
|
||||
}
|
||||
|
||||
/*-
|
||||
*-----------------------------------------------------------------------
|
||||
* Make_OODate --
|
||||
@ -156,6 +144,7 @@ Boolean
|
||||
Make_OODate(GNode *gn)
|
||||
{
|
||||
Boolean oodate;
|
||||
LstNode *ln;
|
||||
|
||||
/*
|
||||
* Certain types of targets needn't even be sought as their datedness
|
||||
@ -250,46 +239,23 @@ Make_OODate(GNode *gn)
|
||||
* thinking they're out-of-date.
|
||||
*/
|
||||
if (!oodate) {
|
||||
Lst_ForEach(&gn->parents, MakeTimeStamp, gn);
|
||||
LST_FOREACH(ln, &gn->parents)
|
||||
if (Make_TimeStamp(Lst_Datum(ln), gn))
|
||||
break;
|
||||
}
|
||||
|
||||
return (oodate);
|
||||
}
|
||||
|
||||
/*-
|
||||
*-----------------------------------------------------------------------
|
||||
* MakeAddChild --
|
||||
* Function used by Make_Run to add a child to the list l.
|
||||
* It will only add the child if its make field is FALSE.
|
||||
*
|
||||
* Results:
|
||||
* Always returns 0
|
||||
*
|
||||
* Side Effects:
|
||||
* The given list is extended
|
||||
*-----------------------------------------------------------------------
|
||||
*/
|
||||
static int
|
||||
MakeAddChild(void *gnp, void *lp)
|
||||
{
|
||||
GNode *gn = gnp;
|
||||
Lst *l = lp;
|
||||
|
||||
if (!gn->make && !(gn->type & OP_USE)) {
|
||||
Lst_EnQueue(l, gn);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*-
|
||||
*-----------------------------------------------------------------------
|
||||
* Make_HandleUse --
|
||||
* Function called by Make_Run and SuffApplyTransform on the downward
|
||||
* pass to handle .USE and transformation nodes. A callback function
|
||||
* for Lst_ForEach, it implements the .USE and transformation
|
||||
* for LST_FOREACH, it implements the .USE and transformation
|
||||
* functionality by copying the node's commands, type flags
|
||||
* and children to the parent node. Should be called before the
|
||||
* children are enqueued to be looked at by MakeAddChild.
|
||||
* children are enqueued to be looked at.
|
||||
*
|
||||
* A .USE node is much like an explicit transformation rule, except
|
||||
* its commands are always added to the target node, even if the
|
||||
@ -345,13 +311,6 @@ Make_HandleUse(GNode *cgn, GNode *pgn)
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
MakeHandleUse(void *pgn, void *cgn)
|
||||
{
|
||||
|
||||
return (Make_HandleUse(pgn, cgn));
|
||||
}
|
||||
|
||||
/*-
|
||||
*-----------------------------------------------------------------------
|
||||
* Make_Update --
|
||||
@ -513,75 +472,6 @@ Make_Update(GNode *cgn)
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
/*-
|
||||
*-----------------------------------------------------------------------
|
||||
* MakeAddAllSrc --
|
||||
* Add a child's name to the ALLSRC and OODATE variables of the given
|
||||
* node. Called from Make_DoAllVar via Lst_ForEach. A child is added only
|
||||
* if it has not been given the .EXEC, .USE or .INVISIBLE attributes.
|
||||
* .EXEC and .USE children are very rarely going to be files, so...
|
||||
* A child is added to the OODATE variable if its modification time is
|
||||
* later than that of its parent, as defined by Make, except if the
|
||||
* parent is a .JOIN node. In that case, it is only added to the OODATE
|
||||
* variable if it was actually made (since .JOIN nodes don't have
|
||||
* modification times, the comparison is rather unfair...)..
|
||||
*
|
||||
* Results:
|
||||
* Always returns 0
|
||||
*
|
||||
* Side Effects:
|
||||
* The ALLSRC variable for the given node is extended.
|
||||
*-----------------------------------------------------------------------
|
||||
*/
|
||||
static int
|
||||
MakeAddAllSrc(void *cgnp, void *pgnp)
|
||||
{
|
||||
GNode *cgn = (GNode *) cgnp;
|
||||
GNode *pgn = (GNode *) pgnp;
|
||||
|
||||
if ((cgn->type & (OP_EXEC | OP_USE | OP_INVISIBLE)) == 0) {
|
||||
char *child;
|
||||
char *p1 = NULL;
|
||||
|
||||
if (OP_NOP(cgn->type)) {
|
||||
/*
|
||||
* this node is only source; use the specific pathname for it
|
||||
*/
|
||||
child = cgn->path ? cgn->path : cgn->name;
|
||||
}
|
||||
else
|
||||
child = Var_Value(TARGET, cgn, &p1);
|
||||
Var_Append(ALLSRC, child, pgn);
|
||||
if (pgn->type & OP_JOIN) {
|
||||
if (cgn->made == MADE) {
|
||||
Var_Append(OODATE, child, pgn);
|
||||
}
|
||||
} else if ((pgn->mtime < cgn->mtime) ||
|
||||
(cgn->mtime >= now && cgn->made == MADE))
|
||||
{
|
||||
/*
|
||||
* It goes in the OODATE variable if the parent is younger than the
|
||||
* child or if the child has been modified more recently than
|
||||
* the start of the make. This is to keep pmake from getting
|
||||
* confused if something else updates the parent after the
|
||||
* make starts (shouldn't happen, I know, but sometimes it
|
||||
* does). In such a case, if we've updated the kid, the parent
|
||||
* is likely to have a modification time later than that of
|
||||
* the kid and anything that relies on the OODATE variable will
|
||||
* be hosed.
|
||||
*
|
||||
* XXX: This will cause all made children to go in the OODATE
|
||||
* variable, even if they're not touched, if RECHECK isn't defined,
|
||||
* since cgn->mtime is set to now in Make_Update. According to
|
||||
* some people, this is good...
|
||||
*/
|
||||
Var_Append(OODATE, child, pgn);
|
||||
}
|
||||
free(p1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*-
|
||||
*-----------------------------------------------------------------------
|
||||
* Make_DoAllVar --
|
||||
@ -607,22 +497,80 @@ MakeAddAllSrc(void *cgnp, void *pgnp)
|
||||
void
|
||||
Make_DoAllVar(GNode *gn)
|
||||
{
|
||||
LstNode *ln;
|
||||
GNode *cgn;
|
||||
char *child;
|
||||
char *p1;
|
||||
|
||||
Lst_ForEach(&gn->children, MakeAddAllSrc, gn);
|
||||
LST_FOREACH(ln, &gn->children) {
|
||||
/*
|
||||
* Add the child's name to the ALLSRC and OODATE variables of
|
||||
* the given node. The child is added only if it has not been
|
||||
* given the .EXEC, .USE or .INVISIBLE attributes. .EXEC and
|
||||
* .USE children are very rarely going to be files, so...
|
||||
*
|
||||
* A child is added to the OODATE variable if its modification
|
||||
* time is later than that of its parent, as defined by Make,
|
||||
* except if the parent is a .JOIN node. In that case, it is
|
||||
* only added to the OODATE variable if it was actually made
|
||||
* (since .JOIN nodes don't have modification times, the
|
||||
* comparison is rather unfair...).
|
||||
*/
|
||||
cgn = Lst_Datum(ln);
|
||||
|
||||
if (!Var_Exists (OODATE, gn)) {
|
||||
Var_Set(OODATE, "", gn);
|
||||
}
|
||||
if (!Var_Exists (ALLSRC, gn)) {
|
||||
Var_Set(ALLSRC, "", gn);
|
||||
}
|
||||
if ((cgn->type & (OP_EXEC | OP_USE | OP_INVISIBLE)) == 0) {
|
||||
p1 = NULL;
|
||||
if (OP_NOP(cgn->type)) {
|
||||
/*
|
||||
* this node is only source; use the specific
|
||||
* pathname for it
|
||||
*/
|
||||
child = cgn->path ? cgn->path : cgn->name;
|
||||
} else
|
||||
child = Var_Value(TARGET, cgn, &p1);
|
||||
Var_Append(ALLSRC, child, gn);
|
||||
if (gn->type & OP_JOIN) {
|
||||
if (cgn->made == MADE) {
|
||||
Var_Append(OODATE, child, gn);
|
||||
}
|
||||
} else if (gn->mtime < cgn->mtime ||
|
||||
(cgn->mtime >= now && cgn->made == MADE)) {
|
||||
/*
|
||||
* It goes in the OODATE variable if the parent
|
||||
* is younger than the child or if the child has
|
||||
* been modified more recently than the start of
|
||||
* the make. This is to keep pmake from getting
|
||||
* confused if something else updates the parent
|
||||
* after the make starts (shouldn't happen, I
|
||||
* know, but sometimes it does). In such a case,
|
||||
* if we've updated the kid, the parent is
|
||||
* likely to have a modification time later than
|
||||
* that of the kid and anything that relies on
|
||||
* the OODATE variable will be hosed.
|
||||
*
|
||||
* XXX: This will cause all made children to
|
||||
* go in the OODATE variable, even if they're
|
||||
* not touched, if RECHECK isn't defined, since
|
||||
* cgn->mtime is set to now in Make_Update.
|
||||
* According to some people, this is good...
|
||||
*/
|
||||
Var_Append(OODATE, child, gn);
|
||||
}
|
||||
free(p1);
|
||||
}
|
||||
}
|
||||
|
||||
if (gn->type & OP_JOIN) {
|
||||
char *p1;
|
||||
if (!Var_Exists (OODATE, gn)) {
|
||||
Var_Set(OODATE, "", gn);
|
||||
}
|
||||
if (!Var_Exists (ALLSRC, gn)) {
|
||||
Var_Set(ALLSRC, "", gn);
|
||||
}
|
||||
|
||||
Var_Set(TARGET, Var_Value(ALLSRC, gn, &p1), gn);
|
||||
free(p1);
|
||||
}
|
||||
if (gn->type & OP_JOIN) {
|
||||
Var_Set(TARGET, Var_Value(ALLSRC, gn, &p1), gn);
|
||||
free(p1);
|
||||
}
|
||||
}
|
||||
|
||||
/*-
|
||||
@ -707,29 +655,24 @@ MakeStartJobs(void)
|
||||
* MakePrintStatus --
|
||||
* Print the status of a top-level node, viz. it being up-to-date
|
||||
* already or not created due to an error in a lower level.
|
||||
* Callback function for Make_Run via Lst_ForEach. If gn->unmade is
|
||||
* Callback function for Make_Run via LST_FOREACH. If gn->unmade is
|
||||
* nonzero and that is meant to imply a cycle in the graph, then
|
||||
* cycle is TRUE.
|
||||
*
|
||||
* Results:
|
||||
* Always returns 0.
|
||||
*
|
||||
* Side Effects:
|
||||
* A message may be printed.
|
||||
*
|
||||
*-----------------------------------------------------------------------
|
||||
*/
|
||||
static int
|
||||
MakePrintStatus(void *gnp, void *cyclep)
|
||||
static void
|
||||
MakePrintStatus(GNode *gn, Boolean cycle)
|
||||
{
|
||||
GNode *gn = gnp;
|
||||
Boolean cycle = *(Boolean *)cyclep;
|
||||
LstNode *ln;
|
||||
|
||||
if (gn->made == UPTODATE) {
|
||||
printf("`%s' is up to date.\n", gn->name);
|
||||
} else if (gn->unmade != 0) {
|
||||
if (cycle) {
|
||||
Boolean t = TRUE;
|
||||
/*
|
||||
* If printing cycles and came to one that has unmade children,
|
||||
* print out the cycle by recursing on its children. Note a
|
||||
@ -743,17 +686,18 @@ MakePrintStatus(void *gnp, void *cyclep)
|
||||
if (gn->made == CYCLE) {
|
||||
Error("Graph cycles through `%s'", gn->name);
|
||||
gn->made = ENDCYCLE;
|
||||
Lst_ForEach(&gn->children, MakePrintStatus, &t);
|
||||
LST_FOREACH(ln, &gn->children)
|
||||
MakePrintStatus(Lst_Datum(ln), TRUE);
|
||||
gn->made = UNMADE;
|
||||
} else if (gn->made != ENDCYCLE) {
|
||||
gn->made = CYCLE;
|
||||
Lst_ForEach(&gn->children, MakePrintStatus, &t);
|
||||
LST_FOREACH(ln, &gn->children)
|
||||
MakePrintStatus(Lst_Datum(ln), TRUE);
|
||||
}
|
||||
} else {
|
||||
printf("`%s' not remade because of errors.\n", gn->name);
|
||||
}
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*-
|
||||
@ -781,8 +725,10 @@ Boolean
|
||||
Make_Run(Lst *targs)
|
||||
{
|
||||
GNode *gn; /* a temporary pointer */
|
||||
GNode *cgn;
|
||||
Lst examine; /* List of targets to examine */
|
||||
int errors; /* Number of errors the Job module reports */
|
||||
LstNode *ln;
|
||||
|
||||
Lst_Init(&examine);
|
||||
Lst_Duplicate(&examine, targs, NOCOPY);
|
||||
@ -807,11 +753,18 @@ Make_Run(Lst *targs)
|
||||
* Apply any .USE rules before looking for implicit dependencies
|
||||
* to make sure everything has commands that should...
|
||||
*/
|
||||
Lst_ForEach(&gn->children, MakeHandleUse, gn);
|
||||
LST_FOREACH(ln, &gn->children)
|
||||
if (Make_HandleUse(Lst_Datum(ln), gn))
|
||||
break;
|
||||
|
||||
Suff_FindDeps(gn);
|
||||
|
||||
if (gn->unmade != 0) {
|
||||
Lst_ForEach(&gn->children, MakeAddChild, &examine);
|
||||
LST_FOREACH(ln, &gn->children) {
|
||||
cgn = Lst_Datum(ln);
|
||||
if (!cgn->make && !(cgn->type & OP_USE))
|
||||
Lst_EnQueue(&examine, cgn);
|
||||
}
|
||||
} else {
|
||||
Lst_EnQueue(&toBeMade, gn);
|
||||
}
|
||||
@ -859,7 +812,8 @@ Make_Run(Lst *targs)
|
||||
* because some inferior reported an error.
|
||||
*/
|
||||
errors = ((errors == 0) && (numNodes != 0));
|
||||
Lst_ForEach(targs, MakePrintStatus, &errors);
|
||||
LST_FOREACH(ln, targs)
|
||||
MakePrintStatus(Lst_Datum(ln), errors);
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user