Up to [cvs.NetBSD.org] / src / usr.bin / make / unit-tests
Request diff between arbitrary revisions
Keyword substitution: kv
Default branch: MAIN
make: omit redundant follow-up message "Malformed conditional" If there is a parse error or an evaluation error during the conditional, the conditional is already mentioned in the "while evaluating condition" line, so there's no reason to repeat it once again. Same for the "Bad condition" message from the '?:' modifier.
make: reduce line length in error messages The error messages for deeply nested parse errors were hard to decipher, due to the large amount of text. Split these messages into individual lines, just as in the backtrace for .include files and .for loops. This unified backtrace makes the output more uniform.
make: in error message about conditionals, use single quotes Single quotes are used less often in the conditionals themselves, which leads to fewer confusions.
make: add more context information to error messages In case of a parse error or evaluation error, print the variable value in addition to the variable name, to see the effects of previous expression modifiers. In nested make calls, print the current directory at the bottom of a stack trace, as that information is otherwise hard to get in a parallel build spanning multiple directories.
make: provide more context information for parse/evaluate errors
tests/make: force line-based diagnostics to be listed in the tests This way, contradictions between the intended output and the actual output are closer together and have a better chance of being spotted.
make: don't interpret the return value of Var_Parse The return value of Var_Parse is largely redundant to the returned string. The idea behind the type VarParseResult was to migrate all call sites to checking this return value instead of the returned string, but that hasn't happened. Instead, the additional type only added more complexity. There was a single place where that return value was actually used, when parsing conditions. And even in that case, ignoring the VarParseResult added back an error message that previously hid bugs, in the test cond-token-plain.mk. Even though these error messages are redundant in the other tests, they don't hurt as they don't happen often.
make: fix wrong expression evaluation in -dL mode The modifier ':C' now only compiles the regular expression if the result of the expression is actually needed. Several other modifiers have the same bug of evaluating the expression in cases where this is not needed. It just doesn't show up because they don't have any noticeable side effects, other than wasting CPU time. This affects irrelevant conditions as well.
make: demonstrate wrong expression evaluation in -dL mode
make: improve error message for unknown modifier Back in 1995, the modifiers were all single-character, and it made sense to print only the first character. Nowadays, with ':S', ':@var@...@', '::=' and several others, a little more context is useful to see where the exact error is. The actual modifier is still guessed, and the guess may be wrong as soon as backslashes get involved, but it is still better than before.
make(1): error out on unknown variable modifiers at parse time Before, make printed an "error message" that did not include the word error and thus was not easily identified as such. This "error message" also did not influence the exit status in the default mode but only in -dL mode. The error message also didn't include any line number information and was thus rude.
make(1): remove wrong error message for indirect modifier in lint mode
make(1): revert previous commit It had accidentally reverted all the work from the past few days.
make(1): fix double-free bug in -DCLEANUP mode (since 2020-10-02) The bug had been introduced with dir.c 1.155 on 2020-10-02 22:20:25. In that commit, openDirectories was replaced with a combination of a list with a hash table, for more efficient lookup by name. Upon cleanup, OpenDirs_Done is called, which in turn called Dir_ClearPath. Dir_ClearPath takes full ownership of the given list and empties it. This was no problem before since afterwards the list was empty and calling Lst_Free just frees the remaining list pointer. With OpenDirs, this list was combined with a hash table, and the hash table contains the list nodes, assuming that the OpenDirs functions have full ownership of both the list and the hash table. This assumption was generally correct, except for the one moment during cleanup where full ownership of the list was passed to Dir_ClearPath, while the hash table still contained pointers to the (now freed) list nodes. This by itself was not a problem since the hash table would be freed afterwards. But as part of Dir_ClearPath, OpenDirs_Remove was called, which looked up the freed directory by name and now found the freed list node, trying to free it again. Boom. Fixed by replacing the call to Dir_ClearPath with code that only frees the directories, without giving up control over the list.
make(1): in lint mode, reject modifiers without delimiter The expression ${VAR:LPL} must now be written as ${VAR:L:P:L}. The manual page has never documented that some modifiers don't need to be delimited by ':' and others need to. That would have been unnecessarily confusing anyway.
make(1): add test for variable modifiers without delimiter
make(1): fix wrong error for undefined variables in lint mode
make(1): add test for wrong error in lint mode for undefined variable
make(1): remove obsolete comments from tests
make(1): in lint mode, report undefined variables in conditions
make(1): suppress wrong "Malformed conditional" for undefined variables This only has an effect in lint mode right now.
make(1): in lint mode, improve error handling for undefined variables It's a first step for improving the error message that make prints.
make(1): add tests for each debug option