Module Name: src Committed By: rillig Date: Mon Dec 27 18:54:19 UTC 2021
Modified Files: src/usr.bin/make: cond.c main.c parse.c src/usr.bin/make/unit-tests: cond-short.mk cond-token-number.exp cond-token-number.mk var-eval-short.exp var-eval-short.mk Log Message: make: clean up comments To generate a diff of this commit: cvs rdiff -u -r1.306 -r1.307 src/usr.bin/make/cond.c cvs rdiff -u -r1.549 -r1.550 src/usr.bin/make/main.c cvs rdiff -u -r1.584 -r1.585 src/usr.bin/make/parse.c cvs rdiff -u -r1.18 -r1.19 src/usr.bin/make/unit-tests/cond-short.mk cvs rdiff -u -r1.4 -r1.5 src/usr.bin/make/unit-tests/cond-token-number.exp cvs rdiff -u -r1.5 -r1.6 src/usr.bin/make/unit-tests/cond-token-number.mk cvs rdiff -u -r1.16 -r1.17 src/usr.bin/make/unit-tests/var-eval-short.exp cvs rdiff -u -r1.7 -r1.8 src/usr.bin/make/unit-tests/var-eval-short.mk Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/make/cond.c diff -u src/usr.bin/make/cond.c:1.306 src/usr.bin/make/cond.c:1.307 --- src/usr.bin/make/cond.c:1.306 Wed Dec 15 12:58:01 2021 +++ src/usr.bin/make/cond.c Mon Dec 27 18:54:19 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: cond.c,v 1.306 2021/12/15 12:58:01 rillig Exp $ */ +/* $NetBSD: cond.c,v 1.307 2021/12/27 18:54:19 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -95,7 +95,7 @@ #include "dir.h" /* "@(#)cond.c 8.2 (Berkeley) 1/2/94" */ -MAKE_RCSID("$NetBSD: cond.c,v 1.306 2021/12/15 12:58:01 rillig Exp $"); +MAKE_RCSID("$NetBSD: cond.c,v 1.307 2021/12/27 18:54:19 rillig Exp $"); /* * The parsing of conditional expressions is based on this grammar: @@ -123,8 +123,8 @@ MAKE_RCSID("$NetBSD: cond.c,v 1.306 2021 * TOK_RPAREN for ')' * * Other terminal symbols are evaluated using either the default function or - * the function given in the terminal, they return either TOK_TRUE or - * TOK_FALSE. + * the function given in the terminal, they return either TOK_TRUE, TOK_FALSE + * or TOK_ERROR. */ typedef enum Token { TOK_FALSE, TOK_TRUE, TOK_AND, TOK_OR, TOK_NOT, @@ -450,12 +450,11 @@ CondParser_StringExpr(CondParser *par, c } /* - * Parse a string from a variable expression or an optionally quoted - * string. This is called for the left-hand and right-hand sides of - * comparisons. + * Parse a string from a variable expression or an optionally quoted string, + * on the left-hand and right-hand sides of comparisons. * * Results: - * Returns the string, absent any quotes, or NULL on error. + * Returns the string without any enclosing quotes, or NULL on error. * Sets out_quoted if the leaf was a quoted string literal. */ static void Index: src/usr.bin/make/main.c diff -u src/usr.bin/make/main.c:1.549 src/usr.bin/make/main.c:1.550 --- src/usr.bin/make/main.c:1.549 Mon Dec 27 18:26:22 2021 +++ src/usr.bin/make/main.c Mon Dec 27 18:54:19 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.549 2021/12/27 18:26:22 rillig Exp $ */ +/* $NetBSD: main.c,v 1.550 2021/12/27 18:54:19 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -111,7 +111,7 @@ #include "trace.h" /* "@(#)main.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: main.c,v 1.549 2021/12/27 18:26:22 rillig Exp $"); +MAKE_RCSID("$NetBSD: main.c,v 1.550 2021/12/27 18:54:19 rillig Exp $"); #if defined(MAKE_NATIVE) && !defined(lint) __COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993 " "The Regents of the University of California. " @@ -178,10 +178,6 @@ explode(const char *flags) return st; } -/* - * usage -- - * exit with usage message - */ MAKE_ATTR_DEAD static void usage(void) { @@ -503,7 +499,7 @@ MainParseArg(char c, const char *argvalu break; case 'W': opts.parseWarnFatal = true; - /* XXX: why no Var_Append? */ + /* XXX: why no Global_Append? */ break; case 'X': opts.varNoExportEnv = true; @@ -1075,13 +1071,13 @@ ignore_pwd: #endif /* - * Find the .OBJDIR. If MAKEOBJDIRPREFIX, or failing that, - * MAKEOBJDIR is set in the environment, try only that value - * and fall back to .CURDIR if it does not exist. + * Find the .OBJDIR. If MAKEOBJDIRPREFIX, or failing that, MAKEOBJDIR is set + * in the environment, try only that value and fall back to .CURDIR if it + * does not exist. * * Otherwise, try _PATH_OBJDIR.MACHINE-MACHINE_ARCH, _PATH_OBJDIR.MACHINE, - * and * finally _PATH_OBJDIRPREFIX`pwd`, in that order. If none - * of these paths exist, just use .CURDIR. + * and finally _PATH_OBJDIRPREFIX`pwd`, in that order. If none of these + * paths exist, just use .CURDIR. */ static void InitObjdir(const char *machine, const char *machine_arch) @@ -1401,10 +1397,8 @@ main_Init(int argc, char **argv) Global_Set("MAKE_VERSION", MAKE_VERSION); #endif Global_Set(".newline", "\n"); /* handy for :@ loops */ - /* - * This is the traditional preference for makefiles. - */ #ifndef MAKEFILE_PREFERENCE_LIST + /* This is the traditional preference for makefiles. */ # define MAKEFILE_PREFERENCE_LIST "makefile Makefile" #endif Global_Set(MAKE_MAKEFILE_PREFERENCE, MAKEFILE_PREFERENCE_LIST); @@ -1436,7 +1430,6 @@ main_Init(int argc, char **argv) Global_Set(MAKEOVERRIDES, ""); Global_Set("MFLAGS", ""); Global_Set(".ALLTARGETS", ""); - /* some makefiles need to know this */ Var_Set(SCOPE_CMDLINE, MAKE_LEVEL ".ENV", MAKE_LEVEL_ENV); /* Set some other useful variables. */ @@ -1468,11 +1461,6 @@ main_Init(int argc, char **argv) #endif Dir_Init(); - /* - * First snag any flags out of the MAKE environment variable. - * (Note this is *not* MAKEFLAGS since /bin/make uses that and it's - * in a different format). - */ #ifdef POSIX { char *p1 = explode(getenv("MAKEFLAGS")); @@ -1480,13 +1468,14 @@ main_Init(int argc, char **argv) free(p1); } #else + /* + * First snag any flags out of the MAKE environment variable. + * (Note this is *not* MAKEFLAGS since /bin/make uses that and it's + * in a different format). + */ Main_ParseArgLine(getenv("MAKE")); #endif - /* - * Find where we are (now). - * We take care of PWD for the automounter below... - */ if (getcwd(curdir, MAXPATHLEN) == NULL) { (void)fprintf(stderr, "%s: getcwd: %s.\n", progname, strerror(errno)); @@ -1498,9 +1487,6 @@ main_Init(int argc, char **argv) if (opts.enterFlag) printf("%s: Entering directory `%s'\n", progname, curdir); - /* - * Verify that cwd is sane. - */ if (stat(curdir, &sa) == -1) { (void)fprintf(stderr, "%s: %s: %s.\n", progname, curdir, strerror(errno)); @@ -1514,10 +1500,6 @@ main_Init(int argc, char **argv) InitObjdir(machine, machine_arch); - /* - * Initialize archive, target and suffix modules in preparation for - * parsing the makefile(s) - */ Arch_Init(); Suff_Init(); Trace_Init(tracefile); @@ -1578,10 +1560,6 @@ main_PrepareMaking(void) InitMaxJobs(); - /* - * Be compatible if the user did not specify -j and did not explicitly - * turn compatibility on. - */ if (!opts.compatMake && !forceJobs) opts.compatMake = true; @@ -1634,15 +1612,10 @@ main_CleanUp(void) { #ifdef CLEANUP Lst_DoneCall(&opts.variables, free); - /* - * Don't free the actual strings from opts.makefiles, they may be - * used in GNodes. - */ Lst_Done(&opts.makefiles); Lst_DoneCall(&opts.create, free); #endif - /* print the graph now it's been processed if the user requested it */ if (DEBUG(GRAPH2)) Targ_PrintGraph(2); @@ -1691,9 +1664,7 @@ main(int argc, char **argv) /* * Open and parse the given makefile, with all its side effects. - * - * Results: - * 0 if ok. -1 if couldn't open file. + * Return -1 if the file could not be opened. */ static int ReadMakefile(const char *fname) @@ -1755,22 +1726,19 @@ found: } /* - * Cmd_Exec -- - * Execute the command in cmd, and return the output of that command - * in a string. In the output, newlines are replaced with spaces. + * Execute the command in cmd, and return its output (only stdout, not + * stderr). In the output, replace newlines with spaces. * * Results: - * A string containing the output of the command, or the empty string. + * The output of the command, can be empty. * *errfmt returns a format string describing the command failure, * if any, using a single %s conversion specification. - * - * Side Effects: - * The string must be freed by the caller. + * TODO: replace errfmt with an actual error message. */ char * Cmd_Exec(const char *cmd, const char **errfmt) { - const char *args[4]; /* Args for invoking the shell */ + const char *args[4]; /* Arguments for invoking the shell */ int pipefds[2]; int cpid; /* Child PID */ int pid; /* PID from wait() */ @@ -1786,17 +1754,12 @@ Cmd_Exec(const char *cmd, const char **e if (shellName == NULL) Shell_Init(); - /* - * Set up arguments for shell - */ + args[0] = shellName; args[1] = "-c"; args[2] = cmd; args[3] = NULL; - /* - * Open a pipe for fetching its output - */ if (pipe(pipefds) == -1) { *errfmt = "Couldn't create pipe for \"%s\""; goto bad; @@ -1804,18 +1767,9 @@ Cmd_Exec(const char *cmd, const char **e Var_ReexportVars(); - /* - * Fork - */ switch (cpid = vfork()) { case 0: - (void)close(pipefds[0]); /* Close input side of pipe */ - - /* - * Duplicate the output stream to the shell's output, then - * shut the extra thing down. Note we don't fetch the error - * stream...why not? Why? - */ + (void)close(pipefds[0]); (void)dup2(pipefds[1], 1); (void)close(pipefds[1]); @@ -1845,7 +1799,6 @@ Cmd_Exec(const char *cmd, const char **e (void)close(pipefds[0]); /* Close the input side of the pipe. */ - /* Wait for the process to exit. */ while ((pid = waitpid(cpid, &status, 0)) != cpid && pid >= 0) JobReapChild(pid, status, false); @@ -1860,10 +1813,7 @@ Cmd_Exec(const char *cmd, const char **e else if (WEXITSTATUS(status) != 0) *errfmt = "\"%s\" returned non-zero status"; - /* - * Convert newlines to spaces. A final newline is just - * stripped. - */ + /* Convert newlines to spaces, strip the final newline. */ if (res_len > 0 && res[res_len - 1] == '\n') res[res_len - 1] = '\0'; for (cp = res; *cp != '\0'; cp++) @@ -1879,8 +1829,9 @@ bad: /* * Print a printf-style error message. * - * In default mode, this error message has no consequences, in particular it - * does not affect the exit status. Only in lint mode (-dL) it does. + * In default mode, this error message has no consequences, for compatibility + * reasons, in particular it does not affect the exit status. Only in lint + * mode (-dL) it does. */ void Error(const char *fmt, ...) @@ -2014,10 +1965,7 @@ write_all(int fd, const void *data, size } } -/* - * execDie -- - * Print why exec failed, avoiding stdio. - */ +/* Print why exec failed, avoiding stdio. */ void MAKE_ATTR_DEAD execDie(const char *af, const char *av) { Index: src/usr.bin/make/parse.c diff -u src/usr.bin/make/parse.c:1.584 src/usr.bin/make/parse.c:1.585 --- src/usr.bin/make/parse.c:1.584 Mon Dec 27 18:26:22 2021 +++ src/usr.bin/make/parse.c Mon Dec 27 18:54:19 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: parse.c,v 1.584 2021/12/27 18:26:22 rillig Exp $ */ +/* $NetBSD: parse.c,v 1.585 2021/12/27 18:54:19 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -109,7 +109,7 @@ #include "pathnames.h" /* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: parse.c,v 1.584 2021/12/27 18:26:22 rillig Exp $"); +MAKE_RCSID("$NetBSD: parse.c,v 1.585 2021/12/27 18:54:19 rillig Exp $"); /* types and constants */ @@ -1631,8 +1631,7 @@ ParseDependencySources(char *line, char * targets. Nodes are created as necessary. * * The operator is applied to each node in the global 'targets' list, - * which is where the nodes found for the targets are kept, by means of - * the ParseOp function. + * which is where the nodes found for the targets are kept. * * The sources are parsed in much the same way as the targets, except * that they are expanded using the wildcarding scheme of the C-Shell, @@ -1640,13 +1639,10 @@ ParseDependencySources(char *line, char * nodes is then linked to each of the targets as one of its children. * * Certain targets and sources such as .PHONY or .PRECIOUS are handled - * specially. These are the ones detailed by the specType variable. + * specially, see ParseSpecial. * - * The storing of transformation rules such as '.c.o' is also taken care of - * here. A target is recognized as a transformation rule by calling - * Suff_IsTransform. If it is a transformation rule, its node is gotten - * from the suffix module via Suff_AddTransform rather than the standard - * Targ_FindNode in the target module. + * Transformation rules such as '.c.o' are also handled here, see + * Suff_AddTransform. * * Upon return, the value of the line is unspecified. */ @@ -1654,7 +1650,7 @@ static void ParseDependency(char *line) { char *cp; /* our current position */ - GNodeType op; /* the operator on the line */ + GNodeType op; /* the dependency operator on the line */ SearchPathList *paths; /* search paths to alter when parsing a list * of .PATH targets */ GNodeType tOp; /* operator from special target */ @@ -1663,9 +1659,8 @@ ParseDependency(char *line) char *lstart = line; /* - * specType contains the SPECial TYPE of the current target. It is - * SP_NOT if the target is unspecial. If it *is* special, however, the - * children are linked as children of the parent but not vice versa. + * In special targets, the children are linked as children of the + * parent but not vice versa. */ ParseSpecial specType = SP_NOT; @@ -1674,9 +1669,6 @@ ParseDependency(char *line) paths = NULL; - /* - * First, grind through the targets. - */ /* XXX: don't use 'line' as an iterator variable */ if (!ParseDependencyTargets(&cp, &line, lstart, &specType, &tOp, &paths, &curTargs)) @@ -1692,20 +1684,9 @@ ParseDependency(char *line) if (!Lst_IsEmpty(targets)) ParseDependencyCheckSpec(specType); - /* - * Apply the operator to the target. This is how we remember which - * operator a target was defined with. It fails if the operator - * used isn't consistent across all references. - */ op = ParseDependencyOp(&cp); ApplyDependencyOperator(op); - /* - * Onward to the sources. - * - * LINE will now point to the first source word, if any, or the - * end of the string if not. - */ pp_skip_whitespace(&cp); line = cp; /* XXX: 'line' is an inappropriate name */ @@ -2327,14 +2308,14 @@ StrContainsWord(const char *str, const c const char *p, *end; if (strLen < wordLen) - return false; /* str is too short to contain word */ + return false; end = str + strLen - wordLen; for (p = str; p != NULL; p = strchr(p, ' ')) { if (*p == ' ') p++; if (p > end) - return false; /* cannot contain word */ + return false; if (memcmp(p, word, wordLen) == 0 && (p[wordLen] == '\0' || p[wordLen] == ' ')) Index: src/usr.bin/make/unit-tests/cond-short.mk diff -u src/usr.bin/make/unit-tests/cond-short.mk:1.18 src/usr.bin/make/unit-tests/cond-short.mk:1.19 --- src/usr.bin/make/unit-tests/cond-short.mk:1.18 Sun Dec 12 09:49:09 2021 +++ src/usr.bin/make/unit-tests/cond-short.mk Mon Dec 27 18:54:19 2021 @@ -1,4 +1,4 @@ -# $NetBSD: cond-short.mk,v 1.18 2021/12/12 09:49:09 rillig Exp $ +# $NetBSD: cond-short.mk,v 1.19 2021/12/27 18:54:19 rillig Exp $ # # Demonstrates that in conditions, the right-hand side of an && or || # is only evaluated if it can actually influence the result. @@ -14,14 +14,14 @@ # relevant variable expressions was that in the irrelevant variable # expressions, undefined variables were allowed. This allowed for conditions # like 'defined(VAR) && ${VAR:S,from,to,} != ""', which no longer produced an -# error message 'Malformed conditional', but it still evaluated the -# expression, even though the expression was irrelevant. +# error message 'Malformed conditional', but the irrelevant expression was +# still evaluated. # # Since the initial commit on 1993-03-21, the manual page has been saying that # make 'will only evaluate a conditional as far as is necessary to determine', # but that was wrong. The code in cond.c 1.1 from 1993-03-21 looks good since # it calls Var_Parse(condExpr, VAR_CMD, doEval,&varSpecLen,&doFree), but the -# definition of Var_Parse does not call the third parameter 'doEval', as would +# definition of Var_Parse did not call the third parameter 'doEval', as would # be expected, but instead 'err', accompanied by the comment 'TRUE if # undefined variables are an error'. This subtle difference between 'do not # evaluate at all' and 'allow undefined variables' led to the unexpected @@ -122,7 +122,9 @@ VAR= # empty again, for the following te .if 0 || empty(${echo "expected or empty" 1>&2 :L:sh}) .endif -# Unreachable nested conditions are skipped completely as well. +# Unreachable nested conditions are skipped completely as well. These skipped +# lines may even contain syntax errors. This allows to skip syntactically +# incompatible new features in older versions of make. .if 0 . if ${echo "unexpected nested and" 1>&2 :L:sh} Index: src/usr.bin/make/unit-tests/cond-token-number.exp diff -u src/usr.bin/make/unit-tests/cond-token-number.exp:1.4 src/usr.bin/make/unit-tests/cond-token-number.exp:1.5 --- src/usr.bin/make/unit-tests/cond-token-number.exp:1.4 Sun Nov 15 14:58:14 2020 +++ src/usr.bin/make/unit-tests/cond-token-number.exp Mon Dec 27 18:54:19 2021 @@ -2,7 +2,7 @@ make: "cond-token-number.mk" line 15: Ma make: "cond-token-number.mk" line 25: Malformed conditional (+0) make: "cond-token-number.mk" line 35: Malformed conditional (!-1) make: "cond-token-number.mk" line 45: Malformed conditional (!+1) -make: "cond-token-number.mk" line 80: End of the tests. +make: "cond-token-number.mk" line 89: End of the tests. make: Fatal errors encountered -- cannot continue make: stopped in unit-tests exit status 1 Index: src/usr.bin/make/unit-tests/cond-token-number.mk diff -u src/usr.bin/make/unit-tests/cond-token-number.mk:1.5 src/usr.bin/make/unit-tests/cond-token-number.mk:1.6 --- src/usr.bin/make/unit-tests/cond-token-number.mk:1.5 Sun Nov 15 14:58:14 2020 +++ src/usr.bin/make/unit-tests/cond-token-number.mk Mon Dec 27 18:54:19 2021 @@ -1,4 +1,4 @@ -# $NetBSD: cond-token-number.mk,v 1.5 2020/11/15 14:58:14 rillig Exp $ +# $NetBSD: cond-token-number.mk,v 1.6 2021/12/27 18:54:19 rillig Exp $ # # Tests for number tokens in .if conditions. # @@ -69,13 +69,22 @@ . error .endif -# This is not a hexadecimal number, even though it has an x. -# It is interpreted as a string instead, effectively meaning defined(3x4). +# This is not a hexadecimal number, even though it has an x. It is +# interpreted as a string instead. In a plain '.if', such a token evaluates +# to true if it is non-empty. In other '.if' directives, such a token is +# evaluated by either FuncDefined or FuncMake. .if 3x4 .else . error .endif +# Make can do radix conversion from hex to decimal. +HEX= dead +.if 0x${HEX} == 57005 +.else +. error +.endif + # Ensure that parsing continues until here. .info End of the tests. Index: src/usr.bin/make/unit-tests/var-eval-short.exp diff -u src/usr.bin/make/unit-tests/var-eval-short.exp:1.16 src/usr.bin/make/unit-tests/var-eval-short.exp:1.17 --- src/usr.bin/make/unit-tests/var-eval-short.exp:1.16 Thu Dec 9 20:27:01 2021 +++ src/usr.bin/make/unit-tests/var-eval-short.exp Mon Dec 27 18:54:19 2021 @@ -1,16 +1,16 @@ -make: "var-eval-short.mk" line 41: In the :@ modifier of "", the variable name "${FAIL}" must not contain a dollar -make: "var-eval-short.mk" line 41: Malformed conditional (0 && ${:Uword:@${FAIL}@expr@}) -make: "var-eval-short.mk" line 81: Invalid time value at "${FAIL}}" -make: "var-eval-short.mk" line 81: Malformed conditional (0 && ${:Uword:gmtime=${FAIL}}) -make: "var-eval-short.mk" line 95: Invalid time value at "${FAIL}}" -make: "var-eval-short.mk" line 95: Malformed conditional (0 && ${:Uword:localtime=${FAIL}}) +make: "var-eval-short.mk" line 44: In the :@ modifier of "", the variable name "${FAIL}" must not contain a dollar +make: "var-eval-short.mk" line 44: Malformed conditional (0 && ${:Uword:@${FAIL}@expr@}) +make: "var-eval-short.mk" line 84: Invalid time value at "${FAIL}}" +make: "var-eval-short.mk" line 84: Malformed conditional (0 && ${:Uword:gmtime=${FAIL}}) +make: "var-eval-short.mk" line 98: Invalid time value at "${FAIL}}" +make: "var-eval-short.mk" line 98: Malformed conditional (0 && ${:Uword:localtime=${FAIL}}) CondParser_Eval: 0 && ${0:?${FAIL}then:${FAIL}else} Var_Parse: ${0:?${FAIL}then:${FAIL}else} (parse-only) Parsing modifier ${0:?...} Modifier part: "${FAIL}then" Modifier part: "${FAIL}else" Result of ${0:?${FAIL}then:${FAIL}else} is "" (parse-only, defined) -ParseReadLine (160): 'DEFINED= defined' +ParseReadLine (163): 'DEFINED= defined' Global: DEFINED = defined CondParser_Eval: 0 && ${DEFINED:L:?${FAIL}then:${FAIL}else} Var_Parse: ${DEFINED:L:?${FAIL}then:${FAIL}else} (parse-only) @@ -20,7 +20,7 @@ Parsing modifier ${DEFINED:?...} Modifier part: "${FAIL}then" Modifier part: "${FAIL}else" Result of ${DEFINED:?${FAIL}then:${FAIL}else} is "defined" (parse-only, regular) -ParseReadLine (163): '.MAKEFLAGS: -d0' +ParseReadLine (166): '.MAKEFLAGS: -d0' ParseDependency(.MAKEFLAGS: -d0) Global: .MAKEFLAGS = -r -k -d cpv -d Global: .MAKEFLAGS = -r -k -d cpv -d 0 Index: src/usr.bin/make/unit-tests/var-eval-short.mk diff -u src/usr.bin/make/unit-tests/var-eval-short.mk:1.7 src/usr.bin/make/unit-tests/var-eval-short.mk:1.8 --- src/usr.bin/make/unit-tests/var-eval-short.mk:1.7 Tue Sep 7 20:41:58 2021 +++ src/usr.bin/make/unit-tests/var-eval-short.mk Mon Dec 27 18:54:19 2021 @@ -1,12 +1,13 @@ -# $NetBSD: var-eval-short.mk,v 1.7 2021/09/07 20:41:58 rillig Exp $ +# $NetBSD: var-eval-short.mk,v 1.8 2021/12/27 18:54:19 rillig Exp $ # # Tests for each variable modifier to ensure that they only do the minimum -# necessary computations. If the result of the expression is not needed, they -# should only parse the modifier but not actually evaluate it. +# necessary computations. If the result of the expression is irrelevant, +# the modifier should only be parsed. The modifier should not be evaluated, +# but if it is evaluated for simplicity of the code (such as ':ts'), it must +# not have any observable side effects. # # See also: # var.c, the comment starting with 'The ApplyModifier functions' -# ApplyModifier, for the order of the modifiers # ParseModifierPart, for evaluating nested expressions # cond-short.mk @@ -17,6 +18,8 @@ FAIL= ${:!echo unexpected 1>&2!} # is ignored as well. To do that, it is necessary to step through the code of # each modifier. +# TODO: Test the modifiers in the same order as they appear in ApplyModifier. + .if 0 && ${FAIL} .endif