From 3dece030a5e04112872d080c6d19af24c8666aa3 Mon Sep 17 00:00:00 2001 From: Hartmut Brandt Date: Fri, 29 Apr 2005 14:37:44 +0000 Subject: [PATCH] Implement a pseudo-target .WARN that allows toggeling the warning flags for the current make. This does not override flags specified on the command line and these settings are not passed to sub-makes. --- usr.bin/make/cond.c | 4 +-- usr.bin/make/directive_hash.c | 48 ++++++++++++++-------------- usr.bin/make/globals.h | 4 ++- usr.bin/make/main.c | 60 ++++++++++++++++++++++++++++++++--- usr.bin/make/nonints.h | 2 +- usr.bin/make/parse.c | 23 ++++++++++++++ 6 files changed, 109 insertions(+), 32 deletions(-) diff --git a/usr.bin/make/cond.c b/usr.bin/make/cond.c index 792fe75edb80..fb2978aa19fd 100644 --- a/usr.bin/make/cond.c +++ b/usr.bin/make/cond.c @@ -1123,7 +1123,7 @@ Cond_Else(char *line __unused, int code __unused, int lineno __unused) while (isspace((u_char)*line)) line++; - if (*line != '\0' && (warnflags & WARN_DIRSYNTAX)) { + if (*line != '\0' && (warn_flags & WARN_DIRSYNTAX)) { Parse_Error(PARSE_WARNING, "junk after .else ignored '%s'", line); } @@ -1164,7 +1164,7 @@ Cond_Endif(char *line __unused, int code __unused, int lineno __unused) while (isspace((u_char)*line)) line++; - if (*line != '\0' && (warnflags & WARN_DIRSYNTAX)) { + if (*line != '\0' && (warn_flags & WARN_DIRSYNTAX)) { Parse_Error(PARSE_WARNING, "junk after .endif ignored '%s'", line); } diff --git a/usr.bin/make/directive_hash.c b/usr.bin/make/directive_hash.c index 3478bc52f815..bb43a18014bf 100644 --- a/usr.bin/make/directive_hash.c +++ b/usr.bin/make/directive_hash.c @@ -1,7 +1,7 @@ /* * DO NOT EDIT * $FreeBSD$ - * auto-generated from FreeBSD: src/usr.bin/make/parse.c,v 1.97 2005/04/28 07:55:55 harti Exp + * auto-generated from FreeBSD: src/usr.bin/make/parse.c,v 1.98 2005/04/28 12:05:43 harti Exp * DO NOT EDIT */ #include @@ -66,8 +66,8 @@ directive_hash(const u_char *key, size_t len) } /* * d=2 - * n=67 - * m=32 + * n=69 + * m=33 * c=2.09 * maxlen=1 * minklen=4 @@ -75,34 +75,34 @@ directive_hash(const u_char *key, size_t len) * minchar=46 * maxchar=95 * loop=0 - * numiter=2 + * numiter=8 * seed= */ static const signed char keyword_g[] = { - 17, -1, 18, 13, 26, 0, 0, 29, -1, 0, - 7, -1, -1, 23, 13, 27, -1, 0, 14, 24, - -1, -1, 0, 24, -1, 0, -1, 27, 19, 12, - 3, -1, -1, 3, 19, 28, 10, 17, -1, 8, - -1, -1, -1, 0, 5, 8, -1, 0, -1, -1, - 0, 27, 4, -1, -1, 25, -1, 30, -1, 8, - 16, -1, 0, -1, 0, 26, 14, + -1, 17, 16, 0, -1, -1, -1, -1, 25, 18, + 2, -1, -1, 27, 28, 1, 0, 15, 16, -1, + -1, 14, 19, 1, -1, 13, -1, 0, 1, -1, + 11, 15, 0, 8, 14, 18, 31, -1, -1, 22, + -1, 27, -1, 0, -1, 9, -1, -1, -1, 21, + 3, 25, 0, 0, 0, -1, -1, 6, 0, 19, + -1, -1, -1, 23, -1, 17, -1, 0, 0, }; static const u_char keyword_T0[] = { - 17, 32, 43, 6, 64, 15, 20, 26, 30, 64, - 54, 31, 6, 61, 4, 49, 62, 37, 23, 50, - 6, 58, 29, 19, 32, 50, 56, 8, 18, 40, - 51, 36, 6, 27, 42, 3, 59, 12, 46, 23, - 9, 50, 4, 16, 44, 25, 15, 40, 62, 55, + 8, 30, 55, 61, 14, 13, 48, 1, 18, 12, + 0, 52, 1, 40, 44, 52, 33, 58, 29, 29, + 3, 30, 26, 42, 1, 49, 10, 26, 5, 45, + 65, 13, 6, 22, 45, 61, 7, 25, 62, 65, + 8, 34, 48, 50, 5, 63, 33, 38, 52, 33, }; static const u_char keyword_T1[] = { - 24, 38, 31, 14, 65, 31, 23, 17, 27, 45, - 32, 44, 19, 45, 18, 31, 28, 43, 0, 21, - 29, 27, 42, 55, 21, 31, 14, 13, 66, 17, - 39, 40, 5, 4, 5, 4, 52, 28, 21, 12, - 7, 54, 6, 43, 49, 24, 7, 27, 0, 24, + 44, 18, 49, 61, 56, 13, 1, 54, 1, 47, + 46, 17, 22, 36, 25, 66, 14, 36, 58, 51, + 60, 22, 61, 19, 43, 37, 5, 18, 50, 58, + 32, 65, 47, 12, 28, 34, 65, 29, 59, 67, + 48, 36, 15, 41, 44, 11, 39, 29, 18, 68, }; @@ -122,8 +122,8 @@ keyword_hash(const u_char *key, size_t len) f1 += keyword_T1[-46 + *kp]; } - f0 %= 67; - f1 %= 67; + f0 %= 69; + f1 %= 69; - return (keyword_g[f0] + keyword_g[f1]) % 32; + return (keyword_g[f0] + keyword_g[f1]) % 33; } diff --git a/usr.bin/make/globals.h b/usr.bin/make/globals.h index 95282724cd27..fa6c260ea54d 100644 --- a/usr.bin/make/globals.h +++ b/usr.bin/make/globals.h @@ -121,6 +121,8 @@ extern Boolean oldVars; /* Do old-style variable substitution */ extern int debug; /* warning flags */ -extern uint32_t warnflags; +extern uint32_t warn_cmd; /* positive warning flags on command line */ +extern uint32_t warn_nocmd; /* negative warning flags on command line */ +extern uint32_t warn_flags; /* current warning flags */ #endif /* globals_h_1c1edb96 */ diff --git a/usr.bin/make/main.c b/usr.bin/make/main.c index 1588f3c693ee..8bb88973ba1a 100644 --- a/usr.bin/make/main.c +++ b/usr.bin/make/main.c @@ -107,7 +107,9 @@ Lst create = Lst_Initializer(create); time_t now; /* Time at start of make */ struct GNode *DEFAULT; /* .DEFAULT node */ Boolean allPrecious; /* .PRECIOUS given on line by itself */ -uint32_t warnflags; +uint32_t warn_flags; /* actual warning flags */ +uint32_t warn_cmd; /* command line warning flags */ +uint32_t warn_nocmd; /* command line no-warning flags */ static Boolean noBuiltins; /* -r flag */ @@ -170,6 +172,58 @@ MFLAGS_append(const char *flag, char *arg) } } +/** + * Main_ParseWarn + * + * Handle argument to warning option. + */ +int +Main_ParseWarn(const char *arg, int iscmd) +{ + int i, neg; + + static const struct { + const char *option; + uint32_t flag; + } options[] = { + { "dirsyntax", WARN_DIRSYNTAX }, + { NULL, 0 } + }; + + neg = 0; + if (arg[0] == 'n' && arg[1] == 'o') { + neg = 1; + arg += 2; + } + + for (i = 0; options[i].option != NULL; i++) + if (strcmp(arg, options[i].option) == 0) + break; + + if (options[i].option == NULL) + /* unknown option */ + return (-1); + + if (iscmd) { + if (!neg) { + warn_cmd |= options[i].flag; + warn_nocmd &= ~options[i].flag; + warn_flags |= options[i].flag; + } else { + warn_nocmd |= options[i].flag; + warn_cmd &= ~options[i].flag; + warn_flags &= ~options[i].flag; + } + } else { + if (!neg) { + warn_flags |= (options[i].flag & ~warn_nocmd); + } else { + warn_flags &= ~(options[i].flag | warn_cmd); + } + } + return (0); +} + /** * MainParseArgs * Parse a given argument vector. Called from main() and from @@ -347,10 +401,8 @@ MainParseArgs(int argc, char **argv) MFLAGS_append("-v", NULL); break; case 'x': - if (strncmp(optarg, "dirsyntax", strlen(optarg)) == 0) { + if (Main_ParseWarn(optarg, 1) != -1) MFLAGS_append("-x", optarg); - warnflags |= WARN_DIRSYNTAX; - } break; default: diff --git a/usr.bin/make/nonints.h b/usr.bin/make/nonints.h index 3bef7cea3977..a1ce141ad134 100644 --- a/usr.bin/make/nonints.h +++ b/usr.bin/make/nonints.h @@ -45,7 +45,7 @@ struct Buffer; void Main_ParseArgLine(char *, int); +int Main_ParseWarn(const char *, int); Buffer *Cmd_Exec(char *, const char **); - #endif /* nonints_h_33c5dafb */ diff --git a/usr.bin/make/parse.c b/usr.bin/make/parse.c index 8274aa453520..f53cf8bda230 100644 --- a/usr.bin/make/parse.c +++ b/usr.bin/make/parse.c @@ -174,6 +174,7 @@ typedef enum { SingleShell, /* .SINGLESHELL */ Suffixes, /* .SUFFIXES */ Wait, /* .WAIT */ + Warn, /* .WARN */ Attribute /* Generic attribute */ } ParseSpecial; @@ -231,6 +232,7 @@ static const struct keyword { { ".SUFFIXES", Suffixes, 0 }, { ".USE", Attribute, OP_USE }, { ".WAIT", Wait, 0 }, + { ".WARN", Warn, 0 }, /* KEYWORD-END-TAG */ }; #define NKEYWORDS (sizeof(parseKeywords) / sizeof(parseKeywords[0])) @@ -396,6 +398,23 @@ ParsePopInput(void) return (TAILQ_EMPTY(&includes) ? DONE : CONTINUE); } +/** + * parse_warn + * Parse the .WARN pseudo-target. + */ +static void +parse_warn(char *line) +{ + char **argv; + int argc; + int i; + + argv = brk_string(line, &argc, TRUE); + + for (i = 1; i < argc; i++) + Main_ParseWarn(argv[i], 0); +} + /*- *--------------------------------------------------------------------- * ParseLinkSrc -- @@ -1065,6 +1084,10 @@ ParseDoDependency(char *line) Main_ParseArgLine(line, 0); *line = '\0'; + } else if (specType == Warn) { + parse_warn(line); + *line = '\0'; + } else if (specType == ExShell) { if (Job_ParseShell(line) != SUCCESS) { Parse_Error(PARSE_FATAL,