git: 4eda2649adec - stable/13 - Merge commit 'ee914ef902ae018bd4f67192832120f9bf05651f' into new_merge

From: Simon J. Gerraty <sjg_at_FreeBSD.org>
Date: Wed, 16 Feb 2022 05:38:51 UTC
The branch stable/13 has been updated by sjg:

URL: https://cgit.FreeBSD.org/src/commit/?id=4eda2649adece08245281edc627ebc58c759bedb

commit 4eda2649adece08245281edc627ebc58c759bedb
Author:     Simon J. Gerraty <sjg@FreeBSD.org>
AuthorDate: 2021-06-25 21:31:14 +0000
Commit:     Simon J. Gerraty <sjg@FreeBSD.org>
CommitDate: 2022-02-16 05:36:27 +0000

    Merge commit 'ee914ef902ae018bd4f67192832120f9bf05651f' into new_merge
    
    (cherry picked from commit b0c40a00a67f611868fc0f10bde6b28eb75931be)
---
 contrib/bmake/ChangeLog                            |  113 +
 contrib/bmake/FILES                                |   13 +
 contrib/bmake/VERSION                              |    2 +-
 contrib/bmake/arch.c                               |  104 +-
 contrib/bmake/buf.h                                |    4 +-
 contrib/bmake/compat.c                             |   42 +-
 contrib/bmake/cond.c                               |  279 +-
 contrib/bmake/dir.c                                |   62 +-
 contrib/bmake/dir.h                                |    6 +-
 contrib/bmake/enum.h                               |   62 +-
 contrib/bmake/for.c                                |   46 +-
 contrib/bmake/hash.c                               |   68 +-
 contrib/bmake/hash.h                               |   14 +-
 contrib/bmake/import.sh                            |   17 +-
 contrib/bmake/job.c                                |  423 +--
 contrib/bmake/job.h                                |   20 +-
 contrib/bmake/lst.c                                |   10 +-
 contrib/bmake/lst.h                                |   12 +-
 contrib/bmake/main.c                               |  250 +-
 contrib/bmake/make.c                               |   91 +-
 contrib/bmake/make.h                               |  129 +-
 contrib/bmake/meta.c                               |  194 +-
 contrib/bmake/meta.h                               |    8 +-
 contrib/bmake/metachar.h                           |    4 +-
 contrib/bmake/mk/ChangeLog                         |   35 +
 contrib/bmake/mk/dirdeps.mk                        |   76 +-
 contrib/bmake/mk/dpadd.mk                          |    7 +-
 contrib/bmake/mk/install-mk                        |    4 +-
 contrib/bmake/mk/meta.autodep.mk                   |    6 +-
 contrib/bmake/mk/meta2deps.py                      |   54 +-
 contrib/bmake/mk/rst2htm.mk                        |    6 +-
 contrib/bmake/nonints.h                            |  153 +-
 contrib/bmake/parse.c                              |  512 ++--
 contrib/bmake/str.c                                |  101 +-
 contrib/bmake/str.h                                |  366 +++
 contrib/bmake/suff.c                               |   71 +-
 contrib/bmake/targ.c                               |   14 +-
 contrib/bmake/unit-tests/Makefile                  |   28 +-
 contrib/bmake/unit-tests/archive.mk                |    6 +-
 contrib/bmake/unit-tests/cmd-errors-jobs.exp       |    2 +-
 contrib/bmake/unit-tests/cmd-errors-lint.exp       |    2 +-
 contrib/bmake/unit-tests/cmd-errors.exp            |    2 +-
 contrib/bmake/unit-tests/cond-func-empty.mk        |   10 +-
 contrib/bmake/unit-tests/cond-func-make-main.mk    |    6 +-
 contrib/bmake/unit-tests/cond-late.exp             |    2 +-
 contrib/bmake/unit-tests/cond-short.mk             |   14 +-
 contrib/bmake/unit-tests/cond-token-string.exp     |    2 +-
 contrib/bmake/unit-tests/cond-token-var.mk         |   23 +-
 contrib/bmake/unit-tests/cond1.exp                 |    2 +-
 contrib/bmake/unit-tests/counter-append.mk         |    4 +-
 contrib/bmake/unit-tests/counter.mk                |    4 +-
 contrib/bmake/unit-tests/dep-var.mk                |    4 +-
 contrib/bmake/unit-tests/deptgt-makeflags.exp      |   10 +-
 contrib/bmake/unit-tests/deptgt-order.exp          |    3 +
 contrib/bmake/unit-tests/deptgt-order.mk           |   18 +-
 contrib/bmake/unit-tests/deptgt.exp                |    8 +-
 contrib/bmake/unit-tests/deptgt.mk                 |    4 +-
 contrib/bmake/unit-tests/directive-export-impl.exp |   88 +-
 contrib/bmake/unit-tests/directive-export-impl.mk  |   23 +-
 contrib/bmake/unit-tests/directive-export.mk       |   15 +-
 contrib/bmake/unit-tests/directive-for-errors.exp  |    2 +-
 contrib/bmake/unit-tests/directive-for-errors.mk   |    6 +-
 contrib/bmake/unit-tests/directive-for-escape.exp  |   32 +-
 contrib/bmake/unit-tests/directive-for-escape.mk   |   21 +-
 contrib/bmake/unit-tests/directive-for.exp         |    2 +-
 contrib/bmake/unit-tests/directive-undef.exp       |    3 +-
 contrib/bmake/unit-tests/directive-undef.mk        |   21 +-
 .../bmake/unit-tests/directive-unexport-env.exp    |   20 +-
 contrib/bmake/unit-tests/directive.exp             |    8 +-
 contrib/bmake/unit-tests/include-main.exp          |    2 +-
 contrib/bmake/unit-tests/job-output-null.exp       |    4 +
 contrib/bmake/unit-tests/job-output-null.mk        |   32 +
 .../bmake/unit-tests/jobs-empty-commands-error.exp |    5 +
 .../bmake/unit-tests/jobs-empty-commands-error.mk  |   19 +
 contrib/bmake/unit-tests/moderrs.exp               |   97 +-
 contrib/bmake/unit-tests/moderrs.mk                |   25 +-
 contrib/bmake/unit-tests/modts.exp                 |    4 +-
 contrib/bmake/unit-tests/modword.exp               |   24 +-
 contrib/bmake/unit-tests/modword.mk                |    3 +-
 contrib/bmake/unit-tests/opt-chdir.mk              |    6 +-
 contrib/bmake/unit-tests/opt-debug-errors-jobs.exp |   48 +
 contrib/bmake/unit-tests/opt-debug-errors-jobs.mk  |   36 +
 contrib/bmake/unit-tests/opt-debug-lint.exp        |    2 +-
 contrib/bmake/unit-tests/opt-debug-lint.mk         |   20 +-
 contrib/bmake/unit-tests/opt-debug.exp             |    6 +-
 contrib/bmake/unit-tests/opt-file.mk               |    6 +-
 contrib/bmake/unit-tests/opt-jobs-no-action.mk     |    4 +-
 contrib/bmake/unit-tests/recursive.mk              |    7 +-
 contrib/bmake/unit-tests/sh-jobs.mk                |    8 +-
 contrib/bmake/unit-tests/shell-csh.mk              |    4 +-
 contrib/bmake/unit-tests/suff-incomplete.exp       |   10 +-
 contrib/bmake/unit-tests/suff-main-several.exp     |   24 +-
 contrib/bmake/unit-tests/suff-rebuild.exp          |   14 +-
 contrib/bmake/unit-tests/var-class-cmdline.exp     |    3 +
 contrib/bmake/unit-tests/var-class-cmdline.mk      |   80 +-
 contrib/bmake/unit-tests/var-eval-short.exp        |   29 +
 contrib/bmake/unit-tests/var-eval-short.mk         |  163 ++
 contrib/bmake/unit-tests/var-op-append.exp         |   12 +-
 contrib/bmake/unit-tests/var-op-append.mk          |    4 +-
 contrib/bmake/unit-tests/var-op-assign.mk          |    4 +-
 contrib/bmake/unit-tests/var-op-sunsh.mk           |   12 +-
 contrib/bmake/unit-tests/varcmd.mk                 |   14 +-
 contrib/bmake/unit-tests/vardebug.exp              |  119 +-
 contrib/bmake/unit-tests/varmisc.exp               |    2 +-
 contrib/bmake/unit-tests/varmod-assign.exp         |   22 +-
 contrib/bmake/unit-tests/varmod-assign.mk          |   39 +-
 contrib/bmake/unit-tests/varmod-defined.exp        |   34 +-
 contrib/bmake/unit-tests/varmod-defined.mk         |    6 +-
 contrib/bmake/unit-tests/varmod-edge.exp           |   12 +-
 contrib/bmake/unit-tests/varmod-edge.mk            |   26 +-
 contrib/bmake/unit-tests/varmod-hash.exp           |    6 +-
 contrib/bmake/unit-tests/varmod-ifelse.exp         |   22 +-
 contrib/bmake/unit-tests/varmod-ifelse.mk          |   64 +-
 contrib/bmake/unit-tests/varmod-indirect.exp       |   84 +-
 contrib/bmake/unit-tests/varmod-indirect.mk        |  100 +-
 contrib/bmake/unit-tests/varmod-loop-varname.exp   |   11 +
 contrib/bmake/unit-tests/varmod-loop-varname.mk    |  127 +
 contrib/bmake/unit-tests/varmod-loop.exp           |   19 +-
 contrib/bmake/unit-tests/varmod-loop.mk            |  156 +-
 contrib/bmake/unit-tests/varmod-match-escape.exp   |   74 +-
 contrib/bmake/unit-tests/varmod-match-escape.mk    |    8 +-
 contrib/bmake/unit-tests/varmod-order.exp          |    4 +-
 contrib/bmake/unit-tests/varmod-range.exp          |   10 +-
 contrib/bmake/unit-tests/varmod-remember.exp       |    2 -
 contrib/bmake/unit-tests/varmod-remember.mk        |   29 +-
 contrib/bmake/unit-tests/varmod-shell.mk           |    9 +-
 contrib/bmake/unit-tests/varmod-subst-regex.exp    |   25 +-
 contrib/bmake/unit-tests/varmod-subst-regex.mk     |   54 +-
 contrib/bmake/unit-tests/varmod-subst.exp          |    2 +-
 contrib/bmake/unit-tests/varmod-subst.mk           |   10 +-
 contrib/bmake/unit-tests/varmod-sun-shell.exp      |    2 +
 contrib/bmake/unit-tests/varmod-sun-shell.mk       |   21 +
 contrib/bmake/unit-tests/varmod-sysv.exp           |  147 +-
 contrib/bmake/unit-tests/varmod-sysv.mk            |   57 +-
 contrib/bmake/unit-tests/varmod-to-separator.exp   |   12 +-
 contrib/bmake/unit-tests/varmod-unique.mk          |   12 +-
 contrib/bmake/unit-tests/varname-dot-shell.exp     |   32 +-
 contrib/bmake/unit-tests/varname-empty.exp         |   60 +-
 contrib/bmake/unit-tests/varname-empty.mk          |    4 +-
 contrib/bmake/unit-tests/varname.exp               |   33 +-
 contrib/bmake/unit-tests/varparse-dynamic.mk       |    6 +-
 contrib/bmake/unit-tests/varparse-errors.exp       |    4 +-
 contrib/bmake/unit-tests/varparse-errors.mk        |    4 +-
 contrib/bmake/var.c                                | 3073 +++++++++++---------
 144 files changed, 5499 insertions(+), 3548 deletions(-)

diff --git a/contrib/bmake/ChangeLog b/contrib/bmake/ChangeLog
index 5cf6f9d8fe57..35235e1f8205 100644
--- a/contrib/bmake/ChangeLog
+++ b/contrib/bmake/ChangeLog
@@ -1,3 +1,116 @@
+2021-06-21  Simon J Gerraty  <sjg@beast.crufty.net>
+
+	* VERSION (_MAKE_VERSION): 20210621
+	Merge with NetBSD make, pick up
+	o var.c: only report error for unmatched regex subexpression
+	when linting (-dL) since we cannot tell when an unmatched
+	subexpression is an expected result.
+	o move unmatched regex subexpression tests to
+	varmod-subst-regex.mk and enable strict (lint) mode
+
+2021-06-16  Simon J Gerraty  <sjg@beast.crufty.net>
+
+	* VERSION (_MAKE_VERSION): 20210616
+	Merge with NetBSD make, pick up
+	o more unit tests
+	o cond.c: rename If_Eval to EvalBare
+	improve function names for parsing conditions
+	o job.c: fix error handling of targets that cannot be made
+	o var.c: uncompress code in ApplyModifier_Unique
+
+2021-05-18  Simon J Gerraty  <sjg@beast.crufty.net>
+
+	* VERSION (_MAKE_VERSION): 20210518
+	Merge with NetBSD make, pick up
+	o fix unit-tests/opt-chdir to cope with /nonexistent existing.
+	o job.c: Print -de error information when running multiple jobs
+
+2021-04-20  Simon J Gerraty  <sjg@beast.crufty.net>
+
+	* VERSION (_MAKE_VERSION): 20210420
+	Merge with NetBSD make, pick up
+	o use C99 bool type
+	o convert VarEvalFlags back into an enum
+	o cond.c: do not complain when skipping the condition 'no >= 10'
+	o hash.c: avoid allocating memory for simple variable names
+	o job.c: use distinct wording for writing to the shell commands file
+	remove type name for the abort status in job handling
+	rename PrintOutput to PrintFilteredOutput to avoid confusion
+	o main.c: avoid double slash in name of temporary directory
+	o var.c: use straight quotes for error 'Bad conditional expression'
+	reduce memory allocations in the modifiers ':D' and ':U'
+	rename members of ModifyWord_LoopArgs
+	clean up pattern flags for the modifiers ':S' and ':C'
+	reduce memory allocation and strlen calls in modifier ':from=to'
+	in the ':Q' modifier, only allocate memory if necessary
+	improve performance for LazyBuf
+	remove redundant parameter from ParseVarnameLong
+	migrate ParseModifierPart to use Substring
+	avoid unnecessary calls to strlen when evaluating modifiers
+	migrate ModifyWord functions to use Substring
+	migrate handling of the modifier ':S,from,to,' to Substring
+	reduce debug logging and memory allocation for ${:U...}
+	reduce verbosity of the -dv debug logging for standard cases
+	clean up debug logging for ':M' and ':N'
+	disallow '$' in the variable name of the modifier ':@'
+	simplify access to the name of an expression during evaluation
+
+2021-03-30  Simon J Gerraty  <sjg@beast.crufty.net>
+
+	* VERSION (_MAKE_VERSION): 20210330
+	Merge with NetBSD make, pick up
+	o replace enum bit-field with struct bit-field for VarEvalFlags
+	o rename VARE_NONE to VARE_PARSE_ONLY
+	o var.c: rename ApplyModifiersState to ModChain
+	fix double varname expansion in the variable modifier '::='
+	change debug log for variable evaluation flags to lowercase
+
+2021-03-14  Simon J Gerraty  <sjg@beast.crufty.net>
+
+	* VERSION (_MAKE_VERSION): 20210314
+	Merge with NetBSD make, pick up
+	o var.c: avoid evaluating many modifiers in parse only mode
+	in strict mode (-dL) many variable references are parsed twice,
+	the first time just to report parse errors early, so we want to
+	avoid side effects and wasted effort to the extent possible.
+
+2021-02-26  Simon J Gerraty  <sjg@beast.crufty.net>
+
+	* VERSION (_MAKE_VERSION): 20210226
+	Merge with NetBSD make, pick up
+	o remove freestanding freeIt variables
+	link via FStr
+	o var.c: restructure code in ParseVarname to target human readers
+	improve error message for;
+	  bad modifier in variable expression
+	  unclosed modifier
+	  unknown modifier
+	remove redundant parameter of ApplySingleModifier
+	explain non-obvious code around indirect variable modifiers
+	quote ':S' in error message about missing delimiter
+	extract ParseModifier_Match into separate function
+	add context information to error message about ':range' modifier
+	add quotes around variable name in an error message
+	reorder code in ModifyWords
+	use more common parameter order for VarSelectWords
+	make ModifyWord_Subst a little easier to understand
+	do not expand variable name from the command line twice
+	extract ExistsInCmdline from Var_SetWithFlags
+	save a hash map lookup when defining a cmdline variable
+	clean up VarAdd, Var_Delete, Var_ReexportVars
+	use bit-shift expressions for VarFlags constants
+	rename constants for VarFlags
+	rename ExprDefined constants for debug logging
+	rename ExprStatus to ExprDefined
+	split parameters for evaluating variable expressions
+	reduce redundant code around ModifyWords
+	print error about failed shell command before overwriting variable
+	clean up ValidShortVarname, ParseVarnameShort
+	rename VarExprStatus to ExprStatus
+	add functions for assigning the value of an expression
+	rename ApplyModifiersState_Define to Expr_Define
+	condense the code for parsing :S and :C modifiers
+
 2021-02-06  Simon J Gerraty  <sjg@beast.crufty.net>
 
 	* VERSION (_MAKE_VERSION): 20210206
diff --git a/contrib/bmake/FILES b/contrib/bmake/FILES
index 5e7b8301da87..dc0f6f33c763 100644
--- a/contrib/bmake/FILES
+++ b/contrib/bmake/FILES
@@ -63,6 +63,7 @@ realpath.c
 setenv.c
 sigcompat.c
 str.c
+str.h
 stresep.c
 strlcpy.c
 suff.c
@@ -399,6 +400,10 @@ unit-tests/job-flags.exp
 unit-tests/job-flags.mk
 unit-tests/job-output-long-lines.exp
 unit-tests/job-output-long-lines.mk
+unit-tests/job-output-null.exp
+unit-tests/job-output-null.mk
+unit-tests/jobs-empty-commands-error.exp
+unit-tests/jobs-empty-commands-error.mk
 unit-tests/jobs-empty-commands.exp
 unit-tests/jobs-empty-commands.mk
 unit-tests/jobs-error-indirect.exp
@@ -439,6 +444,8 @@ unit-tests/opt-debug-curdir.exp
 unit-tests/opt-debug-curdir.mk
 unit-tests/opt-debug-dir.exp
 unit-tests/opt-debug-dir.mk
+unit-tests/opt-debug-errors-jobs.exp
+unit-tests/opt-debug-errors-jobs.mk
 unit-tests/opt-debug-errors.exp
 unit-tests/opt-debug-errors.mk
 unit-tests/opt-debug-file.exp
@@ -627,6 +634,8 @@ unit-tests/var-class-local.exp
 unit-tests/var-class-local.mk
 unit-tests/var-class.exp
 unit-tests/var-class.mk
+unit-tests/var-eval-short.exp
+unit-tests/var-eval-short.mk
 unit-tests/var-op-append.exp
 unit-tests/var-op-append.mk
 unit-tests/var-op-assign.exp
@@ -675,6 +684,8 @@ unit-tests/varmod-l-name-to-value.exp
 unit-tests/varmod-l-name-to-value.mk
 unit-tests/varmod-localtime.exp
 unit-tests/varmod-localtime.mk
+unit-tests/varmod-loop-varname.exp
+unit-tests/varmod-loop-varname.mk
 unit-tests/varmod-loop.exp
 unit-tests/varmod-loop.mk
 unit-tests/varmod-match-escape.exp
@@ -709,6 +720,8 @@ unit-tests/varmod-subst-regex.exp
 unit-tests/varmod-subst-regex.mk
 unit-tests/varmod-subst.exp
 unit-tests/varmod-subst.mk
+unit-tests/varmod-sun-shell.exp
+unit-tests/varmod-sun-shell.mk
 unit-tests/varmod-sysv.exp
 unit-tests/varmod-sysv.mk
 unit-tests/varmod-tail.exp
diff --git a/contrib/bmake/VERSION b/contrib/bmake/VERSION
index 0af794962680..7c28f11013b7 100644
--- a/contrib/bmake/VERSION
+++ b/contrib/bmake/VERSION
@@ -1,2 +1,2 @@
 # keep this compatible with sh and make
-_MAKE_VERSION=20210206
+_MAKE_VERSION=20210621
diff --git a/contrib/bmake/arch.c b/contrib/bmake/arch.c
index e5c0a5e4ac0f..6d9dd60dfbe9 100644
--- a/contrib/bmake/arch.c
+++ b/contrib/bmake/arch.c
@@ -1,4 +1,4 @@
-/*	$NetBSD: arch.c,v 1.197 2021/02/05 05:15:12 rillig Exp $	*/
+/*	$NetBSD: arch.c,v 1.200 2021/05/30 21:16:54 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -147,7 +147,7 @@ struct ar_hdr {
 #include "dir.h"
 
 /*	"@(#)arch.c	8.2 (Berkeley) 1/2/94"	*/
-MAKE_RCSID("$NetBSD: arch.c,v 1.197 2021/02/05 05:15:12 rillig Exp $");
+MAKE_RCSID("$NetBSD: arch.c,v 1.200 2021/05/30 21:16:54 rillig Exp $");
 
 typedef struct List ArchList;
 typedef struct ListNode ArchListNode;
@@ -216,6 +216,19 @@ ArchFree(void *ap)
 }
 #endif
 
+/* Return "archive(member)". */
+static char *
+FullName(const char *archive, const char *member)
+{
+	size_t len1 = strlen(archive);
+	size_t len3 = strlen(member);
+	char *result = bmake_malloc(len1 + 1 + len3 + 1 + 1);
+	memcpy(result, archive, len1);
+	memcpy(result + len1, "(", 1);
+	memcpy(result + len1 + 1, member, len3);
+	memcpy(result + len1 + 1 + len3, ")", 1 + 1);
+	return result;
+}
 
 /*
  * Parse an archive specification such as "archive.a(member1 member2.${EXT})",
@@ -228,10 +241,10 @@ ArchFree(void *ap)
  *	scope		The scope in which to expand variables.
  *
  * Output:
- *	return		TRUE if it was a valid specification.
+ *	return		True if it was a valid specification.
  *	*pp		Points to the first non-space after the archive spec.
  */
-Boolean
+bool
 Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
 {
 	char *cp;		/* Pointer into line */
@@ -239,12 +252,12 @@ Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
 	MFStr libName;		/* Library-part of specification */
 	char *memName;		/* Member-part of specification */
 	char saveChar;		/* Ending delimiter of member-name */
-	Boolean expandLibName;	/* Whether the parsed libName contains
+	bool expandLibName;	/* Whether the parsed libName contains
 				 * variable expressions that need to be
 				 * expanded */
 
 	libName = MFStr_InitRefer(*pp);
-	expandLibName = FALSE;
+	expandLibName = false;
 
 	for (cp = libName.str; *cp != '(' && *cp != '\0';) {
 		if (*cp == '$') {
@@ -252,18 +265,18 @@ Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
 			/* XXX: This code can probably be shortened. */
 			const char *nested_p = cp;
 			FStr result;
-			Boolean isError;
+			bool isError;
 
 			/* XXX: is expanded twice: once here and once below */
 			(void)Var_Parse(&nested_p, scope,
-					VARE_WANTRES | VARE_UNDEFERR, &result);
+			    VARE_UNDEFERR, &result);
 			/* TODO: handle errors */
 			isError = result.str == var_Error;
 			FStr_Done(&result);
 			if (isError)
-				return FALSE;
+				return false;
 
-			expandLibName = TRUE;
+			expandLibName = true;
 			cp += nested_p - cp;
 		} else
 			cp++;
@@ -272,8 +285,7 @@ Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
 	*cp++ = '\0';
 	if (expandLibName) {
 		char *expanded;
-		(void)Var_Subst(libName.str, scope,
-		    VARE_WANTRES | VARE_UNDEFERR, &expanded);
+		(void)Var_Subst(libName.str, scope, VARE_UNDEFERR, &expanded);
 		/* TODO: handle errors */
 		libName = MFStr_InitOwn(expanded);
 	}
@@ -285,7 +297,7 @@ Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
 		 * place and skip to the end of it (either white-space or
 		 * a close paren).
 		 */
-		Boolean doSubst = FALSE;
+		bool doSubst = false;
 
 		pp_skip_whitespace(&cp);
 
@@ -295,20 +307,19 @@ Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
 				/* Expand nested variable expressions. */
 				/* XXX: This code can probably be shortened. */
 				FStr result;
-				Boolean isError;
+				bool isError;
 				const char *nested_p = cp;
 
 				(void)Var_Parse(&nested_p, scope,
-						VARE_WANTRES | VARE_UNDEFERR,
-						&result);
+				    VARE_UNDEFERR, &result);
 				/* TODO: handle errors */
 				isError = result.str == var_Error;
 				FStr_Done(&result);
 
 				if (isError)
-					return FALSE;
+					return false;
 
-				doSubst = TRUE;
+				doSubst = true;
 				cp += nested_p - cp;
 			} else {
 				cp++;
@@ -325,7 +336,7 @@ Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
 			Parse_Error(PARSE_FATAL,
 				    "No closing parenthesis "
 				    "in archive specification");
-			return FALSE;
+			return false;
 		}
 
 		/*
@@ -355,16 +366,15 @@ Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
 			char *p;
 			char *unexpandedMemName = memName;
 
-			(void)Var_Subst(memName, scope,
-					VARE_WANTRES | VARE_UNDEFERR,
-					&memName);
+			(void)Var_Subst(memName, scope, VARE_UNDEFERR,
+			    &memName);
 			/* TODO: handle errors */
 
 			/*
 			 * Now form an archive spec and recurse to deal with
 			 * nested variables and multi-word variable values.
 			 */
-			fullName = str_concat4(libName.str, "(", memName, ")");
+			fullName = FullName(libName.str, memName);
 			p = fullName;
 
 			if (strchr(memName, '$') != NULL &&
@@ -383,7 +393,7 @@ Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
 				/* Error in nested call. */
 				free(fullName);
 				/* XXX: does unexpandedMemName leak? */
-				return FALSE;
+				return false;
 			}
 			free(fullName);
 			/* XXX: does unexpandedMemName leak? */
@@ -394,8 +404,7 @@ Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
 
 			while (!Lst_IsEmpty(&members)) {
 				char *member = Lst_Dequeue(&members);
-				char *fullname = str_concat4(libName.str, "(",
-							     member, ")");
+				char *fullname = FullName(libName.str, member);
 				free(member);
 
 				gn = Targ_GetNode(fullname);
@@ -407,8 +416,7 @@ Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
 			Lst_Done(&members);
 
 		} else {
-			char *fullname = str_concat4(libName.str, "(", memName,
-						     ")");
+			char *fullname = FullName(libName.str, memName);
 			gn = Targ_GetNode(fullname);
 			free(fullname);
 
@@ -434,7 +442,7 @@ Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
 	/* We promised that pp would be set up at the next non-space. */
 	pp_skip_whitespace(&cp);
 	*pp = cp;
-	return TRUE;
+	return true;
 }
 
 /*
@@ -444,7 +452,7 @@ Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
  * Input:
  *	archive		Path to the archive
  *	member		Name of member; only its basename is used.
- *	addToCache	TRUE if archive should be cached if not already so.
+ *	addToCache	True if archive should be cached if not already so.
  *
  * Results:
  *	The ar_hdr for the member, or NULL.
@@ -452,7 +460,7 @@ Arch_ParseArchive(char **pp, GNodeList *gns, GNode *scope)
  * See ArchFindMember for an almost identical copy of this code.
  */
 static struct ar_hdr *
-ArchStatMember(const char *archive, const char *member, Boolean addToCache)
+ArchStatMember(const char *archive, const char *member, bool addToCache)
 {
 #define AR_MAX_NAME_LEN (sizeof arh.ar_name - 1)
 	FILE *arch;
@@ -713,7 +721,7 @@ ArchSVR4Entry(Arch *ar, char *inout_name, size_t size, FILE *arch)
 #endif
 
 
-static Boolean
+static bool
 ArchiveMember_HasName(const struct ar_hdr *hdr,
 		      const char *name, size_t namelen)
 {
@@ -721,22 +729,22 @@ ArchiveMember_HasName(const struct ar_hdr *hdr,
 	const char *ar_name = hdr->AR_NAME;
 
 	if (strncmp(ar_name, name, namelen) != 0)
-		return FALSE;
+		return false;
 
 	if (namelen >= ar_name_len)
 		return namelen == ar_name_len;
 
 	/* hdr->AR_NAME is space-padded to the right. */
 	if (ar_name[namelen] == ' ')
-		return TRUE;
+		return true;
 
 	/* In archives created by GNU binutils 2.27, the member names end with
 	 * a slash. */
 	if (ar_name[namelen] == '/' &&
 	    (namelen == ar_name_len || ar_name[namelen + 1] == ' '))
-		return TRUE;
+		return true;
 
-	return FALSE;
+	return false;
 }
 
 /*
@@ -951,7 +959,7 @@ Arch_UpdateMTime(GNode *gn)
 {
 	struct ar_hdr *arh;
 
-	arh = ArchStatMember(GNode_VarArchive(gn), GNode_VarMember(gn), TRUE);
+	arh = ArchStatMember(GNode_VarArchive(gn), GNode_VarMember(gn), true);
 	if (arh != NULL)
 		gn->mtime = (time_t)strtol(arh->ar_date, NULL, 10);
 	else
@@ -1058,26 +1066,26 @@ Arch_FindLib(GNode *gn, SearchPath *path)
  *	since this is used by 'ar' rules that affect the data contents of the
  *	archive, not by ranlib rules, which affect the TOC.
  */
-Boolean
+bool
 Arch_LibOODate(GNode *gn)
 {
-	Boolean oodate;
+	bool oodate;
 
 	if (gn->type & OP_PHONY) {
-		oodate = TRUE;
+		oodate = true;
 	} else if (!GNode_IsTarget(gn) && Lst_IsEmpty(&gn->children)) {
-		oodate = FALSE;
+		oodate = false;
 	} else if ((!Lst_IsEmpty(&gn->children) && gn->youngestChild == NULL) ||
 		   (gn->mtime > now) ||
 		   (gn->youngestChild != NULL &&
 		    gn->mtime < gn->youngestChild->mtime)) {
-		oodate = TRUE;
+		oodate = true;
 	} else {
 #ifdef RANLIBMAG
 		struct ar_hdr *arh;	/* Header for __.SYMDEF */
 		int modTimeTOC;		/* The table-of-contents' mod time */
 
-		arh = ArchStatMember(gn->path, RANLIBMAG, FALSE);
+		arh = ArchStatMember(gn->path, RANLIBMAG, false);
 
 		if (arh != NULL) {
 			modTimeTOC = (int)strtol(arh->ar_date, NULL, 10);
@@ -1094,10 +1102,10 @@ Arch_LibOODate(GNode *gn)
 			 */
 			if (DEBUG(ARCH) || DEBUG(MAKE))
 				debug_printf("no toc...");
-			oodate = TRUE;
+			oodate = true;
 		}
 #else
-		oodate = FALSE;
+		oodate = false;
 #endif
 	}
 	return oodate;
@@ -1119,7 +1127,7 @@ Arch_End(void)
 #endif
 }
 
-Boolean
+bool
 Arch_IsLib(GNode *gn)
 {
 	static const char armag[] = "!<arch>\n";
@@ -1127,11 +1135,11 @@ Arch_IsLib(GNode *gn)
 	int fd;
 
 	if ((fd = open(gn->path, O_RDONLY)) == -1)
-		return FALSE;
+		return false;
 
 	if (read(fd, buf, sizeof buf) != sizeof buf) {
 		(void)close(fd);
-		return FALSE;
+		return false;
 	}
 
 	(void)close(fd);
diff --git a/contrib/bmake/buf.h b/contrib/bmake/buf.h
index 594e9651dbfb..938820e4745f 100644
--- a/contrib/bmake/buf.h
+++ b/contrib/bmake/buf.h
@@ -1,4 +1,4 @@
-/*	$NetBSD: buf.h,v 1.42 2021/01/30 21:25:10 rillig Exp $	*/
+/*	$NetBSD: buf.h,v 1.43 2021/04/03 11:08:40 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -101,7 +101,7 @@ Buf_AddByte(Buffer *buf, char byte)
 	end[1] = '\0';
 }
 
-MAKE_INLINE Boolean
+MAKE_INLINE bool
 Buf_EndsWith(const Buffer *buf, char ch)
 {
 	return buf->len > 0 && buf->data[buf->len - 1] == ch;
diff --git a/contrib/bmake/compat.c b/contrib/bmake/compat.c
index 59190d8c4354..f8c47397f3df 100644
--- a/contrib/bmake/compat.c
+++ b/contrib/bmake/compat.c
@@ -1,4 +1,4 @@
-/*	$NetBSD: compat.c,v 1.224 2021/02/05 05:15:12 rillig Exp $	*/
+/*	$NetBSD: compat.c,v 1.227 2021/04/27 15:19:25 christos Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -99,7 +99,7 @@
 #include "pathnames.h"
 
 /*	"@(#)compat.c	8.2 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: compat.c,v 1.224 2021/02/05 05:15:12 rillig Exp $");
+MAKE_RCSID("$NetBSD: compat.c,v 1.227 2021/04/27 15:19:25 christos Exp $");
 
 static GNode *curTarg = NULL;
 static pid_t compatChild;
@@ -164,7 +164,7 @@ CompatInterrupt(int signo)
 }
 
 static void
-DebugFailedTarget(const char *cmd, GNode *gn)
+DebugFailedTarget(const char *cmd, const GNode *gn)
 {
 	const char *p = cmd;
 	debug_printf("\n*** Failed target:  %s\n*** Failed command: ",
@@ -184,7 +184,7 @@ DebugFailedTarget(const char *cmd, GNode *gn)
 	debug_printf("\n");
 }
 
-static Boolean
+static bool
 UseShell(const char *cmd MAKE_ATTR_UNUSED)
 {
 #if !defined(MAKE_NATIVE)
@@ -194,7 +194,7 @@ UseShell(const char *cmd MAKE_ATTR_UNUSED)
 	 * behaviour.  Or perhaps the shell has been replaced with something
 	 * that does extra logging, and that should not be bypassed.
 	 */
-	return TRUE;
+	return true;
 #else
 	/*
 	 * Search for meta characters in the command. If there are no meta
@@ -227,22 +227,22 @@ Compat_RunCommand(const char *cmdp, GNode *gn, StringListNode *ln)
 {
 	char *cmdStart;		/* Start of expanded command */
 	char *bp;
-	Boolean silent;		/* Don't print command */
-	Boolean doIt;		/* Execute even if -n */
-	volatile Boolean errCheck; /* Check errors */
+	bool silent;		/* Don't print command */
+	bool doIt;		/* Execute even if -n */
+	volatile bool errCheck; /* Check errors */
 	WAIT_T reason;		/* Reason for child's death */
 	WAIT_T status;		/* Description of child's death */
 	pid_t cpid;		/* Child actually found */
 	pid_t retstat;		/* Result of wait */
 	const char **volatile av; /* Argument vector for thing to exec */
 	char **volatile mav;	/* Copy of the argument vector for freeing */
-	Boolean useShell;	/* TRUE if command should be executed
+	bool useShell;		/* True if command should be executed
 				 * using a shell */
 	const char *volatile cmd = cmdp;
 
 	silent = (gn->type & OP_SILENT) != 0;
 	errCheck = !(gn->type & OP_IGNORE);
-	doIt = FALSE;
+	doIt = false;
 
 	(void)Var_Subst(cmd, gn, VARE_WANTRES, &cmdStart);
 	/* TODO: handle errors */
@@ -281,9 +281,9 @@ Compat_RunCommand(const char *cmdp, GNode *gn, StringListNode *ln)
 		if (*cmd == '@')
 			silent = !DEBUG(LOUD);
 		else if (*cmd == '-')
-			errCheck = FALSE;
+			errCheck = false;
 		else if (*cmd == '+') {
-			doIt = TRUE;
+			doIt = true;
 			if (shellName == NULL)	/* we came here from jobs */
 				Shell_Init();
 		} else
@@ -343,7 +343,7 @@ Compat_RunCommand(const char *cmdp, GNode *gn, StringListNode *ln)
 		 * command into words to form an argument vector we can
 		 * execute.
 		 */
-		Words words = Str_Words(cmd, FALSE);
+		Words words = Str_Words(cmd, false);
 		mav = words.words;
 		bp = words.freeIt;
 		av = (void *)mav;
@@ -392,7 +392,7 @@ Compat_RunCommand(const char *cmdp, GNode *gn, StringListNode *ln)
 	 */
 	while ((retstat = wait(&reason)) != cpid) {
 		if (retstat > 0)
-			JobReapChild(retstat, reason, FALSE); /* not ours? */
+			JobReapChild(retstat, reason, false); /* not ours? */
 		if (retstat == -1 && errno != EINTR) {
 			break;
 		}
@@ -425,7 +425,7 @@ Compat_RunCommand(const char *cmdp, GNode *gn, StringListNode *ln)
 		if (errCheck) {
 #ifdef USE_META
 			if (useMeta) {
-				meta_job_error(NULL, gn, FALSE, status);
+				meta_job_error(NULL, gn, false, status);
 			}
 #endif
 			gn->made = ERROR;
@@ -483,7 +483,7 @@ MakeNodes(GNodeList *gnodes, GNode *pgn)
 	}
 }
 
-static Boolean
+static bool
 MakeUnmade(GNode *gn, GNode *pgn)
 {
 
@@ -493,7 +493,7 @@ MakeUnmade(GNode *gn, GNode *pgn)
 	 * First mark ourselves to be made, then apply whatever transformations
 	 * the suffix module thinks are necessary. Once that's done, we can
 	 * descend and make all our children. If any of them has an error
-	 * but the -k flag was given, our 'make' field will be set to FALSE
+	 * but the -k flag was given, our 'make' field will be set to false
 	 * again. This is our signal to not attempt to do anything but abort
 	 * our parent as well.
 	 */
@@ -508,7 +508,7 @@ MakeUnmade(GNode *gn, GNode *pgn)
 	if (!(gn->flags & REMAKE)) {
 		gn->made = ABORTED;
 		pgn->flags &= ~(unsigned)REMAKE;
-		return FALSE;
+		return false;
 	}
 
 	if (Lst_FindDatum(&gn->implicitParents, pgn) != NULL)
@@ -524,7 +524,7 @@ MakeUnmade(GNode *gn, GNode *pgn)
 	if (!GNode_IsOODate(gn)) {
 		gn->made = UPTODATE;
 		DEBUG0(MAKE, "up-to-date.\n");
-		return FALSE;
+		return false;
 	}
 
 	/*
@@ -539,7 +539,7 @@ MakeUnmade(GNode *gn, GNode *pgn)
 	 * We need to be re-made.
 	 * Ensure that $? (.OODATE) and $> (.ALLSRC) are both set.
 	 */
-	Make_DoAllVar(gn);
+	GNode_SetLocalVars(gn);
 
 	/*
 	 * Alter our type to tell if errors should be ignored or things
@@ -596,7 +596,7 @@ MakeUnmade(GNode *gn, GNode *pgn)
 		PrintOnError(gn, "\nStop.");
 		exit(1);
 	}
-	return TRUE;
+	return true;
 }
 
 static void
diff --git a/contrib/bmake/cond.c b/contrib/bmake/cond.c
index 8f36fda22f12..a8d88d1d6816 100644
--- a/contrib/bmake/cond.c
+++ b/contrib/bmake/cond.c
@@ -1,4 +1,4 @@
-/*	$NetBSD: cond.c,v 1.256 2021/02/05 05:15:12 rillig Exp $	*/
+/*	$NetBSD: cond.c,v 1.267 2021/06/11 14:52:03 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.256 2021/02/05 05:15:12 rillig Exp $");
+MAKE_RCSID("$NetBSD: cond.c,v 1.267 2021/06/11 14:52:03 rillig Exp $");
 
 /*
  * The parsing of conditional expressions is based on this grammar:
@@ -148,11 +148,11 @@ typedef struct CondParser {
 	 * expression has length > 0.  The other '.if' variants delegate
 	 * to evalBare instead.
 	 */
-	Boolean plain;
+	bool plain;
 
 	/* The function to apply on unquoted bare words. */
-	Boolean (*evalBare)(size_t, const char *);
-	Boolean negateEvalBare;
+	bool (*evalBare)(size_t, const char *);
+	bool negateEvalBare;
 
 	const char *p;		/* The remaining condition to parse */
 	Token curr;		/* Single push-back token used in parsing */
@@ -163,10 +163,10 @@ typedef struct CondParser {
 	 * specific one, therefore it makes sense to suppress the standard
 	 * "Malformed conditional" message.
 	 */
-	Boolean printedError;
+	bool printedError;
 } CondParser;
 
-static CondResult CondParser_Or(CondParser *par, Boolean);
+static CondResult CondParser_Or(CondParser *par, bool);
 
 static unsigned int cond_depth = 0;	/* current .if nesting level */
 static unsigned int cond_min_depth = 0;	/* depth at makefile open */
@@ -178,21 +178,21 @@ static const char *opname[] = { "<", "<=", ">", ">=", "==", "!=" };
  * In strict mode, the lhs must be a variable expression or a string literal
  * in quotes. In non-strict mode it may also be an unquoted string literal.
  *
- * TRUE when CondEvalExpression is called from Cond_EvalLine (.if etc)
- * FALSE when CondEvalExpression is called from ApplyModifier_IfElse
+ * True when CondEvalExpression is called from Cond_EvalLine (.if etc).
+ * False when CondEvalExpression is called from ApplyModifier_IfElse
  * since lhs is already expanded, and at that point we cannot tell if
  * it was a variable reference or not.
  */
-static Boolean lhsStrict;
+static bool lhsStrict;
 
-static Boolean
+static bool
 is_token(const char *str, const char *tok, size_t len)
 {
 	return strncmp(str, tok, len) == 0 && !ch_isalpha(str[len]);
 }
 
 static Token
-ToToken(Boolean cond)
+ToToken(bool cond)
 {
 	return cond ? TOK_TRUE : TOK_FALSE;
 }
@@ -228,7 +228,7 @@ CondParser_SkipWhitespace(CondParser *par)
  * Return the length of the argument, or 0 on error.
  */
 static size_t
-ParseFuncArg(CondParser *par, const char **pp, Boolean doEval, const char *func,
+ParseFuncArg(CondParser *par, const char **pp, bool doEval, const char *func,
 	     char **out_arg)
 {
 	const char *p = *pp;
@@ -264,11 +264,11 @@ ParseFuncArg(CondParser *par, const char **pp, Boolean doEval, const char *func,
 			 * so we don't need to do it. Nor do we return an
 			 * error, though perhaps we should.
 			 */
-			VarEvalFlags eflags = doEval
-			    ? VARE_WANTRES | VARE_UNDEFERR
-			    : VARE_NONE;
+			VarEvalMode emode = doEval
+			    ? VARE_UNDEFERR
+			    : VARE_PARSE_ONLY;
 			FStr nestedVal;
-			(void)Var_Parse(&p, SCOPE_CMDLINE, eflags, &nestedVal);
+			(void)Var_Parse(&p, SCOPE_CMDLINE, emode, &nestedVal);
 			/* TODO: handle errors */
 			Buf_AddStr(&argBuf, nestedVal.str);
 			FStr_Done(&nestedVal);
@@ -290,7 +290,7 @@ ParseFuncArg(CondParser *par, const char **pp, Boolean doEval, const char *func,
 	if (func != NULL && *p++ != ')') {
 		Parse_Error(PARSE_FATAL,
 		    "Missing closing parenthesis for %s()", func);
-		par->printedError = TRUE;
+		par->printedError = true;
 		return 0;
 	}
 
@@ -300,34 +300,34 @@ ParseFuncArg(CondParser *par, const char **pp, Boolean doEval, const char *func,
 
 /* Test whether the given variable is defined. */
 /*ARGSUSED*/
-static Boolean
+static bool
 FuncDefined(size_t argLen MAKE_ATTR_UNUSED, const char *arg)
 {
 	FStr value = Var_Value(SCOPE_CMDLINE, arg);
-	Boolean result = value.str != NULL;
+	bool result = value.str != NULL;
 	FStr_Done(&value);
*** 17372 LINES SKIPPED ***