make(1): split ParseDoSrc into smaller functions

This commit is contained in:
rillig 2020-10-05 15:43:32 +00:00
parent da5a66a335
commit f61ca2efc4

View File

@ -1,4 +1,4 @@
/* $NetBSD: parse.c,v 1.362 2020/10/04 21:53:28 rillig Exp $ */
/* $NetBSD: parse.c,v 1.363 2020/10/05 15:43:32 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@ -131,7 +131,7 @@
#include "pathnames.h"
/* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */
MAKE_RCSID("$NetBSD: parse.c,v 1.362 2020/10/04 21:53:28 rillig Exp $");
MAKE_RCSID("$NetBSD: parse.c,v 1.363 2020/10/05 15:43:32 rillig Exp $");
/* types and constants */
@ -584,21 +584,8 @@ ParseMark(GNode *gn)
gn->lineno = curFile->lineno;
}
/*-
*----------------------------------------------------------------------
* ParseFindKeyword --
* Look in the table of keywords for one matching the given string.
*
* Input:
* str String to find
*
* Results:
* The index of the keyword, or -1 if it isn't there.
*
* Side Effects:
* None
*----------------------------------------------------------------------
*/
/* Look in the table of keywords for one matching the given string.
* Return the index of the keyword, or -1 if it isn't there. */
static int
ParseFindKeyword(const char *str)
{
@ -659,8 +646,7 @@ PrintLocation(FILE *f, const char *filename, size_t lineno)
*
* Increment "fatals" if the level is PARSE_FATAL, and continue parsing
* until the end of the current top-level makefile, then exit (see
* Parse_File).
*/
* Parse_File). */
static void
ParseVErrorInternal(FILE *f, const char *cfname, size_t clineno, int type,
const char *fmt, va_list ap)
@ -887,33 +873,12 @@ ApplyDependencyOperator(GNodeType op)
break;
}
/*-
*---------------------------------------------------------------------
* ParseDoSrc --
* Given the name of a source, figure out if it is an attribute
* and apply it to the targets if it is. Else decide if there is
* some attribute which should be applied *to* the source because
* of some special target and apply it if so. Otherwise, make the
* source be a child of the targets in the list 'targets'
*
* Input:
* tOp operator (if any) from special targets
* src name of the source to handle
*
* Results:
* None
*
* Side Effects:
* Operator bits may be added to the list of targets or to the source.
* The targets may have a new source added to their lists of children.
*---------------------------------------------------------------------
*/
static void
ParseDoSrc(int tOp, const char *src, ParseSpecial specType)
static Boolean
ParseDoSrcKeyword(const char *src, ParseSpecial specType)
{
GNode *gn = NULL;
static int wait_number = 0;
char wait_src[16];
GNode *gn;
if (*src == '.' && ch_isupper(src[1])) {
int keywd = ParseFindKeyword(src);
@ -921,7 +886,7 @@ ParseDoSrc(int tOp, const char *src, ParseSpecial specType)
int op = parseKeywords[keywd].op;
if (op != 0) {
ApplyDependencyOperator(op);
return;
return TRUE;
}
if (parseKeywords[keywd].spec == Wait) {
/*
@ -942,80 +907,112 @@ ParseDoSrc(int tOp, const char *src, ParseSpecial specType)
struct ParseLinkSrcArgs args = { gn, specType };
Lst_ForEach(targets, ParseLinkSrc, &args);
}
return;
return TRUE;
}
}
}
return FALSE;
}
switch (specType) {
case Main:
/*
* If we have noted the existence of a .MAIN, it means we need
* to add the sources of said target to the list of things
* to create. The string 'src' is likely to be free, so we
* must make a new copy of it. Note that this will only be
* invoked if the user didn't specify a target on the command
* line. This is to allow #ifmake's to succeed, or something...
*/
Lst_Append(create, bmake_strdup(src));
/*
* Add the name to the .TARGETS variable as well, so the user can
* employ that, if desired.
*/
Var_Append(".TARGETS", src, VAR_GLOBAL);
return;
static void
ParseDoSrcMain(const char *src)
{
/*
* If we have noted the existence of a .MAIN, it means we need
* to add the sources of said target to the list of things
* to create. The string 'src' is likely to be free, so we
* must make a new copy of it. Note that this will only be
* invoked if the user didn't specify a target on the command
* line. This is to allow #ifmake's to succeed, or something...
*/
Lst_Append(create, bmake_strdup(src));
/*
* Add the name to the .TARGETS variable as well, so the user can
* employ that, if desired.
*/
Var_Append(".TARGETS", src, VAR_GLOBAL);
}
case Order:
/*
* Create proper predecessor/successor links between the previous
* source and the current one.
*/
gn = Targ_GetNode(src);
if (doing_depend)
ParseMark(gn);
if (predecessor != NULL) {
Lst_Append(predecessor->order_succ, gn);
Lst_Append(gn->order_pred, predecessor);
if (DEBUG(PARSE)) {
debug_printf("# %s: added Order dependency %s - %s\n",
__func__, predecessor->name, gn->name);
Targ_PrintNode(predecessor, 0);
Targ_PrintNode(gn, 0);
}
static void
ParseDoSrcOrder(const char *src)
{
GNode *gn;
/*
* Create proper predecessor/successor links between the previous
* source and the current one.
*/
gn = Targ_GetNode(src);
if (doing_depend)
ParseMark(gn);
if (predecessor != NULL) {
Lst_Append(predecessor->order_succ, gn);
Lst_Append(gn->order_pred, predecessor);
if (DEBUG(PARSE)) {
debug_printf("# %s: added Order dependency %s - %s\n",
__func__, predecessor->name, gn->name);
Targ_PrintNode(predecessor, 0);
Targ_PrintNode(gn, 0);
}
/*
* The current source now becomes the predecessor for the next one.
*/
predecessor = gn;
break;
default:
/*
* If the source is not an attribute, we need to find/create
* a node for it. After that we can apply any operator to it
* from a special target or link it to its parents, as
* appropriate.
*
* In the case of a source that was the object of a :: operator,
* the attribute is applied to all of its instances (as kept in
* the 'cohorts' list of the node) or all the cohorts are linked
* to all the targets.
*/
/* Find/create the 'src' node and attach to all targets */
gn = Targ_GetNode(src);
if (doing_depend)
ParseMark(gn);
if (tOp) {
gn->type |= tOp;
} else {
{
struct ParseLinkSrcArgs args = { gn, specType };
Lst_ForEach(targets, ParseLinkSrc, &args);
}
}
break;
}
/*
* The current source now becomes the predecessor for the next one.
*/
predecessor = gn;
}
static void
ParseDoSrcOther(const char *src, GNodeType tOp, ParseSpecial specType)
{
GNode *gn;
/*
* If the source is not an attribute, we need to find/create
* a node for it. After that we can apply any operator to it
* from a special target or link it to its parents, as
* appropriate.
*
* In the case of a source that was the object of a :: operator,
* the attribute is applied to all of its instances (as kept in
* the 'cohorts' list of the node) or all the cohorts are linked
* to all the targets.
*/
/* Find/create the 'src' node and attach to all targets */
gn = Targ_GetNode(src);
if (doing_depend)
ParseMark(gn);
if (tOp) {
gn->type |= tOp;
} else {
{
struct ParseLinkSrcArgs args = { gn, specType };
Lst_ForEach(targets, ParseLinkSrc, &args);
}
}
}
/* Given the name of a source in a dependency line, figure out if it is an
* attribute (such as .SILENT) and apply it to the targets if it is. Else
* decide if there is some attribute which should be applied *to* the source
* because of some special target (such as .PHONY) and apply it if so.
* Otherwise, make the source a child of the targets in the list 'targets'.
*
* Input:
* tOp operator (if any) from special targets
* src name of the source to handle
*/
static void
ParseDoSrc(GNodeType tOp, const char *src, ParseSpecial specType)
{
if (ParseDoSrcKeyword(src, specType))
return;
if (specType == Main)
ParseDoSrcMain(src);
else if (specType == Order)
ParseDoSrcOrder(src);
else
ParseDoSrcOther(src, tOp, specType);
}
/* If we have yet to decide on a main target to make, in the absence of any